首先是官方文档的地址,里面提到了一些基础内容。
先吐槽下。
这是ArrayMesh的使用方式(C#):
var arrMesh = new ArrayMesh().AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, surfaceArray);
new MeshInstance3D().Mesh = arrMesh;
如上代码中的surfaceArray这个变量其实是个元组!!!就像是 (int[], Vector3[]) 这种。
但在C#中只能使用Godot空间下的数组容器,被迫要写动态类型了。
言归正传。
我用的是Mesh.PrimitiveType.Triangles模式,只需要3~4个元素(surfaceArray中的元素)。
分别是(Mesh.ArrayType枚举):Vertex、Normal、TexUV、Index。
Vertex就顶点。
Normal是顶点法线(不是面法线)。
TexUV就uv。
Index可用可不用。这个比较特殊,类似于代理器,效果就是将其他数组(Vertex、Normal、TexUV)映射成另一个顺序布局的数组。Vertex、Normal、TexUV不论Index使用与否,都是相互对应的。
先说下Mesh.ArrayType.Index。
这东西如果去掉,在Mesh.PrimitiveType.Triangles模式下,数组(Vertex、Normal、TexUV)中每三个元素成一个三角面,否则根据Index中每三个索引指针成一组三角面。
直观点用伪代码来解释:
不用Index时的 Vertex = {a, b, c, b2, c2, d} abc一个三角面,b2c2d一个三角面;
等同于使用Index时的 Vertex = {a, b, c, d}; Index = {0, 1, 2, 1, 2, 3} 。
UV只要懂点3D建模就能明白(讲解也很容易找),不解释了。
Vertex顶点就一句话,顶点逆时针相接组成的面为正面。
就比如GD中Y轴为0的三个顺序顶点 (X0, Z0) (X1, Z0) (X1, Z1),所组成的面只在Y+方向可见,Y-方向是反面、不可见。
Normal法线分两种需求,平滑着色和平直着色。
平直着色只需要把各点对应三角面的面法线算出来,直接套用面法线就行了。(平直着色或者需要在不同面应用两种着色模式的话,应该就没法用Mesh.ArrayType.Index了——水平有限不确定是否有其他方式调整光照效果)
平滑着色则需要多一步,算出各面法线之后,再把每个点相接的所有面的面法线平均下再用。(平滑着色用Mesh.ArrayType.Index可以省点空间,好像还可以优化性能)
C#中单个面法线算法(逆时针三个Vector3顶点分别为abc):(a - c).Cross(a - b).Normalized();
(indienova的日志不支持md好烦啊,被迫退化成鼠标点点点了。)
暂无关于此日志的评论。