在Godot中根据地面点和高度创建立方体
在3D游戏开发中,经常需要根据已知的地面点位置和高度创建三维物体。本文将详细介绍如何在Godot引擎中,根据四个地面点和一个高度值创建立方体。
效果预览

实现原理
1. 立方体顶点计算
立方体有8个顶点,分为两组:
- 底部4个顶点:直接使用输入的四个地面点
- 顶部4个顶点:地面点加上高度向量(Y轴方向)
2. 立方体面定义
立方体由6个四边形面组成,每个面可以分解为2个三角形。我们需要定义每个面由哪些顶点组成,并确保顶点顺序正确(逆时针方向以保证法线朝外)。
3. 网格生成
使用Godot的SurfaceTool类逐步构建网格:
- 开始网格创建
- 添加顶点数据
- 生成网格数据
- 创建MeshInstance3D节点
完整代码实现
gdscript
extends Node3D
func _ready() -> void:
# Called when the node enters the scene tree for the first time.
create_cube_from_base_and_height()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
# 根据地面四个点和高度创建立方体
func create_cube_from_base_and_height() -> void:
# 示例:地面四个点的坐标(可以替换为实际数据)
var ground_points = [
Vector3(-1, 0, -1), # 左下角
Vector3(1, 0, -1), # 右下角
Vector3(1, 0, 1), # 右上角
Vector3(-1, 0, 1) # 左上角
]
# 立方体高度
var height = 1.5
# 计算立方体的8个顶点
var cube_points = []
# 底部四个点(地面点)
for i in range(4):
cube_points.append(ground_points[i])
# 顶部四个点(地面点加上高度)
for i in range(4):
var top_point = ground_points[i] + Vector3(0, height, 0)
cube_points.append(top_point)
# 定义6个面的顶点索引(每个面4个顶点)
var faces = [
[4, 5, 6, 7], # 前(顶部前表面)
[0, 3, 2, 1], # 后(底部后表面)
[7, 6, 2, 3], # 上(顶部表面)
[4, 0, 1, 5], # 下(底部表面)
[4, 7, 3, 0], # 左(左侧表面)
[5, 1, 2, 6] # 右(右侧表面)
]
# 使用SurfaceTool创建立方体
var surface_tool = SurfaceTool.new()
surface_tool.begin(Mesh.PRIMITIVE_TRIANGLES)
# 为每个面添加顶点
for face in faces:
# 第一个三角形
surface_tool.add_vertex(cube_points[face[0]])
surface_tool.add_vertex(cube_points[face[1]])
surface_tool.add_vertex(cube_points[face[2]])
# 第二个三角形
surface_tool.add_vertex(cube_points[face[0]])
surface_tool.add_vertex(cube_points[face[2]])
surface_tool.add_vertex(cube_points[face[3]])
# 生成网格
var array_mesh = surface_tool.commit()
# 创建节点和材质
var mesh_instance = MeshInstance3D.new()
mesh_instance.mesh = array_mesh
var material = StandardMaterial3D.new()
material.albedo_color = Color(0.8, 0.2, 0.2)
mesh_instance.material_override = material
add_child(mesh_instance)
mesh_instance.position = Vector3(2,0,1)
print("基于地面点和高度创建立方体完成!")
关键点解析
1. 顶点计算
scss
# 顶部四个点(地面点加上高度)
for i in range(4):
var top_point = ground_points[i] + Vector3(0, height, 0)
cube_points.append(top_point)
2. 面定义与三角形划分
每个四边形面分解为两个三角形:
less
面顶点索引: [A, B, C, D]
三角形1: A → B → C
三角形2: A → C → D
3. SurfaceTool工作流程
begin()
:开始网格创建,指定图元类型add_vertex()
:添加顶点数据commit()
:生成最终网格
4. 材质应用
ini
var material = StandardMaterial3D.new()
material.albedo_color = Color(0.8, 0.2, 0.2)
mesh_instance.material_override = material
实际应用场景
这种方法特别适用于:
- 根据地形生成建筑物
- 创建自定义形状的3D物体
- 程序化生成游戏内容
- 根据测量数据可视化3D结构