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
Vật lý 3D

Body tĩnh, kinematic, động; nhân vật đi trên sàn và leo bậc; raycast. Tiếp...

Classes

struct  njin::body3d_desc
 Mô tả một body vật lý 3D cho body3d_create(). Tiếp...
struct  njin::character3d_desc
 Mô tả một nhân vật cho character3d_create(): hình viên nang đứng thẳng, đi trên sàn, leo bậc thấp, không trượt trên dốc thoải, bị tường chặn, và đẩy được body động. Tiếp...
struct  njin::soft3d_hit
 Chỗ một tia hay một khối đẩy trúng vật mềm, cho các bản physics3d_raycast(), physics3d_box_cast() và physics3d_hull_cast() có tham số soft. Tiếp...
struct  njin::contact3d
 Một sự kiện chạm của bước mô phỏng vừa rồi: hai body, hoặc một body và một nhân vật, bắt đầu hay thôi chạm nhau. Tiếp...
struct  njin::joint3d_desc
 Mô tả một khớp nối cho joint3d_create(). Tiếp...
struct  njin::ragdoll3d_bone
 Một phần của ragdoll: một xương của model thành một viên nang vật lý dọc theo trục y của xương (hướng của xương với rig của Blender). Tiếp...
struct  njin::ragdoll3d_desc
 Mô tả một ragdoll cho ragdoll3d_create(). Tiếp...
struct  njin::softbody3d_desc
 Mô tả một vật mềm cho softbody3d_create(). Tiếp...
struct  njin::cloth3d_desc
 Mô tả một tấm vải cho cloth3d_create(): một lưới chữ nhật columns x rows ô, nằm trong mặt phẳng x–y của nó (đứng thẳng như lá cờ, rèm cửa), tâm ở position. Tiếp...
struct  njin::vehicle3d_wheel
 Một bánh xe của njin::vehicle3d_desc. Tiếp...
struct  njin::vehicle3d_desc
 Mô tả một xe có bánh cho vehicle3d_create(). Tiếp...
struct  njin::motorcycle3d_desc
 Mô tả một xe máy cho motorcycle3d_create(): thân là một body động hình hộp size (hoặc bao lồi của model), một bánh trước lái trên phuộc nghiêng, một bánh sau kéo. Tiếp...
struct  njin::tracked3d_desc
 Mô tả một xe bánh xích (xe tăng, máy xúc) cho tracked3d_create(): thân là một body động hình hộp size (hoặc bao lồi của model), mỗi bên một dải xích chạy trên wheels_per_side bánh, bánh cuối mỗi bên là bánh kéo. Tiếp...
struct  njin::body3d
 Component: entity đi theo một body vật lý. Tiếp...
struct  njin::character3d
 Component: entity đi theo một nhân vật vật lý. Tiếp...

Enumerations

enum  njin::body3d_motion { njin::body3d_static , njin::body3d_kinematic , njin::body3d_dynamic }
 Cách một body vật lý 3D chuyển động. Tiếp...
enum  njin::joint3d_kind {
  njin::joint3d_fixed , njin::joint3d_point , njin::joint3d_hinge , njin::joint3d_slider ,
  njin::joint3d_distance , njin::joint3d_gear , njin::joint3d_rack , njin::joint3d_pulley
}
 Loại khớp nối của njin::joint3d_desc. Tiếp...
enum  njin::softbody3d_kind { njin::softbody3d_box , njin::softbody3d_sphere , njin::softbody3d_mesh }
 Hình dựng sẵn của một vật mềm (njin::softbody3d_desc::kind). Tiếp...
enum  njin::cloth3d_edge : u8 { njin::cloth3d_top = 1 , njin::cloth3d_bottom = 2 , njin::cloth3d_left = 4 , njin::cloth3d_right = 8 }
 Các cạnh của tấm vải, cộng lại được: cloth3d_top | cloth3d_left. Tiếp...

Các hàm

body3d_handle njin::body3d_create (context &ctx, const body3d_desc &desc)
 Tạo một body vật lý 3D.
void njin::body3d_destroy (context &ctx, body3d_handle handle)
 Hủy body.
transform3d njin::body3d_transform (const context &ctx, body3d_handle handle)
 Vị trí và góc xoay hiện tại của body, để vẽ nó (scale luôn là 1).
void njin::body3d_set_position (context &ctx, body3d_handle handle, vec3 position, vec3 rotation={})
 Dời body tức thời tới vị trí mới (dịch chuyển, không va chạm trên đường đi), ví dụ khi đặt lại màn chơi.
void njin::body3d_move_kinematic (context &ctx, body3d_handle handle, vec3 position, vec3 rotation={})
 Cho một body kinematic tới position sau bước mô phỏng tới.
vec3 njin::body3d_velocity (const context &ctx, body3d_handle handle)
 Vận tốc thẳng của body, đơn vị mỗi giây.
void njin::body3d_set_velocity (context &ctx, body3d_handle handle, vec3 velocity)
 Đặt vận tốc thẳng của một body động.
void njin::body3d_add_impulse (context &ctx, body3d_handle handle, vec3 impulse)
 Đẩy một body động một cú (xung lực, kg * đơn vị mỗi giây) tại tâm của nó: nổ, cú đá, đạn trúng.
void njin::body3d_add_force (context &ctx, body3d_handle handle, vec3 force)
 Đẩy một body động bằng một lực (N, kg * đơn vị mỗi giây²) tại trọng tâm, trong bước vật lý tới: động cơ phản lực, gió, nam châm.
void njin::body3d_add_force (context &ctx, body3d_handle handle, vec3 force, vec3 point)
 Như body3d_add_force(context &, body3d_handle, vec3) nhưng đặt lực tại point (thế giới): lực lệch tâm vừa đẩy vừa xoay body.
void njin::body3d_add_torque (context &ctx, body3d_handle handle, vec3 torque)
 Xoay một body động bằng một mô-men (N·m) quanh trọng tâm, trong bước vật lý tới.
vec3 njin::body3d_angular_velocity (const context &ctx, body3d_handle handle)
 Vận tốc góc của body: trục quay là hướng của vector, độ mỗi giây là độ dài của nó (quy tắc bàn tay phải).
void njin::body3d_carry (context &ctx, body3d_handle handle, f32 mass, vec3 point)
 Cho bước vật lý kế tiếp, body động mang thêm một vật nặng mass kg đặt tại point: người treo hay leo trên nó (nhân vật đứng trên body thì engine tự làm), một thùng hàng không phải body.
u64 njin::body3d_user (const context &ctx, body3d_handle handle)
 Số của game gắn vào body lúc tạo (njin::body3d_desc::user).
character3d_handle njin::character3d_create (context &ctx, const character3d_desc &desc)
 Tạo một nhân vật.
void njin::character3d_destroy (context &ctx, character3d_handle handle)
 Hủy nhân vật.
void njin::character3d_set_active (context &ctx, character3d_handle handle, bool active)
 Bật hoặc tắt một nhân vật.
bool njin::character3d_active (const context &ctx, character3d_handle handle)
 Nhân vật có đang bật không (character3d_set_active()).
void njin::character3d_set_velocity (context &ctx, character3d_handle handle, vec3 velocity)
 Đặt vận tốc muốn có cho bước mô phỏng tới, đơn vị mỗi giây.
vec3 njin::character3d_velocity (const context &ctx, character3d_handle handle)
 Vận tốc sau bước mô phỏng vừa rồi (đã bị tường, sàn chặn bớt).
vec3 njin::character3d_position (const context &ctx, character3d_handle handle)
 Vị trí chân của nhân vật.
void njin::character3d_set_position (context &ctx, character3d_handle handle, vec3 position)
 Dời nhân vật tức thời tới vị trí chân mới (hồi sinh, cổng dịch chuyển).
bool njin::character3d_grounded (const context &ctx, character3d_handle handle)
 Nhân vật có đang đứng trên thứ gì đủ bằng phẳng không (sau bước mô phỏng vừa rồi).
vec3 njin::character3d_ground_velocity (const context &ctx, character3d_handle handle)
 Vận tốc của thứ nhân vật đang đứng lên: bằng 0 trên sàn tĩnh, bằng vận tốc của bục trên một body kinematic.
body3d_handle njin::character3d_ground_body (const context &ctx, character3d_handle handle)
 Body mà nhân vật đang đứng lên (để biết đã tới bục nào).
softbody3d_handle njin::character3d_ground_soft (const context &ctx, character3d_handle handle)
 Vật mềm mà nhân vật đang đứng lên (nệm, bạt nhún, softbody3d_desc::walkable).
vec3 njin::physics3d_capsule_push (const context &ctx, vec3 a, vec3 b, f32 radius, body3d_handle ignore={})
 Vector đẩy ngắn nhất (minimum translation vector) đưa viên nang a–b bán kính radius ra khỏi mọi body nó đang lấn vào (không tính nhân vật, sensor và ignore): dời viên nang theo vector này là vừa hết chạm.
vec3 njin::physics3d_box_push (const context &ctx, vec3 center, vec3 rotation, vec3 size, body3d_handle ignore={})
 Như physics3d_capsule_push() cho một hộp (bàn chân, bàn tay đo từ da bằng model_bone_bounds()).
ray3d_hit njin::physics3d_box_cast (const context &ctx, vec3 center, vec3 rotation, vec3 size, vec3 motion, body3d_handle ignore={}, body3d_handle *body=nullptr)
 Đẩy một hộp đi theo motion và tìm thứ đầu tiên nó chạm (không tính nhân vật, sensor, ignore và những gì hộp đã lấn vào từ đầu).
ray3d_hit njin::physics3d_box_cast (const context &ctx, vec3 center, vec3 rotation, vec3 size, vec3 motion, body3d_handle ignore, body3d_handle *body, soft3d_hit *soft)
 Như physics3d_box_cast(), nhưng hộp chạm cả vật mềm (rèm, vải, bóng), không chỉ body.
hull3d_handle njin::physics3d_hull_create (context &ctx, const vec3 *points, i32 count)
 Dựng một khối lồi từ các điểm (khối nhỏ nhất bọc hết chúng), để dò va chạm bằng đúng hình của một bộ phận: bàn chân, bàn tay lấy từ model_bone_points().
void njin::physics3d_hull_destroy (context &ctx, hull3d_handle hull)
 Hủy khối.
vec3 njin::physics3d_hull_push (const context &ctx, hull3d_handle hull, vec3 position, vec3 rotation, body3d_handle ignore={})
 Như physics3d_box_push() cho một khối lồi đặt ở position, xoay rotation.
