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
Đường cong

Catmull-Rom và Bezier 2D, 3D: đi đều theo khoảng cách, điểm gần nhất, vật đi dọc đường. Tiếp...

Classes

struct  njin::spline3d
 Một đường cong 3D: đường ray của camera, bục di chuyển, lối bay, đường tuần tra. Tiếp...
struct  njin::spline2d
 Như njin::spline3d, trên mặt phẳng: đường đi của quái 2D, quỹ đạo đạn cong. Tiếp...
struct  njin::spline_follower
 Trạng thái của một vật đi dọc đường với tốc độ đều: camera trên ray, bục di chuyển, quái tuần tra. Tiếp...

Enumerations

enum  njin::spline_kind { njin::spline_catmull_rom , njin::spline_bezier }
 Loại đường cong của một spline. Tiếp...
enum  njin::spline_end { njin::spline_stop , njin::spline_loop , njin::spline_ping_pong }
 Khi đến cuối đường thì làm gì. Tiếp...

Các hàm

void njin::spline_bake (spline3d &spline, i32 steps=64)
 Lập bảng độ dài sau khi sửa điểm.
void njin::spline_bake (spline2d &spline, i32 steps=64)
 Lập bảng độ dài sau khi sửa điểm.
i32 njin::spline_segment_count (const spline3d &spline)
 Số đoạn: t của spline_point() chạy từ 0 đến số này.
i32 njin::spline_segment_count (const spline2d &spline)
 Số đoạn: t của spline_point() chạy từ 0 đến số này.
vec3 njin::spline_point (const spline3d &spline, f32 t)
 Điểm trên đường ở tham số t: phần nguyên là đoạn, phần lẻ là vị trí trong đoạn.
vec2 njin::spline_point (const spline2d &spline, f32 t)
 Điểm trên đường ở tham số t: phần nguyên là đoạn, phần lẻ là vị trí trong đoạn.
vec3 njin::spline_tangent (const spline3d &spline, f32 t)
 Hướng của đường ở tham số t, độ dài 1.
vec2 njin::spline_tangent (const spline2d &spline, f32 t)
 Hướng của đường ở tham số t, độ dài 1.
f32 njin::spline_length (const spline3d &spline)
 Độ dài cả đường.
f32 njin::spline_length (const spline2d &spline)
 Độ dài cả đường.
f32 njin::spline_t_at (const spline3d &spline, f32 distance)
 Tham số t ở khoảng cách distance tính từ đầu đường.
f32 njin::spline_t_at (const spline2d &spline, f32 distance)
 Tham số t ở khoảng cách distance tính từ đầu đường.
vec3 njin::spline_point_at (const spline3d &spline, f32 distance)
 Điểm ở khoảng cách distance tính từ đầu đường: đi đều theo khoảng cách.
vec2 njin::spline_point_at (const spline2d &spline, f32 distance)
 Điểm ở khoảng cách distance tính từ đầu đường: đi đều theo khoảng cách.
vec3 njin::spline_tangent_at (const spline3d &spline, f32 distance)
 Hướng ở khoảng cách distance, độ dài 1.
vec2 njin::spline_tangent_at (const spline2d &spline, f32 distance)
 Hướng ở khoảng cách distance, độ dài 1.
f32 njin::spline_nearest (const spline3d &spline, vec3 p, vec3 *out_point=nullptr)
 Chỗ gần p nhất trên đường: để bám vào đường ray, biết người chơi đã đi được bao xa trên đường đua.
f32 njin::spline_nearest (const spline2d &spline, vec2 p, vec2 *out_point=nullptr)
 Chỗ gần p nhất trên đường: để bám vào đường ray, biết người chơi đã đi được bao xa trên đường đua.
vec3 njin::spline_follow (const spline3d &spline, spline_follower &follower, f32 dt)
 Đi tiếp dt giây dọc đường và trả về chỗ mới.
vec2 njin::spline_follow (const spline2d &spline, spline_follower &follower, f32 dt)
 Đi tiếp dt giây dọc đường và trả về chỗ mới.
void njin::spline_draw_debug (context &ctx, const spline3d &spline, rgba color={1.0f, 0.8f, 0.2f, 1.0f})
 Vẽ đường và các điểm điều khiển bằng gizmo (njin_gizmo.h) trong frame này.
void njin::spline_draw_debug (context &ctx, const spline2d &spline, rgba color={1.0f, 0.8f, 0.2f, 1.0f})
 Vẽ đường và các điểm điều khiển bằng gizmo (njin_gizmo.h) trong frame này.

Mô tả chi tiết

Catmull-Rom và Bezier 2D, 3D: đi đều theo khoảng cách, điểm gần nhất, vật đi dọc đường.

Thông tin về Enumeration Type

◆ spline_kind

Loại đường cong của một spline.

Enumerator
spline_catmull_rom 

Catmull-Rom: đường đi qua mọi điểm.

