本文最后更新于14 天前
项目工具函数
创建 functions.gd 文件
创建 res://scripts/functions.gd
脚本
完善脚本文件
把 根据任意多边形底面和高度创建棱柱体
移动到此文件中,把方法改为 static
,后续一些公共逻辑我们都放在这个文件中。
extends Node
# 根据任意多边形底面和高度创建棱柱体
static func create_prism_from_base_and_height(base_points: Array, height: float, color: Color) -> MeshInstance3D:
# 验证输入
if base_points.size() < 3:
print("错误:至少需要3个点来构成多边形")
return
var point_count = base_points.size()
# 计算棱柱体的所有顶点
var prism_points = []
# 底部点(底面多边形)
for i in range(point_count):
prism_points.append(base_points[i])
# 顶部点(底面多边形加上高度)
for i in range(point_count):
var top_point = base_points[i] + Vector3(0, height, 0)
prism_points.append(top_point)
# 使用SurfaceTool创建棱柱体
var surface_tool = SurfaceTool.new()
surface_tool.begin(Mesh.PRIMITIVE_TRIANGLES)
# 创建底面(多边形三角剖分 - 使用扇形三角剖分)
var bottom_center = Vector3.ZERO
for point in base_points:
bottom_center += point
bottom_center /= point_count
bottom_center.y = 0 # 确保在底面平面上
for i in range(point_count):
var next_i = (i + 1) % point_count
surface_tool.add_vertex(bottom_center) # 中心点
surface_tool.add_vertex(prism_points[i]) # 当前点
surface_tool.add_vertex(prism_points[next_i]) # 下一个点
# 创建顶面(多边形三角剖分 - 使用扇形三角剖分)
var top_start = point_count
var top_center = bottom_center + Vector3(0, height, 0)
for i in range(point_count):
var next_i = (i + 1) % point_count
surface_tool.add_vertex(top_center) # 顶部中心点
surface_tool.add_vertex(prism_points[top_start + i]) # 当前顶部点
surface_tool.add_vertex(prism_points[top_start + next_i]) # 下一个顶部点
# 创建侧面(连接底部和顶部的四边形面)
for i in range(point_count):
var next_i = (i + 1) % point_count # 下一个点的索引(循环)
# 侧面四边形分解为两个三角形
# 第一个三角形(逆时针顺序)
surface_tool.add_vertex(prism_points[i]) # 底部当前点
surface_tool.add_vertex(prism_points[top_start + i]) # 顶部当前点
surface_tool.add_vertex(prism_points[next_i]) # 底部下一个点
# 第二个三角形(逆时针顺序)
surface_tool.add_vertex(prism_points[next_i]) # 底部下一个点
surface_tool.add_vertex(prism_points[top_start + i]) # 顶部当前点
surface_tool.add_vertex(prism_points[top_start + next_i]) # 顶部下一个点
surface_tool.generate_normals()
# 生成网格
var array_mesh = surface_tool.commit()
# 创建节点和材质
var prism_mesh_instance = MeshInstance3D.new()
prism_mesh_instance.mesh = array_mesh
var material = StandardMaterial3D.new()
material.albedo_color = color # 蓝色
material.cull_mode = BaseMaterial3D.CULL_DISABLED # 禁用背面剔除
prism_mesh_instance.material_override = material
print("基于不规则多边形底面创建棱柱体完成!点数:", point_count)
return prism_mesh_instance
项目配置文件
创建config.gd文件
创建 res://scripts/config.gd
脚本
添加配置参数
extends Node
static var ground_height = 0.1 # 地面高度
static var ground_color = Color(0.2,0.6,0.3)
工具方法和配置参数使用
extends Node3D
var prism_mesh_instance: MeshInstance3D
var functions = preload("res://scripts/functions.gd")
var config = preload("res://scripts/config.gd")
func _ready() -> void:
# Called when the node enters the scene tree for the first time.
create_drone()
create_background()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func create_background():
# 调用函数创建棱柱体
var base_points = [
Vector3(100, 0, 100), # 点1
Vector3(-100, 0, 100), # 点2
Vector3(-100, 0, -100), # 点3
Vector3(100, 0, -100), # 点4
]
prism_mesh_instance = functions.create_prism_from_base_and_height(base_points, config.ground_height, config.ground_color)
add_child(prism_mesh_instance)
func create_drone():
var drone_scene = preload("res://scenes/drone.tscn")
var drone = drone_scene.instantiate()
add_child(drone)
drone.position = Vector3(0,5,0)