ray3d_hit njin::physics3d_hull_cast (const context &ctx, hull3d_handle hull, vec3 position, vec3 rotation, vec3 motion, body3d_handle ignore={}, body3d_handle *body=nullptr)
 Như physics3d_box_cast() cho một khối lồi.
ray3d_hit njin::physics3d_hull_cast (const context &ctx, hull3d_handle hull, vec3 position, vec3 rotation, vec3 motion, body3d_handle ignore, body3d_handle *body, soft3d_hit *soft)
 Như physics3d_hull_cast(), chạm cả vật mềm như bản physics3d_box_cast() có soft.
i32 njin::physics3d_hull_lines (const context &ctx, hull3d_handle hull, vec3 *out, i32 count)
 Các cạnh của khối, từng cặp điểm trong hệ trục riêng của nó, để vẽ debug.
ray3d_hit njin::physics3d_raycast (const context &ctx, const ray3d &ray, f32 max_distance, body3d_handle *body=nullptr)
 Bắn một tia vào các body (không trúng nhân vật, đi xuyên sensor): đạn, tầm nhìn, chọn vật bằng chuột.
ray3d_hit njin::physics3d_raycast (const context &ctx, const ray3d &ray, f32 max_distance, body3d_handle *body, soft3d_hit *soft)
 Như physics3d_raycast(), nhưng tia trúng cả vật mềm: bắn vào tấm rèm thì trúng rèm, không đi xuyên qua.
i32 njin::physics3d_contact_count (const context &ctx)
 Số sự kiện chạm của bước mô phỏng vừa rồi.
contact3d njin::physics3d_contact (const context &ctx, i32 index)
 Sự kiện chạm thứ index của bước mô phỏng vừa rồi.
joint3d_handle njin::joint3d_create (context &ctx, const joint3d_desc &desc)
 Nối hai body (hoặc một body với thế giới) bằng một khớp.
void njin::joint3d_destroy (context &ctx, joint3d_handle handle)
 Hủy khớp.
void njin::joint3d_set_motor (context &ctx, joint3d_handle handle, f32 speed)
 Đặt tốc độ mô-tơ của một bản lề (độ mỗi giây) hay khớp trượt (đơn vị mỗi giây), trong giới hạn joint3d_desc::motor_force.
f32 njin::joint3d_position (const context &ctx, joint3d_handle handle)
 Góc hiện tại của bản lề (độ) hoặc quãng trượt của khớp trượt (đơn vị), tính từ lúc tạo khớp.
void njin::joint3d_set_motor_force (context &ctx, joint3d_handle handle, f32 force)
 Đổi lực tối đa của mô-tơ (joint3d_desc::motor_force) lúc đang chạy: chân ga, động cơ dây chun yếu dần khi dây nhả ra.
f32 njin::joint3d_speed (const context &ctx, joint3d_handle handle)
 Tốc độ hiện tại của bản lề (độ mỗi giây, cùng chiều với joint3d_position()) hoặc của khớp trượt (đơn vị mỗi giây): đếm số vòng đã quay, lực đẩy cánh quạt.
f32 njin::joint3d_force (const context &ctx, joint3d_handle handle)
 Lực khớp đang chịu để giữ hai body theo luật của nó (giữ điểm nối, giới hạn, mô-tơ, căng dây), ở bước vật lý vừa rồi, N.
f32 njin::joint3d_torque (const context &ctx, joint3d_handle handle)
 Mô-men khớp đang chịu để giữ góc giữa hai body (bản lề giữ trục, giới hạn góc, mô-tơ, bánh răng truyền lực), ở bước vật lý vừa rồi, N·m.
ragdoll3d_handle njin::ragdoll3d_create (context &ctx, const ragdoll3d_desc &desc)
 Biến một model có xương thành ragdoll: mỗi phần là một body động, nối với phần cha bằng khớp có giới hạn góc, rơi và va chạm như mọi body.
void njin::ragdoll3d_destroy (context &ctx, ragdoll3d_handle handle)
 Hủy ragdoll cùng các body của nó.
body3d_handle njin::ragdoll3d_body (const context &ctx, ragdoll3d_handle handle, i32 part)
 Body của một phần, để đẩy (body3d_add_impulse()), đọc vị trí, hay nhận ra phần bị trúng trong physics3d_raycast() và physics3d_contact().
shape3d njin::ragdoll3d_shape (const context &ctx, ragdoll3d_handle handle, i32 part)
 Hình va chạm của một phần, trong thế giới: viên nang (hoặc hình cầu) mà engine đo từ da, đặt theo body của phần đó lúc này.
i32 njin::ragdoll3d_bones (const context &ctx, ragdoll3d_handle handle, const transform3d &transform, bone_pose3d *out, i32 count)
 Tư thế hiện tại của ragdoll, để vẽ model bằng model_pose::bones ở transform (thường là ragdoll3d_desc::transform).
softbody3d_handle njin::softbody3d_create (context &ctx, const softbody3d_desc &desc)
 Tạo một vật mềm.
softbody3d_handle njin::cloth3d_create (context &ctx, const cloth3d_desc &desc)
 Tạo một tấm vải: lá cờ, rèm, áo choàng, khăn trải bàn.
void njin::softbody3d_destroy (context &ctx, softbody3d_handle handle)
 Hủy vật mềm cùng model của nó (softbody3d_model()).
i32 njin::softbody3d_vertex_count (const context &ctx, softbody3d_handle handle)
 Số đỉnh của vật mềm.
i32 njin::softbody3d_vertices (const context &ctx, softbody3d_handle handle, vec3 *out, i32 count)
 Vị trí hiện tại của các đỉnh, trong thế giới.
i32 njin::softbody3d_normals (const context &ctx, softbody3d_handle handle, vec3 *out, i32 count)
 Pháp tuyến hiện tại của các đỉnh (độ dài 1, trung bình các tam giác chung đỉnh, hướng ra ngoài hay về phía trước của vải), để tự vẽ vật mềm.
i32 njin::softbody3d_indices (const context &ctx, softbody3d_handle handle, u32 *out, i32 count)
 Các tam giác của mặt vật mềm, ba chỉ số đỉnh mỗi tam giác, ngược chiều kim đồng hồ nhìn từ ngoài (từ phía trước của vải, phía +z lúc tạo).
model_handle njin::softbody3d_model (context &ctx, softbody3d_handle handle)
 Một model luôn có hình hiện tại của vật mềm, trong thế giới: engine cập nhật nó sau mỗi bước vật lý.
i32 njin::softbody3d_nearest (const context &ctx, softbody3d_handle handle, vec3 point)
 Đỉnh gần point nhất, để ghim hay kéo một chỗ của vật mềm.
void njin::softbody3d_pin (context &ctx, softbody3d_handle handle, i32 vertex, bool pinned)
 Ghim hay bỏ ghim một đỉnh.
void njin::softbody3d_move_pinned (context &ctx, softbody3d_handle handle, i32 vertex, vec3 position)
 Cho một đỉnh bị ghim tới position sau bước vật lý tới, kéo phần còn lại theo: áo choàng ghim vào vai đang chạy, rèm kéo trên thanh treo.
void njin::softbody3d_set_wind (context &ctx, softbody3d_handle handle, vec3 wind)
 Đặt gió thổi qua vật mềm, vận tốc của không khí (đơn vị mỗi giây).
void njin::softbody3d_add_impulse (context &ctx, softbody3d_handle handle, vec3 impulse)
 Đẩy cả vật mềm một cú (xung lực, kg * đơn vị mỗi giây), chia đều cho các đỉnh không bị ghim: cú đá vào quả bóng.
vec3 njin::softbody3d_position (const context &ctx, softbody3d_handle handle)
 Tâm của vật mềm (trung bình các đỉnh), để camera đi theo hay đặt âm thanh.
u64 njin::softbody3d_user (const context &ctx, softbody3d_handle handle)
 Số của game gắn vào vật mềm lúc tạo.
void njin::softbody3d_draw_debug (context &ctx, softbody3d_handle handle, rgba color={0.3f, 0.9f, 1.0f, 1.0f})
 Vẽ vật mềm bằng gizmo (njin_gizmo.h) cho frame này: các cạnh của mặt, và đỉnh bị ghim là chấm đỏ.
vehicle3d_handle njin::vehicle3d_create (context &ctx, const vehicle3d_desc &desc)
 Tạo một xe có bánh: thân xe là body động, mỗi bánh là một giảm xóc dò mặt đất (không phải body), có động cơ, hộp số tự động, vi sai, phanh và phanh tay.
void njin::vehicle3d_destroy (context &ctx, vehicle3d_handle handle)
 Hủy xe cùng thân xe.
void njin::vehicle3d_set_input (context &ctx, vehicle3d_handle handle, f32 throttle, f32 steer, f32 brake, f32 handbrake)
 Đặt cách lái cho bước vật lý tới.
body3d_handle njin::vehicle3d_body (const context &ctx, vehicle3d_handle handle)
 Thân xe, để đọc vị trí (body3d_transform()), vận tốc, hay đẩy nó.
i32 njin::vehicle3d_wheel_count (const context &ctx, vehicle3d_handle handle)
 Số bánh của xe.
transform3d njin::vehicle3d_wheel_transform (const context &ctx, vehicle3d_handle handle, i32 wheel)
 Chỗ và góc của một bánh lúc này (đã tính giảm xóc, góc lái và bánh quay), trong thế giới.
bool njin::vehicle3d_wheel_grounded (const context &ctx, vehicle3d_handle handle, i32 wheel)
 Bánh có đang chạm đất không.
f32 njin::vehicle3d_rpm (const context &ctx, vehicle3d_handle handle)
 Vòng tua động cơ lúc này, cho tiếng máy và đồng hồ.
i32 njin::vehicle3d_gear (const context &ctx, vehicle3d_handle handle)
 Số đang vào: -1 số lùi, 0 số không, 1 trở lên là số tiến.
vehicle3d_handle njin::motorcycle3d_create (context &ctx, const motorcycle3d_desc &desc)
 Tạo một xe máy (bộ điều khiển xe máy của Jolt): một lò xo giữ xe đứng thẳng và nghiêng vào cua theo tốc độ và góc lái, nên xe không đổ khi đứng yên hay chạy chậm.
vehicle3d_handle njin::tracked3d_create (context &ctx, const tracked3d_desc &desc)
 Tạo một xe bánh xích (bộ điều khiển xe xích của Jolt): rẽ bằng cách cho hai dải xích chạy khác tốc độ, quay tại chỗ khi chúng chạy ngược chiều nhau.
