Godot 城市模拟 – 002 根据地面四个点的坐标和高度,动态创建立方体节点
本文最后更新于17 天前

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

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

效果预览

file

实现原理

1. 立方体顶点计算

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

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

2. 立方体面定义

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

3. 网格生成

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

  1. 开始网格创建
  2. 添加顶点数据
  3. 生成网格数据
  4. 创建MeshInstance3D节点

完整代码实现

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. 顶点计算

    # 顶部四个点(地面点加上高度)
    for i in range(4):
        var top_point = ground_points[i] + Vector3(0, height, 0)
        cube_points.append(top_point)

2. 面定义与三角形划分

每个四边形面分解为两个三角形:

面顶点索引: [A, B, C, D]

三角形1: A → B → C
三角形2: A → C → D

3. SurfaceTool工作流程

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

4. 材质应用

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结构


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


暂无评论

发送评论 编辑评论


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