ArrayMesh

官方文档
官方文档
以上是官方文档,大致在说可以用ArrayMesh来生成渲染网格,还有例子代码,如果嫌看官方文档麻烦,那就继续往下看,我会说明如何简单使用ArrayMesh来生成渲染网格


一、渲染一个三角形

在这里插入图片描述
渲染流程和直接用开源图形库(例如:OpenGL)渲染流程相似:
1.初始化ArrayMesh所需的基本信息(顶点坐标数组,UV坐标数组等等)
2.调用引擎库函数,绑定所需信息
3.将ArrayMesh赋值给当前物体的Mesh

首先需要创建一个MeshInstance节点
在这里插入图片描述
在这里插入图片描述
其中Texture是用来绑定贴图,Normal Ma…是用来绑定法线贴图

1.初始化ArrayMesh所需的基本信息

官方文档:官方文档
其中顶点数组是最基本的

2.绑定所需信息

如官方文档所示,创建一个数组,需要包含其中的基本信息,就用枚举值作为数组下标

3.将ArrayMesh赋值给当前物体的Mesh

代码如下:

#渲染一个三角形,无贴图,无法线贴图
extends MeshInstance2D

export(int) var size 

func _ready():
	# 初始化ArrayMesh所需部分信息
	## 顶点坐标数组
	var vertices = Array()
	vertices.push_back(Vector2(0, 1*size))
	vertices.push_back(Vector2(1*size, 0))
	vertices.push_back(Vector2(0, 0))
	## 顶点UV坐标数组(可以不要)
	var uvs = PoolVector2Array()
	uvs.push_back(Vector2(0, 1))
	uvs.push_back(Vector2(1, 0))
	uvs.push_back(Vector2(0, 0))
	## 顶点颜色数组
	var colors = PoolColorArray()
	colors.push_back(Color(1.0,0.0,0.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(0.0,0.0,1.0,1.0))
	
	# 初始化ArrayMesh.
	var arr_mesh = ArrayMesh.new()
	var arrays = []
	arrays.resize(ArrayMesh.ARRAY_MAX)#定义数组大小
	arrays[ArrayMesh.ARRAY_VERTEX] = vertices#顶点坐标集合赋值
	arrays[ArrayMesh.ARRAY_COLOR] = colors#顶点颜色集合赋值
	arrays[ArrayMesh.ARRAY_TEX_UV] = uvs#顶点UV坐标集合赋值
	
	# 生成对应ArrayMesh,并赋值给当前对象的mesh
	arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
	mesh = arr_mesh
	pass 

arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)中的Mesh.PRIMITIVE_TRIANGLES是设置顶点渲染模式,当前模式是以三个顶点渲染一个三角形,因此顶点必须是3的倍数,其他模式在后面展示

二、渲染带贴图的正方形

在这里插入图片描述

代码如下:

#渲染两个三角形,并且拼凑成一个正方形,godot贴图,无法线贴图
extends MeshInstance2D

export(int) var size 

