2016-09-11 26 views
1

three.js와 함께 bullet/ammo.js를 사용하고 있습니다. 저는 3D 메쉬를 가지고 있으며, 부드러운 몸체로 충돌 탐지를 위해 정확한 모양을 사용하고 싶습니다. 메쉬 (three.js)에서 3D 강체를 만들 수있는 방법이 있습니까?three.js의 메쉬에서 탄환/탄환의 강체 (모양)

다음은 예입니다. http://kidzinski.com/miamisura/lazy3d/ (3D 모델을 다운로드하려면 잠시 기다려주십시오). 나는 3D 몸체에 천을 떨어 뜨려이 천과 몸의 충돌을 시뮬레이트해야합니다.

나는 근본적으로 오해 한 경우에이 프레임 워크에 새로운입니다. 미안합니다.

+1

상세한 메쉬를 사용하고 싶지는 않을 것입니다. (계산이 매우 빨라집니다.) 대개 낮은 계산량의 프록시 모델이 대신 계산에 사용됩니다. 시각적으로 너무 많은 차이를 만들지는 않을 것입니다. 낮은 폴리 카운트 메쉬를 만들기 위해서는 3D 모델링 소프트웨어가 필요합니다. 프로그래밍 방식으로 프로그래밍하는 것은 어렵습니다. 손으로 직접 만들면 결과를 미세하게 조정할 수 있습니다. – Leeft

+0

@Leeft thanks 직접적인 접근 방식으로 계산상의 문제가 발생할 것으로 예상되지만 올바른 물리학이 프로젝트의 핵심이기 때문에 여전히 어떤 작업을 시작하고 싶습니다. 나는 다음 단계에서 low-poly approximation을 시도 할 것이다 (특히 신경 쓰이는 부분이 적다). 감사! –

답변

3

임의의 Three.js 메쉬를 Bullet 오목 메쉬로 바꾸는 작업을 할 수있는 것처럼 보입니다. Three.js를 ammo.js에 직접 연결하는 플러그 앤 플레이 솔루션 인 Physi.js가 지원합니다. 필자는 개인적으로 프로젝트 (Physi.js) 사용을 권장하지 않지만 소스 코드를보고 오목 메쉬를 구현하는 방법을 살펴볼 수 있습니다.

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에 떨어져 통과 these lines of physi.js

for (i = 0; i < geometry.faces.length; i++) { 
    face = geometry.faces[i]; 
    if (face instanceof THREE.Face3) { 
     triangles.push([ 
      ... 

의 "삼각형"데이터 객체의 사용자 지정 목록을 만들 수있는 기하 구조 루프는 new Ammo.btBvhTriangleMeshShape on these lines로 만들려면

이것은 자신 만의 Ammo.js 커스텀 메쉬를 만들기위한 좋은 출발점이 될 것입니다.

+0

훌륭해 보이는데, 고마워요! 나는 그것을 시험해보고 문제가 생길 때 돌아올 것입니다. –

+0

ThreeJS 및 ammo.js와 함께 작동하는 것을 확인했습니다. 감사! – fallingCode

0

웹 주위에 많은 스레드가 있으며, Physijs Concave 메쉬는 collision으로 작동하지 않습니다. btBvhTriangleMeshShape는 bullet 관련 포럼에서 해당 주제를 검색 한 결과 ammo.js에서 collision으로 작동하지 않습니다. 나를 위해 일한 무엇

, btConvexHullShape입니다 : 복잡한 모델을 사용하는 경우, 낮은 폴리 모델을 만들 : threejs과 심령을 기반으로 3D를 학습하는 과정에서

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; 

, 또한 다음과 같은 모범 사례를 언급 할 원래 모델 대신 해당 변환기 함수를 사용할 수 있습니다. 그렇지 않으면 스택 오버플로가 발생합니다.

+0

어디에서 triangle_mesh가 사용 되었습니까? – fallingCode

+0

다른 솔루션을 테스트하고 있었습니까? –