Godot 城市模拟 – 006 添加工具函数和项目配置
本文最后更新于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)


扫码关注,及时关注技术动态


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