Dễ đặt nhất: chấm các điểm đường ray, đường bay, lối tuần tra. Dạng alpha = 0.5 (centripetal) không tạo nút thắt hay vòng xoắn khi các điểm cách nhau không đều.

spline_bezier 

Bezier bậc ba: điểm 0, 3, 6... nằm trên đường, hai điểm giữa mỗi cặp là tay cầm kéo đường cong (như công cụ pen của trình vẽ).

Đường mở cần 3k + 1 điểm, đường kín 3k điểm; điểm thừa bị bỏ.

◆ spline_end

Khi đến cuối đường thì làm gì.

Enumerator
spline_stop 

Dừng ở cuối, finished thành true.

spline_loop 

Quay về đầu (đường kín thì đi tiếp vòng mới).

spline_ping_pong 

Quay đầu đi ngược lại, rồi lại quay đầu ở đầu đường.

Thông tin về hàm

◆ spline_bake() [1/2]

void njin::spline_bake ( spline3d & spline,
i32 steps = 64 )

Lập bảng độ dài sau khi sửa điểm.

Thiếu bảng thì các hàm theo khoảng cách tự lập một bảng tạm mỗi lần gọi (đúng nhưng chậm).

Các tham số
splineĐường cong.
stepsSố mẫu mỗi đoạn, 2..1024: nhiều thì khoảng cách chính xác hơn. 64 là đủ cho tốc độ đều trong 1%.

◆ spline_bake() [2/2]

void njin::spline_bake ( spline2d & spline,
i32 steps = 64 )

Lập bảng độ dài sau khi sửa điểm.

Thiếu bảng thì các hàm theo khoảng cách tự lập một bảng tạm mỗi lần gọi (đúng nhưng chậm).

Các tham số
splineĐường cong.
stepsSố mẫu mỗi đoạn, 2..1024: nhiều thì khoảng cách chính xác hơn. 64 là đủ cho tốc độ đều trong 1%.

◆ spline_segment_count() [1/2]

i32 njin::spline_segment_count ( const spline3d & spline)

Số đoạn: t của spline_point() chạy từ 0 đến số này.

Các tham số
splineĐường cong.
Giá trị trả về
Số đoạn, 0 nếu không đủ điểm (cần 2 điểm cho Catmull-Rom, 4 cho Bezier mở).

◆ spline_segment_count() [2/2]

i32 njin::spline_segment_count ( const spline2d & spline)

Số đoạn: t của spline_point() chạy từ 0 đến số này.

Các tham số
splineĐường cong.
Giá trị trả về
Số đoạn, 0 nếu không đủ điểm (cần 2 điểm cho Catmull-Rom, 4 cho Bezier mở).

◆ spline_point() [1/2]

vec3 njin::spline_point ( const spline3d & spline,
f32 t )

Điểm trên đường ở tham số t: phần nguyên là đoạn, phần lẻ là vị trí trong đoạn.

Với Catmull-Rom, t nguyên là đúng điểm điều khiển thứ t. Tốc độ theo t không đều (đoạn dài đi nhanh hơn): đi theo khoảng cách thì dùng spline_point_at().

Các tham số
splineĐường cong.
t0..spline_segment_count(); ngoài khoảng bị kẹp (đường kín thì quay vòng).
Giá trị trả về
Điểm, hoặc điểm đầu nếu không đủ điểm.

◆ spline_point() [2/2]

vec2 njin::spline_point ( const spline2d & spline,
f32 t )

Điểm trên đường ở tham số t: phần nguyên là đoạn, phần lẻ là vị trí trong đoạn.

Với Catmull-Rom, t nguyên là đúng điểm điều khiển thứ t. Tốc độ theo t không đều (đoạn dài đi nhanh hơn): đi theo khoảng cách thì dùng spline_point_at().

Các tham số
splineĐường cong.
t0..spline_segment_count(); ngoài khoảng bị kẹp (đường kín thì quay vòng).
Giá trị trả về
Điểm, hoặc điểm đầu nếu không đủ điểm.

◆ spline_tangent() [1/2]

vec3 njin::spline_tangent ( const spline3d & spline,
f32 t )

Hướng của đường ở tham số t, độ dài 1.

Các tham số
splineĐường cong.
tNhư spline_point().
Giá trị trả về
Hướng, hoặc 0 nếu đường suy biến.

◆ spline_tangent() [2/2]

vec2 njin::spline_tangent ( const spline2d & spline,
f32 t )

Hướng của đường ở tham số t, độ dài 1.

Các tham số
splineĐường cong.
tNhư spline_point().
Giá trị trả về
Hướng, hoặc 0 nếu đường suy biến.

◆ spline_length() [1/2]

f32 njin::spline_length ( const spline3d & spline)

Độ dài cả đường.

Các tham số
splineĐường cong.
Giá trị trả về
Độ dài.

