3. 地形与环境系统
2026/4/14大约 2 分钟
地形与环境系统
地形就是游戏里的"地面"——山丘、平原、河流。环境包括天空、云彩、天气、草地、环境音。这些元素组合在一起,让玩家感觉自己真的站在一个世界里,而不是一块平铺的地板上。
本章你将学到
- 如何用高度图创建起伏的 3D 地形
- 如何在地形上渲染大面积草地
- 水体系统的基本实现(水面反射、波纹)
- 天空盒的配置与日夜切换
- 环境音系统(鸟叫、风声、水声随位置变化)
高度图地形:用"灰度图"生成山丘
高度图的原理很简单:一张黑白图片,白色代表高、黑色代表低。Godot 读入这张图片后,把每个像素的明暗转换成地面的高低,就能生成连绵的山丘。你可以用任何图片编辑软件画高度图,也可以用程序生成。
代码示例:根据高度图生成地形网格
C#
using Godot;
public partial class TerrainGenerator : MeshInstance3D
{
[Export] public Image HeightMap { get; set; }
[Export] public float HeightScale { get; set; } = 20.0f;
[Export] public int Resolution { get; set; } = 64;
public override void _Ready()
{
var surfaceTool = new SurfaceTool();
surfaceTool.Begin(Mesh.PrimitiveType.Triangles);
for (int z = 0; z < Resolution; z++)
{
for (int x = 0; x < Resolution; x++)
{
// 归一化坐标
float u = (float)x / Resolution;
float v = (float)z / Resolution;
// 从高度图读取高度值
float height = HeightMap.GetPixel(x, z).R * HeightScale;
// 添加顶点
surfaceTool.SetUV(new Vector2(u, v));
surfaceTool.AddVertex(new Vector3(x - Resolution / 2, height, z - Resolution / 2));
}
}
surfaceTool.GenerateNormals();
Mesh = surfaceTool.Commit();
}
}GDScript
extends MeshInstance3D
@export var height_map: Image
@export var height_scale: float = 20.0
@export var resolution: int = 64
func _ready():
var surface_tool = SurfaceTool.new()
surface_tool.begin(Mesh.PRIMITIVE_TRIANGLES)
for z in range(resolution):
for x in range(resolution):
# 归一化坐标
var u = float(x) / resolution
var v = float(z) / resolution
# 从高度图读取高度值
var height = height_map.get_pixel(x, z).r * height_scale
# 添加顶点
surface_tool.set_uv(Vector2(u, v))
surface_tool.add_vertex(Vector3(x - resolution / 2, height, z - resolution / 2))
surface_tool.generate_normals()
mesh = surface_tool.commit()水体、天空与环境音
- 水体:用平面(MeshInstance3D)加上透明材质和 Shader 模拟波纹
- 天空盒:Godot 内置了
Sky资源,可以设置渐变色天空或全景图天空 - 环境音:用
AudioStreamPlayer3D节点,声音会随玩家距离自动衰减(走近听到水声,走远就安静了)
相关章节
- 基础篇 - 光照与阴影:地形的光照配合
- 基础篇 - 音频效果:3D 环境音基础
- 粒子与视觉特效:用粒子做雨、雪、雾等天气效果
- 程序化生成:用算法随机生成地形
