Godot 城市模拟 - 002 根据地面四个点的坐标和高度,动态创建立方体节点

在Godot中根据地面点和高度创建立方体

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

效果预览

实现原理

1. 立方体顶点计算

立方体有8个顶点,分为两组:

  • 底部4个顶点:直接使用输入的四个地面点
  • 顶部4个顶点:地面点加上高度向量(Y轴方向)

2. 立方体面定义

立方体由6个四边形面组成,每个面可以分解为2个三角形。我们需要定义每个面由哪些顶点组成,并确保顶点顺序正确(逆时针方向以保证法线朝外)。

3. 网格生成

使用Godot的SurfaceTool类逐步构建网格:

  1. 开始网格创建
  2. 添加顶点数据
  3. 生成网格数据
  4. 创建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工作流程

  1. begin():开始网格创建,指定图元类型
  2. add_vertex():添加顶点数据
  3. commit():生成最终网格

4. 材质应用

ini 复制代码
var material = StandardMaterial3D.new()
material.albedo_color = Color(0.8, 0.2, 0.2)
mesh_instance.material_override = material

实际应用场景

这种方法特别适用于:

  1. 根据地形生成建筑物
  2. 创建自定义形状的3D物体
  3. 程序化生成游戏内容
  4. 根据测量数据可视化3D结构
相关推荐
郭逍遥7 天前
[Godot] 通过AABB包围盒和射线法检测碰撞
算法·游戏引擎·godot
风痕天际7 天前
Godot扫雷游戏制作记录4——计算周围地雷数并显示
游戏·游戏引擎·godot
风痕天际7 天前
Godot扫雷游戏制作记录3——随机埋雷
游戏·游戏引擎·godot
风痕天际12 天前
Godot扫雷游戏制作记录2——鼠标交互
游戏·游戏引擎·godot
风痕天际15 天前
Godot扫雷游戏制作记录1——基础场景搭建
游戏·游戏引擎·godot·gdscript·教程
dlpay16 天前
使用blender搭建模型并导入godot游戏引擎
游戏引擎·godot·blender
会飞的一棵树1 个月前
Godot UI布局指南
godot
浪客川1 个月前
1972 GODOT 入门案例
android·java·godot
习惯就好zz1 个月前
从奶牛NPC到完整场景构建
godot·cow·house·npc·tilemaplayer·bed
郝学胜-神的一滴1 个月前
QtOpenGL多线程渲染方案深度解析
c++·qt·unity·游戏引擎·godot·图形渲染·unreal engine