◆ spline_length() [2/2]

f32 njin::spline_length ( const spline2d & spline)

Độ dài cả đường.

Các tham số
splineĐường cong.
Giá trị trả về
Độ dài.

◆ spline_t_at() [1/2]

f32 njin::spline_t_at ( const spline3d & spline,
f32 distance )

Tham số t ở khoảng cách distance tính từ đầu đường.

Các tham số
splineĐường cong.
distance0..spline_length(); ngoài khoảng bị kẹp (đường kín thì quay vòng).
Giá trị trả về
Tham số t.

◆ spline_t_at() [2/2]

f32 njin::spline_t_at ( const spline2d & spline,
f32 distance )

Tham số t ở khoảng cách distance tính từ đầu đường.

Các tham số
splineĐường cong.
distance0..spline_length(); ngoài khoảng bị kẹp (đường kín thì quay vòng).
Giá trị trả về
Tham số t.

◆ spline_point_at() [1/2]

vec3 njin::spline_point_at ( const spline3d & spline,
f32 distance )

Điểm ở khoảng cách distance tính từ đầu đường: đi đều theo khoảng cách.

Các tham số
splineĐường cong.
distanceNhư spline_t_at().
Giá trị trả về
Điểm.

◆ spline_point_at() [2/2]

vec2 njin::spline_point_at ( const spline2d & spline,
f32 distance )

Điểm ở khoảng cách distance tính từ đầu đường: đi đều theo khoảng cách.

Các tham số
splineĐường cong.
distanceNhư spline_t_at().
Giá trị trả về
Điểm.

◆ spline_tangent_at() [1/2]

vec3 njin::spline_tangent_at ( const spline3d & spline,
f32 distance )

Hướng ở khoảng cách distance, độ dài 1.

Các tham số
splineĐường cong.
distanceNhư spline_t_at().
Giá trị trả về
Hướng.

◆ spline_tangent_at() [2/2]

vec2 njin::spline_tangent_at ( const spline2d & spline,
f32 distance )

Hướng ở khoảng cách distance, độ dài 1.

Các tham số
splineĐường cong.
distanceNhư spline_t_at().
Giá trị trả về
Hướng.

◆ spline_nearest() [1/2]

f32 njin::spline_nearest ( const spline3d & spline,
vec3 p,
vec3 * out_point = nullptr )

Chỗ gần p nhất trên đường: để bám vào đường ray, biết người chơi đã đi được bao xa trên đường đua.

Các tham số
splineĐường cong.
pĐiểm.
out_pointNhận điểm gần nhất, hoặc nullptr.
Giá trị trả về
Khoảng cách dọc đường tới điểm đó.

◆ spline_nearest() [2/2]

f32 njin::spline_nearest ( const spline2d & spline,
vec2 p,
vec2 * out_point = nullptr )

Chỗ gần p nhất trên đường: để bám vào đường ray, biết người chơi đã đi được bao xa trên đường đua.

Các tham số
splineĐường cong.
pĐiểm.
out_pointNhận điểm gần nhất, hoặc nullptr.
Giá trị trả về
Khoảng cách dọc đường tới điểm đó.

◆ spline_follow() [1/2]

vec3 njin::spline_follow ( const spline3d & spline,
spline_follower & follower,
f32 dt )

Đi tiếp dt giây dọc đường và trả về chỗ mới.

Hướng ở đó là spline_tangent_at(spline, follower.distance) (nhân -1 nếu đang đi ngược).

Các tham số
splineĐường cong.
followerTrạng thái, được cập nhật.
dtThời gian, giây (thường là delta()).
Giá trị trả về
Chỗ mới.

◆ spline_follow() [2/2]

vec2 njin::spline_follow ( const spline2d & spline,
spline_follower & follower,
f32 dt )

Đi tiếp dt giây dọc đường và trả về chỗ mới.

Hướng ở đó là spline_tangent_at(spline, follower.distance) (nhân -1 nếu đang đi ngược).

Các tham số
splineĐường cong.
followerTrạng thái, được cập nhật.
dtThời gian, giây (thường là delta()).
Giá trị trả về
Chỗ mới.

◆ spline_draw_debug() [1/2]

void njin::spline_draw_debug ( context & ctx,
const spline3d & spline,
rgba color = {1.0f, 0.8f, 0.2f, 1.0f} )

Vẽ đường và các điểm điều khiển bằng gizmo (njin_gizmo.h) trong frame này.

Các tham số
ctxContext của engine.
splineĐường cong.
colorMàu.

◆ spline_draw_debug() [2/2]

void njin::spline_draw_debug ( context & ctx,
const spline2d & spline,
rgba color = {1.0f, 0.8f, 0.2f, 1.0f} )

Vẽ đường và các điểm điều khiển bằng gizmo (njin_gizmo.h) trong frame này.

Các tham số
ctxContext của engine.
splineĐường cong.
colorMàu.