func _ready():
	# 初始化ArrayMesh所需部分信息
	## 顶点坐标数组
	var vertices = Array()
	vertices.push_back(Vector2(0, 1*size))
	vertices.push_back(Vector2(1*size, 0))
	vertices.push_back(Vector2(0, 0))
	vertices.push_back(Vector2(0, 1*size))
	vertices.push_back(Vector2(1*size, 0))
	vertices.push_back(Vector2(1*size, 1*size))
	## 顶点UV坐标数组
	var uvs = PoolVector2Array()
	uvs.push_back(Vector2(0, 1))
	uvs.push_back(Vector2(1, 0))
	uvs.push_back(Vector2(0, 0))
	uvs.push_back(Vector2(0, 1))
	uvs.push_back(Vector2(1, 0))
	uvs.push_back(Vector2(1, 1))
	## 顶点颜色数组
	var colors = PoolColorArray()
	colors.push_back(Color(1.0,0.0,0.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(0.0,0.0,1.0,1.0))
	colors.push_back(Color(1.0,0.0,0.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(1.0,1.0,1.0,1.0))
	
	# 初始化ArrayMesh.
	var arr_mesh = ArrayMesh.new()
	var arrays = []
	arrays.resize(ArrayMesh.ARRAY_MAX)#定义数组大小
	arrays[ArrayMesh.ARRAY_VERTEX] = vertices#顶点坐标集合赋值
	arrays[ArrayMesh.ARRAY_COLOR] = colors#顶点颜色集合赋值
	arrays[ArrayMesh.ARRAY_TEX_UV] = uvs#顶点UV坐标集合赋值
	
	# 生成对应ArrayMesh,并赋值给当前对象的mesh
	arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
	mesh = arr_mesh
	pass 

三、带法线贴图渲染

在这里插入图片描述
代码如下:

#渲染两个三角形,并且拼凑成一个正方形,godot贴图,有法线贴图
extends MeshInstance2D

export(int) var size 

func _ready():
	# 初始化ArrayMesh所需部分信息
	## 顶点坐标数组
	var vertices = Array()
	vertices.push_back(Vector2(0, 1*size))
	vertices.push_back(Vector2(1*size, 0))
	vertices.push_back(Vector2(0, 0))
	vertices.push_back(Vector2(0, 1*size))
	vertices.push_back(Vector2(1*size, 0))
	vertices.push_back(Vector2(1*size, 1*size))
	## 顶点UV坐标数组
	var uvs = PoolVector2Array()
	uvs.push_back(Vector2(0, 1))
	uvs.push_back(Vector2(1, 0))
	uvs.push_back(Vector2(0, 0))
	uvs.push_back(Vector2(0, 1))
	uvs.push_back(Vector2(1, 0))
	uvs.push_back(Vector2(1, 1))
	## 顶点法线UV坐标数组
	var uv2s = PoolVector2Array()
	uv2s.push_back(Vector2(0, 1))
	uv2s.push_back(Vector2(1, 0))
	uv2s.push_back(Vector2(0, 0))
	uv2s.push_back(Vector2(0, 1))
	uv2s.push_back(Vector2(1, 0))
	uv2s.push_back(Vector2(1, 1))
	## 顶点颜色数组
	var colors = PoolColorArray()
	colors.push_back(Color(1.0,0.0,0.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(0.0,0.0,1.0,1.0))
	colors.push_back(Color(1.0,0.0,0.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(1.0,1.0,1.0,1.0))
	
	# 初始化ArrayMesh.
	var arr_mesh = ArrayMesh.new()
	var arrays = []
	arrays.resize(ArrayMesh.ARRAY_MAX)#定义数组大小
	arrays[ArrayMesh.ARRAY_VERTEX] = vertices#顶点坐标集合赋值
	arrays[ArrayMesh.ARRAY_COLOR] = colors#顶点颜色集合赋值
	arrays[ArrayMesh.ARRAY_TEX_UV] = uvs#顶点UV坐标集合赋值
	arrays[ArrayMesh.ARRAY_TEX_UV2] = uv2s#顶点法线UV坐标集合赋值
	
	# 生成对应ArrayMesh,并赋值给当前对象的mesh
	arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
	mesh = arr_mesh
	pass 

四、TRIANGLE_STRIP模式(顺序点模式)

在这里插入图片描述
在这里插入图片描述
渲染的三角形按照顺序渲染:0-1-2, 1-2-3, 2-3-4
代码如下:

#渲染多个三角形
extends MeshInstance2D

export(int) var size 

func _ready():
	# 初始化ArrayMesh所需部分信息
	## 顶点坐标数组
	var vertices = Array()
	vertices.push_back(Vector2(-0.5*size, 0))
	vertices.push_back(Vector2(0.5*size, 0))
	for i in range(1,5):#遍历生成上部顶点(4个点)
		if i % 2 == 0:
			vertices.push_back(Vector2(1*(0.5*size+i*size), -i*size))
		else:
			vertices.push_back(Vector2(-1*(0.5*size+i*size), -i*size))
	## 顶点颜色数组
	var colors = PoolColorArray()
	colors.push_back(Color(1.0,0.0,0.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(0.0,0.0,1.0,1.0))
	colors.push_back(Color(0.0,0.0,0.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(1.0,0.0,0.0,1.0))
	
	
	# 初始化ArrayMesh.
	var arr_mesh = ArrayMesh.new()
	var arrays = []
	arrays.resize(ArrayMesh.ARRAY_MAX)#定义数组大小
	arrays[ArrayMesh.ARRAY_VERTEX] = vertices#顶点坐标集合赋值
	arrays[ArrayMesh.ARRAY_COLOR] = colors#顶点颜色集合赋值
	
	# 生成对应ArrayMesh,并赋值给当前对象的mesh
	arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLE_STRIP, arrays)
	mesh = arr_mesh
	pass 

五、TRIANGLE_FUN模式(扇形模式)

在这里插入图片描述

渲染的三角形按照顺序渲染:0-1-2, 0-2-3, 0-3-4…
代码如下:

#渲染一个爱心
extends MeshInstance2D

export(int) var size 

func _ready():
	# 初始化ArrayMesh所需部分信息
	## 顶点坐标数组
	var vertices = Array()
	vertices.push_back(Vector2(0, 0))
	vertices.push_back(Vector2(0, -1*size))
	vertices.push_back(Vector2(1*size, -1.5*size))
	vertices.push_back(Vector2(2*size, -0.75*size))
	vertices.push_back(Vector2(1.75*size, 0.25*size))
	vertices.push_back(Vector2(1*size, 1.25*size))
	vertices.push_back(Vector2(0*size, 2*size))
	vertices.push_back(Vector2(-1*size, 1.25*size))
	vertices.push_back(Vector2(-1.75*size, 0.25*size))
	vertices.push_back(Vector2(-2*size, -0.75*size))
	vertices.push_back(Vector2(-1*size, -1.5*size))
	vertices.push_back(Vector2(0, -1*size))
	## 顶点颜色数组
	var colors = PoolColorArray()
	colors.push_back(Color(1.0,1.0,1.0,1.0))
	colors.push_back(Color(1.0,0.0,0.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(0.0,0.0,1.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(1.0,0.0,0.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(0.0,0.0,1.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(1.0,0.0,0.0,1.0))
	colors.push_back(Color(0.0,1.0,0.0,1.0))
	colors.push_back(Color(0.0,0.0,1.0,1.0))
	
	
	# 初始化ArrayMesh.
	var arr_mesh = ArrayMesh.new()
	var arrays = []
	arrays.resize(ArrayMesh.ARRAY_MAX)#定义数组大小
	arrays[ArrayMesh.ARRAY_VERTEX] = vertices#顶点坐标集合赋值
	arrays[ArrayMesh.ARRAY_COLOR] = colors#顶点颜色集合赋值
	
	# 生成对应ArrayMesh,并赋值给当前对象的mesh
	arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLE_FAN, arrays)
	mesh = arr_mesh
	pass 

六、其他渲染模式

在这里插入图片描述

在这就不一一展示了

总结

多看文档!
多看文档!
多看文档!
本人是小白,看懂了文档,不断测试并逐步掌握
在这里插入图片描述

项目源码链接:https://github.com/gsyq/gsyqGodotGame/tree/mesh

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