njin
Engine 2D gọn nhẹ để tự tay làm game theo ý mình. Vibe coding cũng ổn luôn
Loading...
Searching...
No Matches
njin::terrain3d_desc Struct Tham chiếu

Cách dựng một địa hình bằng terrain3d_create(). Tiếp...

#include <njin_world3d.h>

Các thuộc tính Public

vec3 origin {0.0f, 0.0f, 0.0f}
 Góc x nhỏ nhất, z nhỏ nhất; y cộng vào mọi độ cao.
f32 size = 256.0f
 Cạnh hình vuông, mét.
i32 resolution = 257
 Số mẫu độ cao mỗi cạnh (ít nhất 3). Khoảng cách hai mẫu là size / (resolution - 1).
const f32 * heights = nullptr
 Độ cao từng mẫu, mét (cộng origin.y), resolution * resolution số theo hàng (hàng z, rồi cột x).
const char * heightmap = nullptr
 Ảnh độ cao: ảnh xám (kênh đỏ, 0 đến 1) hoặc file .r16/.raw (16 bit, vuông, little-endian).
noise_desc noise {.seed = 1, .frequency = 0.004f, .fractal = fractal_fbm, .octaves = 5}
 Nhiễu sinh độ cao khi không có hai nguồn trên, tính theo mét của thế giới (frequency là số gò mỗi mét).
f32 height_scale = 40.0f
 Giá trị 1 của ảnh hay nhiễu thành bao nhiêu mét.
i32 smooth = 0
 Số lượt làm mượt độ cao (trung bình 3 x 3) sau khi đọc.
terrain3d_layer layers [terrain3d_layer_max] {}
 Các lớp bề mặt.
i32 layer_count = 1
 Số lớp dùng, 1 đến njin::terrain3d_layer_max.
bool auto_splat = true
 Tự tính lớp nào phủ chỗ nào theo quy tắc của mỗi lớp.
const char * splatmap = nullptr
 Ảnh trọng số các lớp khi tắt auto_splat: kênh đỏ, lục, lam, alpha là lớp 0 đến 3.
i32 chunk_quads = 32
 Số ô mỗi cạnh của một mảnh: 8, 16, 32, 64 hoặc 128.
f32 lod_distance = 60.0f
 Mảnh gần hơn khoảng này (mét) vẽ đủ chi tiết.
i32 lod_levels = 4
 Số mức chi tiết, 1 đến 6.
f32 specular = 0.05f
 Độ bóng của mặt đất (ướt thì tăng thêm, xem njin::weather3d).
f32 shininess = 16.0f
 Độ nhọn điểm sáng bóng.
bool cast_shadows = true
 Đổ bóng (đồi che nắng). Luôn nhận bóng.
bool collision = true
 Tạo body va chạm (height field của Jolt) cho nhân vật, xe và vật.
f32 friction = 0.8f
 Ma sát của body va chạm.
u64 user = 0
 Giá trị body3d_user() của body va chạm.

Mô tả chi tiết

Cách dựng một địa hình bằng terrain3d_create().

Địa hình là một lưới độ cao vuông resolution x resolution mẫu, phủ một hình vuông cạnh size mét có góc (x nhỏ nhất, z nhỏ nhất) ở origin. Độ cao lấy từ heights, hoặc nếu không có thì từ heightmap, hoặc nếu không có nữa thì từ noise.

Engine chia lưới thành các mảnh chunk_quads x chunk_quads ô, bỏ mảnh ngoài tầm nhìn, và vẽ mảnh ở xa với ít chi tiết hơn (mỗi lần xa gấp đôi lod_distance thì bớt một nửa số ô mỗi cạnh). Mép mảnh có "váy" thả xuống nên hai mảnh khác mức chi tiết không hở khe.

Thông tin về Member Data

◆ heights

const f32* njin::terrain3d_desc::heights = nullptr

Độ cao từng mẫu, mét (cộng origin.y), resolution * resolution số theo hàng (hàng z, rồi cột x).

Được chép lại. nullptr là dùng nguồn sau.

◆ heightmap

const char* njin::terrain3d_desc::heightmap = nullptr

Ảnh độ cao: ảnh xám (kênh đỏ, 0 đến 1) hoặc file .r16/.raw (16 bit, vuông, little-endian).

Được co giãn về resolution. Ảnh 8 bit chỉ có 256 bậc: đặt smooth để mượt bậc. nullptr là dùng noise.

◆ noise

noise_desc njin::terrain3d_desc::noise {.seed = 1, .frequency = 0.004f, .fractal = fractal_fbm, .octaves = 5}

Nhiễu sinh độ cao khi không có hai nguồn trên, tính theo mét của thế giới (frequency là số gò mỗi mét).

Kết quả được kéo giãn cho thấp nhất là 0 và cao nhất là 1 trước khi nhân height_scale.

◆ auto_splat

bool njin::terrain3d_desc::auto_splat = true

Tự tính lớp nào phủ chỗ nào theo quy tắc của mỗi lớp.

Tắt thì dùng splatmap (hoặc chỉ lớp 0), và vẽ thêm bằng terrain3d_paint().

◆ splatmap

const char* njin::terrain3d_desc::splatmap = nullptr

Ảnh trọng số các lớp khi tắt auto_splat: kênh đỏ, lục, lam, alpha là lớp 0 đến 3.

Được co giãn về resolution. nullptr là chỉ lớp 0.