Твердое тело (форма) в bullet/ammo.js из сетки в three.js
Я использую bullet/ammo.js с three.js. У меня есть 3D-сетка, и я хочу использовать точную форму для обнаружения столкновений с мягким телом. Есть ли способ, которым я могу создать трехмерное твердое тело (в пуле) из сетки (в three.js)?
Вот пример: http://kidzinski.com/miamisura/lazy3d/ (пожалуйста, подождите секунду, пока 3d-модель загрузится). У меня есть ткань, падающая на трехмерное тело, и мне нужно смоделировать столкновение этой ткани с телом.
Я новичок в этих рамках извините, если я что-то принципиально неправильно понял.
2 ответа
Похоже, вы можете сделать некоторую работу, чтобы превратить произвольную сетку Three.js в вогнутую сетку Bullet. Это поддерживается Physi.js, который является подключаемым решением для прямой связи Three.js с ammo.js. Я лично не рекомендовал бы использовать проект (Physi.js), но вы можете посмотреть на исходный код, чтобы увидеть, как они реализуют вогнутые сетки.
Сначала они перебирают геометрию, чтобы создать пользовательский список объектов данных "треугольник" в этих строках phys.js.
for ( i = 0; i < geometry.faces.length; i++ ) {
face = geometry.faces[i];
if ( face instanceof THREE.Face3) {
triangles.push([
...
Затем эти треугольники передаются в Ammo.js, чтобы сделать new Ammo.btBvhTriangleMeshShape
на этих линиях:
for ( i = 0; i < description.triangles.length; i++ ) {
...
triangle_mesh.addTriangle( _vec3_1, _vec3_2, _vec3_3, true );
}
...
shape = new Ammo.btBvhTriangleMeshShape( triangle_mesh, true, true );
Это должно стать хорошей отправной точкой для создания вашей собственной пользовательской сетки Ammo.js.
Вокруг сети много тем, что вогнутая сетка Physijs не работает при столкновении. Похоже, что btBvhTriangleMeshShape не предназначен для работы с конфликтами в ammo.js, как я выяснил, ища эту тему на форумах, связанных с маркерами.
Что сработало для меня, так это btConvexHullShape:
var triangle, triangle_mesh = new Ammo.btTriangleMesh;
var btConvexHullShape = new Ammo.btConvexHullShape();
var _vec3_1 = new Ammo.btVector3(0,0,0);
var _vec3_2 = new Ammo.btVector3(0,0,0);
var _vec3_3 = new Ammo.btVector3(0,0,0);
for ( i = 0; i < triangles.length; i++ ) {
triangle = triangles[i];
_vec3_1.setX(triangle[0].x);
_vec3_1.setY(triangle[0].y);
_vec3_1.setZ(triangle[0].z);
btConvexHullShape.addPoint(_vec3_1,true);
_vec3_2.setX(triangle[1].x);
_vec3_2.setY(triangle[1].y);
_vec3_2.setZ(triangle[1].z);
btConvexHullShape.addPoint(_vec3_2,true);
_vec3_3.setX(triangle[2].x);
_vec3_3.setY(triangle[2].y);
_vec3_3.setZ(triangle[2].z);
btConvexHullShape.addPoint(_vec3_3,true);
triangle_mesh.addTriangle(
_vec3_1,
_vec3_2,
_vec3_3,
true
);
}
return btConvexHullShape;
В процессе изучения основанной на физике 3d с помощью Threejs я также хочу упомянуть следующую лучшую практику: при использовании сложных моделей создайте низкополигональную модель, которую вы можете использовать в этой функции преобразования вместо исходной модели, или вы столкнетесь с переполнение стека.