void njin::vehicle3d_set_tracks (context &ctx, vehicle3d_handle handle, f32 left, f32 right, f32 brake)
 Điều khiển thẳng hai dải xích của xe bánh xích cho bước vật lý tới, giữ nguyên tới lần gọi sau: mỗi bên -1 (lùi hết cỡ) .
f32 njin::vehicle3d_track_speed (const context &ctx, vehicle3d_handle handle, i32 side)
 Tốc độ của một dải xích, để cuộn ảnh xích theo đúng tốc độ xe chạy.
void njin::vehicle3d_draw_debug (context &ctx, vehicle3d_handle handle, rgba color={1.0f, 0.6f, 0.2f, 1.0f})
 Vẽ xe bằng gizmo (njin_gizmo.h) cho frame này: hộp thân xe, mỗi bánh là một vòng tròn với trục, giảm xóc từ chỗ gắn tới tâm bánh, và điểm bánh chạm đất (vàng).
void njin::physics3d_set_gravity (context &ctx, vec3 gravity)
 Đặt trọng lực cho body động.
vec3 njin::physics3d_gravity (const context &ctx)
 Trọng lực đang dùng cho body động.

Mô tả chi tiết

Body tĩnh, kinematic, động; nhân vật đi trên sàn và leo bậc; raycast.

Dựng trên Jolt Physics.

Thông tin về Enumeration Type

◆ body3d_motion

Cách một body vật lý 3D chuyển động.

Enumerator
body3d_static 

Đứng yên mãi: sàn, tường, bục cố định. Rẻ nhất.

body3d_kinematic 

Game dời bằng body3d_move_kinematic(): bục di chuyển, cửa. Không bị vật khác đẩy, nhưng chở và đẩy được vật khác.

body3d_dynamic 

Do vật lý điều khiển: rơi, va, lăn, bị đẩy. Thùng, bóng, mảnh vỡ.

◆ joint3d_kind

Loại khớp nối của njin::joint3d_desc.

Enumerator
joint3d_fixed 

Hàn cứng hai body: giữ nguyên vị trí và góc tương đối.

joint3d_point 

Khớp cầu: xoay tự do quanh anchor (dây xích, ragdoll).

joint3d_hinge 

Bản lề: xoay quanh axis qua anchor (cửa, bập bênh, bánh xe).

joint3d_slider 

Trượt dọc axis, không xoay (piston, ngăn kéo, cửa kéo).

joint3d_distance 

Giữ khoảng cách giữa anchor và anchor_b trong [min, max] (dây, thanh nối).

joint3d_gear 

Bánh răng: buộc hai bản lề joint_a, joint_b quay theo tỉ số ratio (bánh răng ăn khớp, xích, dây curoa).

Bánh là body a của mỗi bản lề.

joint3d_rack 

Thanh răng: buộc bản lề joint_a (bánh) và khớp trượt joint_b (thanh) đi cùng nhau: thanh trượt ratio đơn vị mỗi vòng bánh.

joint3d_pulley 

Ròng rọc: dây từ anchor trên a vắt qua điểm cố định pulley_a, sang pulley_b rồi xuống anchor_b trên b.

Dây không giãn: kéo bên này lên thì bên kia xuống.

◆ softbody3d_kind

Hình dựng sẵn của một vật mềm (njin::softbody3d_desc::kind).

Enumerator
softbody3d_box 

Khối hộp đặc size: một lưới điểm đều bên trong hộp, giữ thể tích.

Nệm, khối thạch, khối cao su.

softbody3d_sphere 

Mặt cầu bán kính radius, rỗng: thêm pressure để thành quả bóng.

softbody3d_mesh 

Mặt của một lưới tam giác (mesh, hoặc mọi lưới của model), rỗng như mặt cầu: lưới kín và đặt pressure để giữ phồng.

Các đỉnh trùng vị trí (đường nối UV của file) được gộp làm một.

◆ cloth3d_edge

Các cạnh của tấm vải, cộng lại được: cloth3d_top | cloth3d_left.

Enumerator
cloth3d_top 

Hàng đầu (hàng 0).

cloth3d_bottom 

Hàng cuối.

cloth3d_left 

Cột đầu (cột 0).

cloth3d_right 

Cột cuối.

Thông tin về hàm

◆ body3d_create()

body3d_handle njin::body3d_create ( context & ctx,
const body3d_desc & desc )

Tạo một body vật lý 3D.

Engine mô phỏng mọi body ở phase_fixed_update, ngay sau các system của game trong phase đó.

Các tham số
ctxContext của engine.
descMô tả body.
Giá trị trả về
Handle của body, hoặc không hợp lệ nếu hình không dùng được.

◆ body3d_destroy()

void njin::body3d_destroy ( context & ctx,
body3d_handle handle )

Hủy body.

Handle không hợp lệ bị bỏ qua.

Các tham số
ctxContext của engine.
handleBody cần hủy.

◆ body3d_transform()

transform3d njin::body3d_transform ( const context & ctx,
body3d_handle handle )

Vị trí và góc xoay hiện tại của body, để vẽ nó (scale luôn là 1).

Các tham số
ctxContext của engine.
handleBody.
Giá trị trả về
Vị trí và góc xoay (độ); mặc định nếu handle không hợp lệ.

◆ body3d_set_position()

void njin::body3d_set_position ( context & ctx,
body3d_handle handle,
vec3 position,
vec3 rotation = {} )

Dời body tức thời tới vị trí mới (dịch chuyển, không va chạm trên đường đi), ví dụ khi đặt lại màn chơi.

Vận tốc giữ nguyên.

Các tham số
ctxContext của engine.
handleBody.
positionVị trí mới.
rotationGóc xoay mới, độ.

◆ body3d_move_kinematic()

void njin::body3d_move_kinematic ( context & ctx,
body3d_handle handle,
vec3 position,
vec3 rotation = {} )

Cho một body kinematic tới position sau bước mô phỏng tới.

Engine đặt vận tốc của body sao cho nó tới đó đúng hạn, nên nhân vật và vật động đứng trên được chở theo. Gọi mỗi bước cố định với vị trí mới (bục đi qua lại, thang máy).

Các tham số
ctxContext của engine.
handleBody kinematic.
positionVị trí muốn tới.
rotationGóc xoay muốn tới, độ.

◆ body3d_velocity()

vec3 njin::body3d_velocity ( const context & ctx,
body3d_handle handle )

Vận tốc thẳng của body, đơn vị mỗi giây.

Các tham số
ctxContext của engine.
handleBody.
Giá trị trả về
Vận tốc, hoặc 0 nếu handle không hợp lệ.

◆ body3d_set_velocity()

void njin::body3d_set_velocity ( context & ctx,
body3d_handle handle,
vec3 velocity )

Đặt vận tốc thẳng của một body động.

Các tham số
ctxContext của engine.
handleBody.
velocityVận tốc mới, đơn vị mỗi giây.

◆ body3d_add_impulse()

void njin::body3d_add_impulse ( context & ctx,
body3d_handle handle,
vec3 impulse )

Đẩy một body động một cú (xung lực, kg * đơn vị mỗi giây) tại tâm của nó: nổ, cú đá, đạn trúng.

Các tham số
ctxContext của engine.
handleBody.
impulseXung lực.

◆ body3d_add_force() [1/2]

void njin::body3d_add_force ( context & ctx,
body3d_handle handle,
vec3 force )

Đẩy một body động bằng một lực (N, kg * đơn vị mỗi giây²) tại trọng tâm, trong bước vật lý tới: động cơ phản lực, gió, nam châm.

Khác body3d_add_impulse(), lực chỉ tác dụng một bước, nên gọi mỗi bước cố định khi còn đẩy. Các lực trong một bước cộng lại.

Các tham số
ctxContext của engine.
handleBody. Không phải body động thì bỏ qua.
forceLực.

◆ body3d_add_force() [2/2]

void njin::body3d_add_force ( context & ctx,
body3d_handle handle,
vec3 force,
vec3 point )

Như body3d_add_force(context &, body3d_handle, vec3) nhưng đặt lực tại point (thế giới): lực lệch tâm vừa đẩy vừa xoay body.

Cánh quạt đẩy một khung tại trục của nó, ống phụt khí ở mép một tấm ván.

