This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Defold 的核心是一个3D引擎。即使您只使用2D材质,所有渲染也都是以3D方式完成的,但会正交投影到屏幕上。Defold允许您通过在集合中运行时添加和创建3D网格来利用完整的3D内容。您可以构建纯3D的游戏,只使用3D资源,或者您可以根据需要混合3D和2D内容。
网格组件的创建方式与任何其他游戏对象组件一样。您可以通过两种方式完成:
创建网格后,您需要指定多个属性:
除了 Id、Position 和 Rotation 属性外,还存在以下组件特定属性:
有了网格组件后,您可以使用常规的场景编辑器工具自由编辑和操作组件和/或封装的游戏对象,按照您的喜好移动、旋转和缩放网格。
您可以使用Defold缓冲区在运行时操作网格。下面是一个使用三角形带创建立方体的示例:
-- 立方体
local vertices = {
0, 0, 0,
0, 1, 0,
1, 0, 0,
1, 1, 0,
1, 1, 1,
0, 1, 0,
0, 1, 1,
0, 0, 1,
1, 1, 1,
1, 0, 1,
1, 0, 0,
0, 0, 1,
0, 0, 0,
0, 1, 0
}
-- 创建带有位置流的缓冲区
local buf = buffer.create(#vertices / 3, {
{ name = hash("position"), type=buffer.VALUE_TYPE_FLOAT32, count = 3 }
})
-- 获取位置流并写入顶点
local positions = buffer.get_stream(buf, "position")
for i, value in ipairs(vertices) do
positions[i] = vertices[i]
end
-- 将带有顶点的缓冲区设置到网格上
local res = go.get("#mesh", "vertices")
resource.set_buffer(res, buf)
有关如何使用网格组件的更多信息,包括示例项目和代码片段,请参阅论坛公告帖子。
网格组件由于其动态特性以及无法确定位置数据的编码方式,因此不会自动剔除。为了剔除网格,需要使用6个浮点数将网格的轴对齐边界框设置为缓冲区上的元数据(AABB最小/最大):
buffer.set_metadata(buf, hash("AABB"), { 0, 0, 0, 1, 1, 1 }, buffer.VALUE_TYPE_FLOAT32)
默认的 mesh 材质具有以下常量,可以使用 go.set() 或 go.animate() 进行更改(详情请参考材质手册)。示例:
go.set("#mesh", "tint", vmath.vector4(1,0,0,1))
go.animate("#mesh", "tint", go.PLAYBACK_LOOP_PINGPONG, vmath.vector4(1,0,0,1), go.EASING_LINEAR, 2)
tint
vector4
)。vector4用于表示色调,其中x、y、z和w分别对应红色、绿色、蓝色和alpha色调。如果网格材质的顶点空间设置为局部空间,数据将按原样提供给您的着色器,您将必须在GPU上像往常一样变换顶点/法线。
如果网格材质的顶点空间设置为世界空间,您必须提供默认的”位置”和”法线”流,或者您可以在编辑网格时从下拉菜单中选择它。这样引擎就可以将数据转换到世界空间,以便与其他对象进行批处理。
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB