Lưới hoặc quadtree cho hàng nghìn hình tròn: k vật gần nhất, đẩy các vật chồng nhau ra.
Tiếp...
|
| void | njin::spatial_build (spatial_index &index, const spatial_desc &desc, const spatial_item *items, u32 count) |
| | Dựng (lại) index từ count vật.
|
| void | njin::spatial_build (spatial_index &index, const spatial_desc &desc, const std::vector< spatial_item > &items) |
| | Như bản trên, từ một vector.
|
| u32 | njin::spatial_size (const spatial_index &index) |
| | Số vật trong index.
|
| u32 | njin::spatial_nearest (const spatial_index &index, const spatial_query &q, spatial_hit *out, u32 k) |
| | Tìm tối đa k vật gần q.at nhất thỏa q, gần nhất trước.
|
| u32 | njin::spatial_nearest (const spatial_index &index, const spatial_query &q, std::vector< spatial_hit > &out, u32 k) |
| | Như bản trên; out được xóa rồi nhận kết quả.
|
| u32 | njin::spatial_separate (const spatial_index &index, std::vector< vec2 > &push, u32 k=6) |
| | Tính độ đẩy để các vật chồng nhau tách ra: va chạm mềm cho đám đông.
|
Lưới hoặc quadtree cho hàng nghìn hình tròn: k vật gần nhất, đẩy các vật chồng nhau ra.
Tính độ đẩy để các vật chồng nhau tách ra: va chạm mềm cho đám đông.
Mỗi vật không fixed bị đẩy bởi k vật chồng lên nó gần nhất: hai vật đều di chuyển được thì mỗi bên lùi một nửa phần chồng, vật fixed thì bên kia lùi hết. Vật cùng nhóm (khác 0) không đẩy nhau. Chỉ cộng lực của k vật gần nhất, nên giữa một cụm dày một vật không bị hàng chục vật cùng hất ra; phần chồng còn lại tan dần qua các frame. Độ đẩy tính từ vị trí lúc dựng, nên không phụ thuộc thứ tự, và không quá bán kính của vật.
Gọi mỗi frame sau khi dựng lại index, rồi cộng push[i] vào vị trí vật i.
- Các tham số
-
| index | Index đã dựng. |
| push | Nhận độ đẩy của từng vật, cùng số thứ tự với mảng đã dựng (0 với vật fixed và vật không chạm ai). |
| k | Số vật chồng gần nhất được xét cho mỗi vật. |
- Giá trị trả về
- Tổng số lần đẩy (một cặp hai vật di chuyển được tính hai lần).