// Cánh quạt: lực đẩy dọc trục, tỉ lệ với bình phương tốc độ quay của bản lề.
const f32 w = njin::joint3d_speed(ctx, rotor_hinge) / 360.0f; // vòng mỗi giây
njin::body3d_add_force(ctx, frame, axis * (k * w * std::fabs(w)), hub);
void body3d_add_force(context &ctx, body3d_handle handle, vec3 force)
Đẩy một body động bằng một lực (N, kg * đơn vị mỗi giây²) tại trọng tâm, trong bước vật lý tới: động ...
f32 joint3d_speed(const context &ctx, joint3d_handle handle)
Tốc độ hiện tại của bản lề (độ mỗi giây, cùng chiều với joint3d_position()) hoặc của khớp trượt (đơn ...
float f32
Số thực 32 bit.
Definition _types.h:28
Các tham số
ctxContext của engine.
handleBody. Không phải body động thì bỏ qua.
forceLực.
pointĐiểm đặt lực, thế giới.

◆ body3d_add_torque()

void njin::body3d_add_torque ( context & ctx,
body3d_handle handle,
vec3 torque )

Xoay một body động bằng một mô-men (N·m) quanh trọng tâm, trong bước vật lý tới.

Chiều xoay theo quy tắc bàn tay phải quanh torque. Gọi mỗi bước cố định khi còn xoay.

Các tham số
ctxContext của engine.
handleBody. Không phải body động thì bỏ qua.
torqueMô-men.

◆ body3d_angular_velocity()

vec3 njin::body3d_angular_velocity ( const context & ctx,
body3d_handle handle )

Vận tốc góc của body: trục quay là hướng của vector, độ mỗi giây là độ dài của nó (quy tắc bàn tay phải).

Các tham số
ctxContext của engine.
handleBody.
Giá trị trả về
Vận tốc góc, độ mỗi giây, hoặc 0 nếu handle không hợp lệ.

◆ body3d_carry()

void njin::body3d_carry ( context & ctx,
body3d_handle handle,
f32 mass,
vec3 point )

Cho bước vật lý kế tiếp, body động mang thêm một vật nặng mass kg đặt tại point: người treo hay leo trên nó (nhân vật đứng trên body thì engine tự làm), một thùng hàng không phải body.

Body nặng như cả hai cộng lại, có quán tính của vật nặng ở chỗ đó và sức nặng của nó xoay body quanh tâm, như nhân vật đứng lên (character3d_desc::mass): ván dựng vào tường trượt ra khi người leo lên cao, mà ván nhẹ không rung. Gọi mỗi bước cố định cho đến khi thôi mang.

Các tham số
ctxContext của engine.
handleBody. Không phải body động thì bỏ qua.
massKhối lượng, kg. Không dương thì bỏ qua.
pointChỗ đặt, thế giới; được giữ ở trong body.

◆ body3d_user()

u64 njin::body3d_user ( const context & ctx,
body3d_handle handle )

Số của game gắn vào body lúc tạo (njin::body3d_desc::user).

Các tham số
ctxContext của engine.
handleBody.
Giá trị trả về
Số đó, hoặc 0 nếu handle không hợp lệ.

◆ character3d_create()

character3d_handle njin::character3d_create ( context & ctx,
const character3d_desc & desc )

Tạo một nhân vật.

Game điều khiển nó bằng vận tốc: mỗi bước cố định gọi character3d_set_velocity() với vận tốc muốn có (cả trọng lực và cú nhảy do game tự cộng), engine di chuyển nó ngay sau đó, trượt dọc tường và dừng trên sàn.

Các tham số
ctxContext của engine.
descMô tả nhân vật.
Giá trị trả về
Handle của nhân vật.

◆ character3d_destroy()

void njin::character3d_destroy ( context & ctx,
character3d_handle handle )

Hủy nhân vật.

Handle không hợp lệ bị bỏ qua.

Các tham số
ctxContext của engine.
handleNhân vật.

◆ character3d_set_active()

void njin::character3d_set_active ( context & ctx,
character3d_handle handle,
bool active )

Bật hoặc tắt một nhân vật.

Nhân vật tắt không được di chuyển, không va vào gì và nhân vật khác đi xuyên qua nó, nhưng vẫn giữ vị trí và đặt lại được bằng character3d_set_position(). Mỗi nhân vật bật tốn một lần tính va chạm mỗi bước vật lý, nên một đám đông lớn chỉ bật những người ở gần camera, còn người ở xa game tự dời theo đường đi (không ai thấy họ va chạm).

Các nhân vật (bật) chặn nhau: không đi xuyên qua nhau mà trượt vòng qua.

Các tham số
ctxContext của engine.
handleNhân vật.
activetrue là bật (mặc định khi tạo).

◆ character3d_active()

bool njin::character3d_active ( const context & ctx,
character3d_handle handle )

Nhân vật có đang bật không (character3d_set_active()).

Các tham số
ctxContext của engine.
handleNhân vật.
Giá trị trả về
true nếu đang bật; false nếu tắt hay handle không hợp lệ.

◆ character3d_set_velocity()

void njin::character3d_set_velocity ( context & ctx,
character3d_handle handle,
vec3 velocity )

Đặt vận tốc muốn có cho bước mô phỏng tới, đơn vị mỗi giây.

Các tham số
ctxContext của engine.
handleNhân vật.
velocityVận tốc.

◆ character3d_velocity()

vec3 njin::character3d_velocity ( const context & ctx,
character3d_handle handle )

Vận tốc sau bước mô phỏng vừa rồi (đã bị tường, sàn chặn bớt).

Các tham số
ctxContext của engine.
handleNhân vật.
Giá trị trả về
Vận tốc.

◆ character3d_position()

vec3 njin::character3d_position ( const context & ctx,
character3d_handle handle )

Vị trí chân của nhân vật.

Các tham số
ctxContext của engine.
handleNhân vật.
Giá trị trả về
Vị trí.

◆ character3d_set_position()

void njin::character3d_set_position ( context & ctx,
character3d_handle handle,
vec3 position )

Dời nhân vật tức thời tới vị trí chân mới (hồi sinh, cổng dịch chuyển).

Các tham số
ctxContext của engine.
handleNhân vật.
positionVị trí chân mới.

◆ character3d_grounded()

bool njin::character3d_grounded ( const context & ctx,
character3d_handle handle )

Nhân vật có đang đứng trên thứ gì đủ bằng phẳng không (sau bước mô phỏng vừa rồi).

Các tham số
ctxContext của engine.
handleNhân vật.
Giá trị trả về
true nếu đang đứng.

◆ character3d_ground_velocity()

vec3 njin::character3d_ground_velocity ( const context & ctx,
character3d_handle handle )

Vận tốc của thứ nhân vật đang đứng lên: bằng 0 trên sàn tĩnh, bằng vận tốc của bục trên một body kinematic.

Cộng vào vận tốc muốn có để nhân vật đi theo bục.

Các tham số
ctxContext của engine.
handleNhân vật.
Giá trị trả về
Vận tốc của chỗ đứng, hoặc 0 nếu không đứng trên gì.

◆ character3d_ground_body()

body3d_handle njin::character3d_ground_body ( const context & ctx,
character3d_handle handle )

Body mà nhân vật đang đứng lên (để biết đã tới bục nào).

Các tham số
ctxContext của engine.
handleNhân vật.
Giá trị trả về
Body, hoặc không hợp lệ nếu không đứng trên body nào.

◆ character3d_ground_soft()

softbody3d_handle njin::character3d_ground_soft ( const context & ctx,
character3d_handle handle )

Vật mềm mà nhân vật đang đứng lên (nệm, bạt nhún, softbody3d_desc::walkable).

Khi đó character3d_ground_body() không hợp lệ, còn character3d_ground_velocity() là vận tốc của mặt vật mềm dưới chân: cộng vào cú nhảy để bật cao hơn khi bạt đang nảy lên.

Các tham số
ctxContext của engine.
handleNhân vật.
Giá trị trả về
Vật mềm, hoặc không hợp lệ nếu không đứng trên vật mềm nào.

◆ physics3d_capsule_push()

vec3 njin::physics3d_capsule_push ( const context & ctx,
vec3 a,
vec3 b,
f32 radius,
body3d_handle ignore = {} )

Vector đẩy ngắn nhất (minimum translation vector) đưa viên nang a–b bán kính radius ra khỏi mọi body nó đang lấn vào (không tính nhân vật, sensor và ignore): dời viên nang theo vector này là vừa hết chạm.

Để tay, thân của một nhân vật tự né tường thay vì xuyên qua.

// Cẳng tay lấn vào tường: xoay khuỷu cho bàn tay ra theo vector đẩy.
const njin::vec3 push = njin::physics3d_capsule_push(ctx, elbow, wrist, 0.045f);
vec3 physics3d_capsule_push(const context &ctx, vec3 a, vec3 b, f32 radius, body3d_handle ignore={})
Vector đẩy ngắn nhất (minimum translation vector) đưa viên nang a–b bán kính radius ra khỏi mọi body ...
Vector 3 chiều.
Definition _types.h:47
Các tham số
ctxContext của engine.
aMột đầu trục viên nang (tâm nửa cầu), thế giới.
bĐầu kia.
radiusBán kính.
ignoreBody không tính (vật nhân vật đang cầm). Không hợp lệ là tính hết.
Giá trị trả về
Vector đẩy, {0, 0, 0} nếu không lấn vào gì.

◆ physics3d_box_push()

vec3 njin::physics3d_box_push ( const context & ctx,
vec3 center,
vec3 rotation,
vec3 size,
body3d_handle ignore = {} )

Như physics3d_capsule_push() cho một hộp (bàn chân, bàn tay đo từ da bằng model_bone_bounds()).

Các tham số
ctxContext của engine.
centerTâm hộp, thế giới.
rotationGóc xoay, độ, cùng thứ tự với njin::transform3d.
sizeKích thước theo x, y, z của hộp.
ignoreBody không tính. Không hợp lệ là tính hết.
Giá trị trả về
Vector đẩy, {0, 0, 0} nếu không lấn vào gì.

◆ physics3d_box_cast() [1/2]

ray3d_hit njin::physics3d_box_cast ( const context & ctx,
vec3 center,
vec3 rotation,
vec3 size,
vec3 motion,
body3d_handle ignore = {},
body3d_handle * body = nullptr )

Đẩy một hộp đi theo motion và tìm thứ đầu tiên nó chạm (không tính nhân vật, sensor, ignore và những gì hộp đã lấn vào từ đầu).

Như physics3d_raycast() nhưng cho cả một khối: thả bàn chân xuống để tìm chỗ đặt trên mặt gồ ghề.

// Bàn chân rơi xuống tối đa 1 m: chạm ở đâu thì đặt ở đó.
const njin::ray3d_hit h = njin::physics3d_box_cast(ctx, foot, rot, size, {0, -1, 0});
ray3d_hit physics3d_box_cast(const context &ctx, vec3 center, vec3 rotation, vec3 size, vec3 motion, body3d_handle ignore={}, body3d_handle *body=nullptr)
Đẩy một hộp đi theo motion và tìm thứ đầu tiên nó chạm (không tính nhân vật, sensor,...
Kết quả khi tia chạm một vật.
Definition njin_3d.h:847
Các tham số
ctxContext của engine.
centerTâm hộp lúc bắt đầu, thế giới.
rotationGóc xoay, độ, cùng thứ tự với njin::transform3d.
sizeKích thước theo x, y, z của hộp.
motionHướng và quãng đường đẩy.
ignoreBody không tính. Không hợp lệ là tính hết.
bodyNếu khác nullptr, nhận body bị chạm.
Giá trị trả về
distance: quãng hộp đi được tới lúc chạm; point, normal: chỗ chạm và pháp tuyến của mặt bị chạm.

◆ physics3d_box_cast() [2/2]

ray3d_hit njin::physics3d_box_cast ( const context & ctx,
vec3 center,
vec3 rotation,
vec3 size,
vec3 motion,
body3d_handle ignore,
body3d_handle * body,
soft3d_hit * soft )

Như physics3d_box_cast(), nhưng hộp chạm cả vật mềm (rèm, vải, bóng), không chỉ body.

Chạm vật mềm trước thì *body không hợp lệ và *soft cho biết vật mềm nào, tam giác nào; chạm body trước thì soft->soft không hợp lệ.

Các tham số
ctxContext của engine.
centerTâm hộp lúc bắt đầu, thế giới.
rotationGóc xoay, độ, cùng thứ tự với njin::transform3d.
sizeKích thước theo x, y, z của hộp.
motionHướng và quãng đường đẩy.
ignoreBody không tính. Không hợp lệ là tính hết.
bodyNếu khác nullptr, nhận body bị chạm.
softNhận vật mềm bị chạm; nullptr thì bỏ qua vật mềm, như bản không có tham số này.
Giá trị trả về
Như physics3d_box_cast().

◆ physics3d_hull_create()

hull3d_handle njin::physics3d_hull_create ( context & ctx,
const vec3 * points,
i32 count )

Dựng một khối lồi từ các điểm (khối nhỏ nhất bọc hết chúng), để dò va chạm bằng đúng hình của một bộ phận: bàn chân, bàn tay lấy từ model_bone_points().

Khối không phải là body: nó không va chạm, chỉ dùng cho physics3d_hull_push() và physics3d_hull_cast(). Dựng một lần, dùng mỗi khung ở vị trí và góc khác nhau.

std::vector<njin::vec3> pts(njin::model_bone_points(ctx, man, foot_l, false, nullptr, 0));
njin::model_bone_points(ctx, man, foot_l, false, pts.data(), (njin::i32)pts.size());
const njin::hull3d_handle sole = njin::physics3d_hull_create(ctx, pts.data(), (njin::i32)pts.size());
i32 model_bone_points(const context &ctx, model_handle handle, i32 bone, bool children, vec3 *out, i32 count)
Các đỉnh của phần da đó (như model_bone_bounds()), cùng hệ trục: theo các trục của model ở tư thế gốc...
hull3d_handle physics3d_hull_create(context &ctx, const vec3 *points, i32 count)
Dựng một khối lồi từ các điểm (khối nhỏ nhất bọc hết chúng), để dò va chạm bằng đúng hình của một bộ ...
std::int32_t i32
Số nguyên có dấu 32 bit.
Definition _types.h:14
Định danh của một khối lồi dùng để dò va chạm, tạo bởi physics3d_hull_create().
Definition _types.h:188
Các tham số
ctxContext của engine.
pointsCác điểm, trong hệ trục riêng của khối.
countSố điểm (ít nhất 4, không cùng nằm trên một mặt phẳng).
Giá trị trả về
Handle, hoặc không hợp lệ nếu các điểm không dựng được khối.

◆ physics3d_hull_destroy()

void njin::physics3d_hull_destroy ( context & ctx,
hull3d_handle hull )

Hủy khối.

Handle không hợp lệ bị bỏ qua.

Các tham số
ctxContext của engine.
hullKhối.

◆ physics3d_hull_push()

vec3 njin::physics3d_hull_push ( const context & ctx,
hull3d_handle hull,
vec3 position,
vec3 rotation,
body3d_handle ignore = {} )

Như physics3d_box_push() cho một khối lồi đặt ở position, xoay rotation.

Các tham số
ctxContext của engine.
hullKhối.
positionGốc hệ trục riêng của khối, thế giới.
rotationGóc xoay, độ, cùng thứ tự với njin::transform3d.
ignoreBody không tính. Không hợp lệ là tính hết.
Giá trị trả về
Vector đẩy, {0, 0, 0} nếu không lấn vào gì hay handle không hợp lệ.

◆ physics3d_hull_cast() [1/2]

ray3d_hit njin::physics3d_hull_cast ( const context & ctx,
hull3d_handle hull,
vec3 position,
vec3 rotation,
vec3 motion,
body3d_handle ignore = {},
body3d_handle * body = nullptr )

Như physics3d_box_cast() cho một khối lồi.

Các tham số
ctxContext của engine.
hullKhối.
positionGốc hệ trục riêng của khối lúc bắt đầu, thế giới.
rotationGóc xoay, độ, cùng thứ tự với njin::transform3d.
motionHướng và quãng đường đẩy.
ignoreBody không tính. Không hợp lệ là tính hết.
bodyNếu khác nullptr, nhận body bị chạm.
Giá trị trả về
Như physics3d_box_cast(); không chạm gì nếu handle không hợp lệ.

◆ physics3d_hull_cast() [2/2]

ray3d_hit njin::physics3d_hull_cast ( const context & ctx,
hull3d_handle hull,
vec3 position,
vec3 rotation,
vec3 motion,
body3d_handle ignore,
body3d_handle * body,
soft3d_hit * soft )

Như physics3d_hull_cast(), chạm cả vật mềm như bản physics3d_box_cast() có soft.

Các tham số
ctxContext của engine.
hullKhối.
positionGốc hệ trục riêng của khối lúc bắt đầu, thế giới.
rotationGóc xoay, độ, cùng thứ tự với njin::transform3d.
motionHướng và quãng đường đẩy.
ignoreBody không tính. Không hợp lệ là tính hết.
bodyNếu khác nullptr, nhận body bị chạm.
softNhận vật mềm bị chạm; nullptr thì bỏ qua vật mềm.
Giá trị trả về
Như physics3d_box_cast(); không chạm gì nếu handle không hợp lệ.

◆ physics3d_hull_lines()

i32 njin::physics3d_hull_lines ( const context & ctx,
hull3d_handle hull,
vec3 * out,
i32 count )

Các cạnh của khối, từng cặp điểm trong hệ trục riêng của nó, để vẽ debug.

Các tham số
ctxContext của engine.
hullKhối.
outMảng nhận điểm (cạnh thứ i là out[2i], out[2i + 1]), hoặc nullptr để chỉ đếm.
countSố phần tử của out.
Giá trị trả về
Số điểm có (gấp đôi số cạnh).

◆ physics3d_raycast() [1/2]

ray3d_hit njin::physics3d_raycast ( const context & ctx,
const ray3d & ray,
f32 max_distance,
body3d_handle * body = nullptr )

Bắn một tia vào các body (không trúng nhân vật, đi xuyên sensor): đạn, tầm nhìn, chọn vật bằng chuột.

Các tham số
ctxContext của engine.
rayTia (hướng độ dài 1).
max_distanceXa nhất còn tính, đơn vị thế giới.
bodyNếu khác nullptr, nhận body bị trúng (không hợp lệ nếu trượt).
Giá trị trả về
Điểm chạm gần nhất, nếu có.

◆ physics3d_raycast() [2/2]

ray3d_hit njin::physics3d_raycast ( const context & ctx,
const ray3d & ray,
f32 max_distance,
body3d_handle * body,
soft3d_hit * soft )

Như physics3d_raycast(), nhưng tia trúng cả vật mềm: bắn vào tấm rèm thì trúng rèm, không đi xuyên qua.

Trúng vật mềm trước thì *body không hợp lệ và *soft cho biết vật mềm, tam giác và đỉnh gần nhất (để đẩy chỗ bị bắn bằng softbody3d_add_impulse() hay ghim nó); trúng body trước thì soft->soft không hợp lệ.

const njin::ray3d_hit hit = njin::physics3d_raycast(ctx, shot, 100.0f, &body, &soft);
if (hit.hit && soft.soft.id != 0)
njin::softbody3d_add_impulse(ctx, soft.soft, shot.direction * 2.0f);
ray3d_hit physics3d_raycast(const context &ctx, const ray3d &ray, f32 max_distance, body3d_handle *body=nullptr)
Bắn một tia vào các body (không trúng nhân vật, đi xuyên sensor): đạn, tầm nhìn, chọn vật bằng chuột.
void softbody3d_add_impulse(context &ctx, softbody3d_handle handle, vec3 impulse)
Đẩy cả vật mềm một cú (xung lực, kg * đơn vị mỗi giây), chia đều cho các đỉnh không bị ghim: cú đá và...
Định danh của một body vật lý 3D, tạo bởi body3d_create().
Definition _types.h:160
bool hit
Tia có chạm không.
Definition njin_3d.h:848
Chỗ một tia hay một khối đẩy trúng vật mềm, cho các bản physics3d_raycast(), physics3d_box_cast() và ...
Definition njin_physics3d.h:314
softbody3d_handle soft
Vật mềm bị trúng; không hợp lệ nếu trúng body hay không trúng gì.
Definition njin_physics3d.h:315
u32 id
0 nghĩa là không hợp lệ.
Definition _types.h:197
Các tham số
ctxContext của engine.
rayTia (hướng độ dài 1).
max_distanceXa nhất còn tính, đơn vị thế giới.
bodyNếu khác nullptr, nhận body bị trúng (không hợp lệ nếu trượt hay trúng vật mềm).
softNhận vật mềm bị trúng; nullptr thì bỏ qua vật mềm, như bản không có tham số này.
Giá trị trả về
Điểm chạm gần nhất, nếu có.

◆ physics3d_contact_count()

i32 njin::physics3d_contact_count ( const context & ctx)

Số sự kiện chạm của bước mô phỏng vừa rồi.

Một cặp chỉ báo một lần khi bắt đầu chạm và một lần khi thôi chạm, dù chạm ở nhiều điểm. Engine mô phỏng ngay sau các system của game trong phase_fixed_update, nên đọc sự kiện trong phase đó: mỗi bước game thấy đúng sự kiện của bước trước, không sót, không lặp. Body bị hủy không có sự kiện thôi chạm.

for (int i = 0; i < njin::physics3d_contact_count(ctx); i++) {
if (c.began && c.a.id == goal.id && c.character.id == player.id)
win();
}
contact3d physics3d_contact(const context &ctx, i32 index)
Sự kiện chạm thứ index của bước mô phỏng vừa rồi.
i32 physics3d_contact_count(const context &ctx)
Số sự kiện chạm của bước mô phỏng vừa rồi.
u32 id
0 nghĩa là không hợp lệ.
Definition _types.h:161
u32 id
0 nghĩa là không hợp lệ.
Definition _types.h:168
Một sự kiện chạm của bước mô phỏng vừa rồi: hai body, hoặc một body và một nhân vật,...
Definition njin_physics3d.h:431
body3d_handle a
Body thứ nhất.
Definition njin_physics3d.h:432
character3d_handle character
Nhân vật chạm a, khi b không hợp lệ.
Definition njin_physics3d.h:434
bool began
true: bắt đầu chạm. false: thôi chạm.
Definition njin_physics3d.h:435
Các tham số
ctxContext của engine.
Giá trị trả về
Số sự kiện.

◆ physics3d_contact()

contact3d njin::physics3d_contact ( const context & ctx,
i32 index )

Sự kiện chạm thứ index của bước mô phỏng vừa rồi.

Các tham số
ctxContext của engine.
index0..physics3d_contact_count() - 1.
Giá trị trả về
Sự kiện, hoặc mặc định nếu index không hợp lệ.

◆ joint3d_create()

joint3d_handle njin::joint3d_create ( context & ctx,
const joint3d_desc & desc )

Nối hai body (hoặc một body với thế giới) bằng một khớp.

// Tấm ván treo bằng bản lề ở mép trên, đung đưa khi nhân vật nhảy lên.
const auto plank = njin::body3d_create(ctx, {.position = {0, 4, 0}, .size = {3, 0.2f, 1},
.motion = njin::body3d_dynamic, .mass = 20});
njin::joint3d_create(ctx, {.kind = njin::joint3d_hinge, .a = plank, .anchor = {0, 6, 0}, .axis = {1, 0, 0}});
joint3d_handle joint3d_create(context &ctx, const joint3d_desc &desc)
Nối hai body (hoặc một body với thế giới) bằng một khớp.
body3d_handle body3d_create(context &ctx, const body3d_desc &desc)
Tạo một body vật lý 3D.
@ joint3d_hinge
Bản lề: xoay quanh axis qua anchor (cửa, bập bênh, bánh xe).
Definition njin_physics3d.h:471
@ body3d_dynamic
Do vật lý điều khiển: rơi, va, lăn, bị đẩy. Thùng, bóng, mảnh vỡ.
Definition njin_physics3d.h:14
Các tham số
ctxContext của engine.
descMô tả khớp.
Giá trị trả về
Handle của khớp, hoặc không hợp lệ nếu a không hợp lệ.

◆ joint3d_destroy()

void njin::joint3d_destroy ( context & ctx,
joint3d_handle handle )

Hủy khớp.

Hủy một body cũng hủy mọi khớp của nó. Handle không hợp lệ bị bỏ qua.

Các tham số
ctxContext của engine.
handleKhớp.

◆ joint3d_set_motor()

void njin::joint3d_set_motor ( context & ctx,
joint3d_handle handle,
f32 speed )

Đặt tốc độ mô-tơ của một bản lề (độ mỗi giây) hay khớp trượt (đơn vị mỗi giây), trong giới hạn joint3d_desc::motor_force.

0 là đứng lại và giữ yên.

Các tham số
ctxContext của engine.
handleKhớp có motor_force lớn hơn 0.
speedTốc độ.

◆ joint3d_position()

f32 njin::joint3d_position ( const context & ctx,
joint3d_handle handle )

Góc hiện tại của bản lề (độ) hoặc quãng trượt của khớp trượt (đơn vị), tính từ lúc tạo khớp.

Các tham số
ctxContext của engine.
handleKhớp.
Giá trị trả về
Giá trị, 0 với loại khớp khác hay handle không hợp lệ.

◆ joint3d_set_motor_force()

void njin::joint3d_set_motor_force ( context & ctx,
joint3d_handle handle,
f32 force )

Đổi lực tối đa của mô-tơ (joint3d_desc::motor_force) lúc đang chạy: chân ga, động cơ dây chun yếu dần khi dây nhả ra.

Lớn hơn 0 là bật mô-tơ (tốc độ giữ theo joint3d_set_motor(), mặc định 0 là giữ yên), 0 là tắt hẳn: khớp quay hay trượt tự do.

// Động cơ dây chun: vặn trục theo chiều dương `turns` vòng; nhả ra, dây kéo trục
// quay ngược lại với mô-men giảm dần theo số vòng còn lại.
turns += njin::joint3d_speed(ctx, axle) / 360.0f * dt;
njin::joint3d_set_motor(ctx, axle, turns > 0 ? -3600.0f : 0.0f);
njin::joint3d_set_motor_force(ctx, axle, std::max(turns, 0.0f) * 2.0f); // 2 N·m mỗi vòng
void joint3d_set_motor_force(context &ctx, joint3d_handle handle, f32 force)
Đổi lực tối đa của mô-tơ (joint3d_desc::motor_force) lúc đang chạy: chân ga, động cơ dây chun yếu dần...
void joint3d_set_motor(context &ctx, joint3d_handle handle, f32 speed)
Đặt tốc độ mô-tơ của một bản lề (độ mỗi giây) hay khớp trượt (đơn vị mỗi giây), trong giới hạn joint3...
Các tham số
ctxContext của engine.
handleBản lề hoặc khớp trượt; loại khác bị bỏ qua.
forceLực tối đa (bản lề: mô-men, N·m), không âm.

◆ joint3d_speed()

f32 njin::joint3d_speed ( const context & ctx,
joint3d_handle handle )

Tốc độ hiện tại của bản lề (độ mỗi giây, cùng chiều với joint3d_position()) hoặc của khớp trượt (đơn vị mỗi giây): đếm số vòng đã quay, lực đẩy cánh quạt.

Các tham số
ctxContext của engine.
handleKhớp.
Giá trị trả về
Tốc độ, 0 với loại khớp khác hay handle không hợp lệ.

◆ joint3d_force()

f32 njin::joint3d_force ( const context & ctx,
joint3d_handle handle )

Lực khớp đang chịu để giữ hai body theo luật của nó (giữ điểm nối, giới hạn, mô-tơ, căng dây), ở bước vật lý vừa rồi, N.

So với một ngưỡng để làm máy hỏng: lớn quá thì joint3d_destroy() (răng gãy, xích tuột, mối hàn bung).

Các tham số
ctxContext của engine.
handleKhớp.
Giá trị trả về
Lực, 0 với khớp chỉ giữ góc (njin::joint3d_gear) hay handle không hợp lệ.

◆ joint3d_torque()

f32 njin::joint3d_torque ( const context & ctx,
joint3d_handle handle )

Mô-men khớp đang chịu để giữ góc giữa hai body (bản lề giữ trục, giới hạn góc, mô-tơ, bánh răng truyền lực), ở bước vật lý vừa rồi, N·m.

Tính quanh điểm khớp giữ: anchor của bản lề, nhưng tâm body a với njin::joint3d_fixed. Vì vậy tấm ván hàn vào tường mà bị đè chỉ báo lực (joint3d_force()), không báo mô-men ở chân; muốn đo mô-men bẻ gãy ở chân thì gắn bằng bản lề có giới hạn hẹp (min = -0.5, max = 0.5) đặt anchor tại đó.

Các tham số
ctxContext của engine.
handleKhớp.
Giá trị trả về
Mô-men, 0 với khớp không giữ góc (khớp cầu, khoảng cách, ròng rọc) hay handle không hợp lệ.

◆ ragdoll3d_create()

ragdoll3d_handle njin::ragdoll3d_create ( context & ctx,
const ragdoll3d_desc & desc )

Biến một model có xương thành ragdoll: mỗi phần là một body động, nối với phần cha bằng khớp có giới hạn góc, rơi và va chạm như mọi body.

Các phần của cùng một ragdoll không bao giờ va vào nhau, chỉ va với thế giới. Các xương không có phần (ngón tay, đầu ngón chân, gốc) đi theo phần gần nhất phía trên chúng.

// Mannequin của Quaternius ngã xuống từ tư thế đang vẽ.
const njin::ragdoll3d_bone parts[] = {
{.name = "pelvis"},
{.name = "spine_02", .swing = 20, .twist = 15},
{.name = "Head", .swing = 40, .twist = 40},
{.name = "upperarm_l", .swing = 70, .twist = 30},
{.name = "lowerarm_l", .bend_min = 0, .bend_max = 140},
{.name = "thigh_l", .swing = 50, .twist = 15},
{.name = "calf_l", .bend_min = 0, .bend_max = 140},
// ... bên phải như bên trái
};
rag = njin::ragdoll3d_create(ctx, {.model = man, .transform = at, .pose = pose,
.bones = parts, .bone_count = std::size(parts)});
ragdoll3d_handle ragdoll3d_create(context &ctx, const ragdoll3d_desc &desc)
Biến một model có xương thành ragdoll: mỗi phần là một body động, nối với phần cha bằng khớp có giới ...
Một phần của ragdoll: một xương của model thành một viên nang vật lý dọc theo trục y của xương (hướng...
Definition njin_physics3d.h:613
Các tham số
ctxContext của engine.
descMô tả ragdoll.
Giá trị trả về
Handle, hoặc không hợp lệ (có cảnh báo trong log) nếu model không có xương, có tên xương không tìm thấy hay trùng nhau, hoặc các phần không nối thành một cây.

◆ ragdoll3d_destroy()

void njin::ragdoll3d_destroy ( context & ctx,
ragdoll3d_handle handle )

Hủy ragdoll cùng các body của nó.

Handle không hợp lệ bị bỏ qua.

Các tham số
ctxContext của engine.
handleRagdoll.

◆ ragdoll3d_body()

body3d_handle njin::ragdoll3d_body ( const context & ctx,
ragdoll3d_handle handle,
i32 part )

Body của một phần, để đẩy (body3d_add_impulse()), đọc vị trí, hay nhận ra phần bị trúng trong physics3d_raycast() và physics3d_contact().

Không hủy nó bằng body3d_destroy(): hủy cả ragdoll.

Các tham số
ctxContext của engine.
handleRagdoll.
partChỉ số trong ragdoll3d_desc::bones.
Giá trị trả về
Body, hoặc không hợp lệ nếu handle hay part không hợp lệ.

◆ ragdoll3d_shape()

shape3d njin::ragdoll3d_shape ( const context & ctx,
ragdoll3d_handle handle,
i32 part )

Hình va chạm của một phần, trong thế giới: viên nang (hoặc hình cầu) mà engine đo từ da, đặt theo body của phần đó lúc này.

Để vẽ debug, ví dụ bằng gizmo hay draw_shape3d().

Các tham số
ctxContext của engine.
handleRagdoll.
partChỉ số trong ragdoll3d_desc::bones.
Giá trị trả về
Hình (njin::shape3d_capsule hoặc njin::shape3d_sphere), hoặc radius 0 nếu handle hay part không hợp lệ.

◆ ragdoll3d_bones()

i32 njin::ragdoll3d_bones ( const context & ctx,
ragdoll3d_handle handle,
const transform3d & transform,
bone_pose3d * out,
i32 count )

Tư thế hiện tại của ragdoll, để vẽ model bằng model_pose::bones ở transform (thường là ragdoll3d_desc::transform).

static njin::bone_pose3d bones[128];
njin::ragdoll3d_bones(ctx, rag, at, bones, 128);
njin::draw_model_anim(ctx, man, at, {.bones = bones});
void draw_model_anim(const context &ctx, model_handle handle, const transform3d &transform, const model_pose &pose, rgba tint=colors::white)
Vẽ model có xương ở tư thế pose.
i32 ragdoll3d_bones(const context &ctx, ragdoll3d_handle handle, const transform3d &transform, bone_pose3d *out, i32 count)
Tư thế hiện tại của ragdoll, để vẽ model bằng model_pose::bones ở transform (thường là ragdoll3d_desc...
Một xương ở một tư thế: vị trí và ba trục của nó trong không gian của model (trước transform của lần ...
Definition njin_3d.h:771
Các tham số
ctxContext của engine.
handleRagdoll.
transformChỗ model sẽ được vẽ.
outMảng nhận tư thế, model_bone_count() phần tử.
countSố phần tử của out.
Giá trị trả về
Số xương đã ghi (model_bone_count()), 0 nếu handle không hợp lệ hay count nhỏ hơn số xương.

◆ softbody3d_create()

softbody3d_handle njin::softbody3d_create ( context & ctx,
const softbody3d_desc & desc )

Tạo một vật mềm.

Vật mềm va chạm với mọi body (rơi lên sàn, quấn quanh thùng) và với nhau (njin::softbody3d_desc::collide_soft). Nhân vật (character3d_create()) đứng được trên mặt trên của nó, còn mặt đứng thì nhân vật đẩy các đỉnh sang bên khi đi qua, nên một tấm rèm không chặn đường. physics3d_raycast() và các hàm dò physics3d_*_push, _cast đi xuyên qua vật mềm; các bản có tham số njin::soft3d_hit thì trúng nó.

// Quả bóng nảy: mặt cầu có áp suất, rơi từ độ cao 3 m.
ctx, {.kind = njin::softbody3d_sphere, .position = {0, 3, 0}, .radius = 0.5f, .pressure = 200});
// Mỗi khung, giữa begin_3d() và end_3d():
void draw_model(const context &ctx, model_handle handle, const transform3d &transform, rgba tint=colors::white)
Vẽ model tại transform, với vật liệu của nó (model_material_set()).
model_handle softbody3d_model(context &ctx, softbody3d_handle handle)
Một model luôn có hình hiện tại của vật mềm, trong thế giới: engine cập nhật nó sau mỗi bước vật lý.
softbody3d_handle softbody3d_create(context &ctx, const softbody3d_desc &desc)
Tạo một vật mềm.
@ softbody3d_sphere
Mặt cầu bán kính radius, rỗng: thêm pressure để thành quả bóng.
Definition njin_physics3d.h:725
Định danh của một vật mềm (vải, bóng, khối cao su), tạo bởi softbody3d_create() hoặc cloth3d_create()...
Definition _types.h:196
Các tham số
ctxContext của engine.
descMô tả vật mềm.
Giá trị trả về
Handle, hoặc không hợp lệ (có cảnh báo trong log) nếu lưới không dùng được.

◆ cloth3d_create()

softbody3d_handle njin::cloth3d_create ( context & ctx,
const cloth3d_desc & desc )

Tạo một tấm vải: lá cờ, rèm, áo choàng, khăn trải bàn.

Là một vật mềm như softbody3d_create() tạo ra, dùng chung các hàm softbody3d_*. Vẽ được từ cả hai mặt.

// Lá cờ ghim cạnh trái vào cột, bay theo gió.
ctx, {.position = {1, 4, 0}, .size = {2, 1.2f}, .columns = 20, .rows = 12, .pin_edges = njin::cloth3d_left});
njin::softbody3d_set_wind(ctx, flag, {6, 0, 1});
void softbody3d_set_wind(context &ctx, softbody3d_handle handle, vec3 wind)
Đặt gió thổi qua vật mềm, vận tốc của không khí (đơn vị mỗi giây).
softbody3d_handle cloth3d_create(context &ctx, const cloth3d_desc &desc)
Tạo một tấm vải: lá cờ, rèm, áo choàng, khăn trải bàn.
@ cloth3d_left
Cột đầu (cột 0).
Definition njin_physics3d.h:811
Các tham số
ctxContext của engine.
descMô tả tấm vải.
Giá trị trả về
Handle, hoặc không hợp lệ nếu columns hay rows ngoài khoảng.

◆ softbody3d_destroy()

void njin::softbody3d_destroy ( context & ctx,
softbody3d_handle handle )

Hủy vật mềm cùng model của nó (softbody3d_model()).

Handle không hợp lệ bị bỏ qua.

Các tham số
ctxContext của engine.
handleVật mềm.

◆ softbody3d_vertex_count()

i32 njin::softbody3d_vertex_count ( const context & ctx,
softbody3d_handle handle )

Số đỉnh của vật mềm.

Các tham số
ctxContext của engine.
handleVật mềm.
Giá trị trả về
Số đỉnh, 0 nếu handle không hợp lệ.

◆ softbody3d_vertices()

i32 njin::softbody3d_vertices ( const context & ctx,
softbody3d_handle handle,
vec3 * out,
i32 count )

Vị trí hiện tại của các đỉnh, trong thế giới.

Các tham số
ctxContext của engine.
handleVật mềm.
outMảng nhận vị trí, hoặc nullptr để chỉ đếm.
countSố phần tử của out.
Giá trị trả về
Số đỉnh (softbody3d_vertex_count()); chỉ count đỉnh đầu được ghi.

◆ softbody3d_normals()

i32 njin::softbody3d_normals ( const context & ctx,
softbody3d_handle handle,
vec3 * out,
i32 count )

Pháp tuyến hiện tại của các đỉnh (độ dài 1, trung bình các tam giác chung đỉnh, hướng ra ngoài hay về phía trước của vải), để tự vẽ vật mềm.

Các tham số
ctxContext của engine.
handleVật mềm.
outMảng nhận pháp tuyến, hoặc nullptr để chỉ đếm.
countSố phần tử của out.
Giá trị trả về
Số đỉnh; chỉ count đỉnh đầu được ghi.

◆ softbody3d_indices()

i32 njin::softbody3d_indices ( const context & ctx,
softbody3d_handle handle,
u32 * out,
i32 count )

Các tam giác của mặt vật mềm, ba chỉ số đỉnh mỗi tam giác, ngược chiều kim đồng hồ nhìn từ ngoài (từ phía trước của vải, phía +z lúc tạo).

Các tham số
ctxContext của engine.
handleVật mềm.
outMảng nhận chỉ số, hoặc nullptr để chỉ đếm.
countSố phần tử của out.
Giá trị trả về
Số chỉ số (gấp ba số tam giác); chỉ count số đầu được ghi.

◆ softbody3d_model()

model_handle njin::softbody3d_model ( context & ctx,
softbody3d_handle handle )

Một model luôn có hình hiện tại của vật mềm, trong thế giới: engine cập nhật nó sau mỗi bước vật lý.

Vẽ bằng draw_model() với transform mặc định, đổi màu và ảnh bằng model_material_set(). Model thuộc về vật mềm: không model_unload() nó, softbody3d_destroy() làm việc đó. Vải có cả mặt sau.

Các tham số
ctxContext của engine.
handleVật mềm.
Giá trị trả về
Model, hoặc không hợp lệ nếu handle không hợp lệ. Vật nhiều đỉnh (quá 65535, vải tính gấp đôi) được chia thành nhiều lưới trong cùng một model.

◆ softbody3d_nearest()

i32 njin::softbody3d_nearest ( const context & ctx,
softbody3d_handle handle,
vec3 point )

Đỉnh gần point nhất, để ghim hay kéo một chỗ của vật mềm.

Các tham số
ctxContext của engine.
handleVật mềm.
pointĐiểm, thế giới.
Giá trị trả về
Chỉ số đỉnh, -1 nếu handle không hợp lệ.

◆ softbody3d_pin()

void njin::softbody3d_pin ( context & ctx,
softbody3d_handle handle,
i32 vertex,
bool pinned )

Ghim hay bỏ ghim một đỉnh.

Đỉnh bị ghim đứng yên (trọng lực, va chạm, lò xo không dời được nó) cho đến khi softbody3d_move_pinned() dời nó.

Các tham số
ctxContext của engine.
handleVật mềm.
vertexChỉ số đỉnh.
pinnedtrue là ghim.

◆ softbody3d_move_pinned()

void njin::softbody3d_move_pinned ( context & ctx,
softbody3d_handle handle,
i32 vertex,
vec3 position )

Cho một đỉnh bị ghim tới position sau bước vật lý tới, kéo phần còn lại theo: áo choàng ghim vào vai đang chạy, rèm kéo trên thanh treo.

Gọi mỗi bước cố định với vị trí mới; không gọi nữa thì đỉnh đứng lại ở đó.

Các tham số
ctxContext của engine.
handleVật mềm.
vertexChỉ số một đỉnh bị ghim; đỉnh không bị ghim thì bỏ qua.
positionVị trí muốn tới, thế giới.

◆ softbody3d_set_wind()

void njin::softbody3d_set_wind ( context & ctx,
softbody3d_handle handle,
vec3 wind )

Đặt gió thổi qua vật mềm, vận tốc của không khí (đơn vị mỗi giây).

Mặt nào chắn gió thì bị đẩy theo drag và diện tích của nó, nên vải bay phần phật còn bóng chỉ trôi nhẹ. Mặc định không có gió (không khí đứng yên vẫn cản vật mềm đang chuyển động).

Các tham số
ctxContext của engine.
handleVật mềm.
windVận tốc gió.

◆ softbody3d_add_impulse()

void njin::softbody3d_add_impulse ( context & ctx,
softbody3d_handle handle,
vec3 impulse )

Đẩy cả vật mềm một cú (xung lực, kg * đơn vị mỗi giây), chia đều cho các đỉnh không bị ghim: cú đá vào quả bóng.

Các tham số
ctxContext của engine.
handleVật mềm.
impulseXung lực.

◆ softbody3d_position()

vec3 njin::softbody3d_position ( const context & ctx,
softbody3d_handle handle )

Tâm của vật mềm (trung bình các đỉnh), để camera đi theo hay đặt âm thanh.

Các tham số
ctxContext của engine.
handleVật mềm.
Giá trị trả về
Tâm, thế giới; 0 nếu handle không hợp lệ.

◆ softbody3d_user()

u64 njin::softbody3d_user ( const context & ctx,
softbody3d_handle handle )

Số của game gắn vào vật mềm lúc tạo.

Các tham số
ctxContext của engine.
handleVật mềm.
Giá trị trả về
Số đó, hoặc 0 nếu handle không hợp lệ.

◆ softbody3d_draw_debug()

void njin::softbody3d_draw_debug ( context & ctx,
softbody3d_handle handle,
rgba color = {0.3f, 0.9f, 1.0f, 1.0f} )

Vẽ vật mềm bằng gizmo (njin_gizmo.h) cho frame này: các cạnh của mặt, và đỉnh bị ghim là chấm đỏ.

Gọi mỗi frame, ở phase nào cũng được.

Các tham số
ctxContext của engine.
handleVật mềm.
colorMàu các cạnh.

◆ vehicle3d_create()

vehicle3d_handle njin::vehicle3d_create ( context & ctx,
const vehicle3d_desc & desc )

Tạo một xe có bánh: thân xe là body động, mỗi bánh là một giảm xóc dò mặt đất (không phải body), có động cơ, hộp số tự động, vi sai, phanh và phanh tay.

Lái bằng vehicle3d_set_input() mỗi bước cố định.

car = njin::vehicle3d_create(ctx, {.position = {0, 1, 0}});
// Mỗi bước cố định:
njin::vehicle3d_set_input(ctx, car, njin::axis_value(ctx, gas), njin::axis_value(ctx, steer), 0.0f,
njin::action_held(ctx, handbrake) ? 1.0f : 0.0f);
// Vẽ thân xe theo body3d_transform(ctx, njin::vehicle3d_body(ctx, car)), mỗi bánh theo
// vehicle3d_wheel_transform().
bool action_held(const context &ctx, action_handle handle)
Đúng khi một trong các nguồn của action đã được giữ từ frame trước và vẫn đang giữ.
f32 axis_value(const context &ctx, axis_handle handle)
Giá trị hiện tại của axis.
void vehicle3d_set_input(context &ctx, vehicle3d_handle handle, f32 throttle, f32 steer, f32 brake, f32 handbrake)
Đặt cách lái cho bước vật lý tới.
vehicle3d_handle vehicle3d_create(context &ctx, const vehicle3d_desc &desc)
Tạo một xe có bánh: thân xe là body động, mỗi bánh là một giảm xóc dò mặt đất (không phải body),...
Các tham số
ctxContext của engine.
descMô tả xe.
Giá trị trả về
Handle, hoặc không hợp lệ nếu thân xe không dựng được hay không có bánh.

◆ vehicle3d_destroy()

void njin::vehicle3d_destroy ( context & ctx,
vehicle3d_handle handle )

Hủy xe cùng thân xe.

Handle không hợp lệ bị bỏ qua.

Các tham số
ctxContext của engine.
handleXe.

◆ vehicle3d_set_input()

void njin::vehicle3d_set_input ( context & ctx,
vehicle3d_handle handle,
f32 throttle,
f32 steer,
f32 brake,
f32 handbrake )

Đặt cách lái cho bước vật lý tới.

Giữ nguyên cho tới lần gọi sau. Dùng cho mọi loại xe: xe máy (motorcycle3d_create()) nghiêng vào cua theo steer; xe bánh xích (tracked3d_create()) rẽ bằng hai dải xích, quay tại chỗ khi gần đứng yên mà chỉ lái không ga, và handbrake là phanh.

Các tham số
ctxContext của engine.
handleXe.
throttleGa, -1 (lùi) .. 1 (tiến). Đang chạy tới mà ga âm thì xe phanh trước, dừng hẳn rồi mới lùi.
steerLái, -1 (trái) .. 1 (phải).
brakePhanh, 0..1.
handbrakePhanh tay, 0..1.

◆ vehicle3d_body()

body3d_handle njin::vehicle3d_body ( const context & ctx,
vehicle3d_handle handle )

Thân xe, để đọc vị trí (body3d_transform()), vận tốc, hay đẩy nó.

Không hủy nó bằng body3d_destroy(): hủy cả xe.

Các tham số
ctxContext của engine.
handleXe.
Giá trị trả về
Body, hoặc không hợp lệ nếu handle không hợp lệ.

◆ vehicle3d_wheel_count()

i32 njin::vehicle3d_wheel_count ( const context & ctx,
vehicle3d_handle handle )

Số bánh của xe.

Các tham số
ctxContext của engine.
handleXe.
Giá trị trả về
Số bánh, 0 nếu handle không hợp lệ.

◆ vehicle3d_wheel_transform()

transform3d njin::vehicle3d_wheel_transform ( const context & ctx,
vehicle3d_handle handle,
i32 wheel )

Chỗ và góc của một bánh lúc này (đã tính giảm xóc, góc lái và bánh quay), trong thế giới.

Trục y của transform là trục bánh, nên vẽ được bằng một hình trụ (njin::shape3d_cylinder, radius là bán kính bánh, height là bề rộng).

Các tham số
ctxContext của engine.
handleXe.
wheelChỉ số bánh.
Giá trị trả về
Vị trí và góc xoay, độ; mặc định nếu handle hay wheel không hợp lệ.

◆ vehicle3d_wheel_grounded()

bool njin::vehicle3d_wheel_grounded ( const context & ctx,
vehicle3d_handle handle,
i32 wheel )

Bánh có đang chạm đất không.

Các tham số
ctxContext của engine.
handleXe.
wheelChỉ số bánh.
Giá trị trả về
true nếu chạm.

◆ vehicle3d_rpm()

f32 njin::vehicle3d_rpm ( const context & ctx,
vehicle3d_handle handle )

Vòng tua động cơ lúc này, cho tiếng máy và đồng hồ.

Các tham số
ctxContext của engine.
handleXe.
Giá trị trả về
Vòng mỗi phút, 0 nếu handle không hợp lệ.

◆ vehicle3d_gear()

i32 njin::vehicle3d_gear ( const context & ctx,
vehicle3d_handle handle )

Số đang vào: -1 số lùi, 0 số không, 1 trở lên là số tiến.

Các tham số
ctxContext của engine.
handleXe.
Giá trị trả về
Số, 0 nếu handle không hợp lệ.

◆ motorcycle3d_create()

vehicle3d_handle njin::motorcycle3d_create ( context & ctx,
const motorcycle3d_desc & desc )

Tạo một xe máy (bộ điều khiển xe máy của Jolt): một lò xo giữ xe đứng thẳng và nghiêng vào cua theo tốc độ và góc lái, nên xe không đổ khi đứng yên hay chạy chậm.

Là một njin::vehicle3d_handle: lái bằng vehicle3d_set_input() (phanh tay khóa bánh sau), vẽ bằng vehicle3d_body() và vehicle3d_wheel_transform(), mọi hàm vehicle3d_* dùng được.

bike = njin::motorcycle3d_create(ctx, {.position = {0, 1, 0}});
// Mỗi bước cố định: ga, lái, phanh.
njin::vehicle3d_set_input(ctx, bike, gas, steer, brake, 0.0f);
vehicle3d_handle motorcycle3d_create(context &ctx, const motorcycle3d_desc &desc)
Tạo một xe máy (bộ điều khiển xe máy của Jolt): một lò xo giữ xe đứng thẳng và nghiêng vào cua theo t...
Các tham số
ctxContext của engine.
descMô tả xe.
Giá trị trả về
Handle, hoặc không hợp lệ nếu thân xe không dựng được.

◆ tracked3d_create()

vehicle3d_handle njin::tracked3d_create ( context & ctx,
const tracked3d_desc & desc )

Tạo một xe bánh xích (bộ điều khiển xe xích của Jolt): rẽ bằng cách cho hai dải xích chạy khác tốc độ, quay tại chỗ khi chúng chạy ngược chiều nhau.

Là một njin::vehicle3d_handle: vehicle3d_set_input() lái như ô tô (đứng yên mà chỉ lái thì xe quay tại chỗ), vehicle3d_set_tracks() điều khiển từng dải xích, vehicle3d_track_speed() cho tốc độ xích để cuộn ảnh của nó.

Các tham số
ctxContext của engine.
descMô tả xe.
Giá trị trả về
Handle, hoặc không hợp lệ nếu thân xe không dựng được.

◆ vehicle3d_set_tracks()

void njin::vehicle3d_set_tracks ( context & ctx,
vehicle3d_handle handle,
f32 left,
f32 right,
f32 brake )

Điều khiển thẳng hai dải xích của xe bánh xích cho bước vật lý tới, giữ nguyên tới lần gọi sau: mỗi bên -1 (lùi hết cỡ) .

. 1 (tiến hết cỡ). left = 1, right = -1 là quay tại chỗ sang phải. Xe không phải bánh xích thì bỏ qua.

Các tham số
ctxContext của engine.
handleXe bánh xích (tracked3d_create()).
leftDải xích trái (phía +x).
rightDải xích phải (phía -x).
brakePhanh, 0..1.

◆ vehicle3d_track_speed()

f32 njin::vehicle3d_track_speed ( const context & ctx,
vehicle3d_handle handle,
i32 side )

Tốc độ của một dải xích, để cuộn ảnh xích theo đúng tốc độ xe chạy.

Các tham số
ctxContext của engine.
handleXe bánh xích.
side0 là dải trái (+x), 1 là dải phải (-x).
Giá trị trả về
Đơn vị thế giới mỗi giây, âm khi xích chạy lùi; 0 nếu không phải xe bánh xích.

◆ vehicle3d_draw_debug()

void njin::vehicle3d_draw_debug ( context & ctx,
vehicle3d_handle handle,
rgba color = {1.0f, 0.6f, 0.2f, 1.0f} )

Vẽ xe bằng gizmo (njin_gizmo.h) cho frame này: hộp thân xe, mỗi bánh là một vòng tròn với trục, giảm xóc từ chỗ gắn tới tâm bánh, và điểm bánh chạm đất (vàng).

Gọi mỗi frame, ở phase nào cũng được.

Các tham số
ctxContext của engine.
handleXe.
colorMàu thân và bánh.

◆ physics3d_set_gravity()

void njin::physics3d_set_gravity ( context & ctx,
vec3 gravity )

Đặt trọng lực cho body động.

Mặc định {0, -9.81, 0}. Nhân vật không dùng giá trị này: game tự cộng trọng lực vào vận tốc của nó.

Các tham số
ctxContext của engine.
gravityGia tốc, đơn vị mỗi giây bình phương.

◆ physics3d_gravity()

vec3 njin::physics3d_gravity ( const context & ctx)

Trọng lực đang dùng cho body động.

Các tham số
ctxContext của engine.
Giá trị trả về
Gia tốc.