Godot基于ArrayMesh的脚本生成网格
脚本MeshArrayMesh一、渲染一个三角形1.初始化ArrayMesh所需的基本信息二、使用步骤1.引入库总结ArrayMesh以上是官方文档,大致在说可以用ArrayMesh来生成渲染网格,还有例子代码,如果嫌看官方文档麻烦,那就继续往下看,我会说明如何简单使用ArrayMesh来生成渲染网格一、渲染一个三角形渲染流程和直接用开源图形库(例如:OpenGL)渲染流程相似:1.初始化Arra
脚本Mesh
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
更多推荐
所有评论(0)