内容介绍
通过blender导出模型的json数据,之后在通过threejs以及ammo实现物理模型。
使用场景
一般小游戏方向或者大型游戏方向使用物理模型比较多,做一些模拟真实世界的物理效果。
使用框架及语言
- javascript
- threejs
- ammojs
代码实现
` const material = new THREE.MeshNormalMaterial();
const loader = new THREE.BufferGeometryLoader();
loader.load('../suzanne_buffergeometry.json', (geometry) => {
geometry.computeVertexNormals();
const object = new THREE.Mesh(geometry, material);
object.position.x = -3;
object.position.z = 0;
object.position.y = 1;
scene.add(object);
const shape = new Ammo.btConvexHullShape();
let triangle_mesh = new Ammo.btTriangleMesh;
let vectA = new Ammo.btVector3(0, 0, 0);
let vectB = new Ammo.btVector3(0, 0, 0);
let vectC = new Ammo.btVector3(0, 0, 0);
//retrieve vertices positions from object
let verticesPos = geometry.getAttribute('position').array;
let triangles = [];
for (let i = 0; i < verticesPos.length; i += 3) {
triangles.push({ x: verticesPos[i], y: verticesPos[i + 1], z: verticesPos[i + 2] })
}
for (let i = 0; i < triangles.length - 3; i += 3) {
vectA.setX(triangles[i].x);
vectA.setY(triangles[i].y);
vectA.setZ(triangles[i].z);
shape.addPoint(vectA, true);
vectB.setX(triangles[i + 1].x);
vectB.setY(triangles[i + 1].y);
vectB.setZ(triangles[i + 1].z);
shape.addPoint(vectB, true);
vectC.setX(triangles[i + 2].x);
vectC.setY(triangles[i + 2].y);
vectC.setZ(triangles[i + 2].z);
shape.addPoint(vectC, true);
triangle_mesh.addTriangle(vectA, vectB, vectC, true);
}
let meshShape = new Ammo.btBvhTriangleMeshShape(triangle_mesh, true, true);
let localInertia = new Ammo.btVector3(0, 0, 0);
let transform = new Ammo.btTransform;
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(object.position.x, object.position.y, object.position.z));
transform.setRotation(new Ammo.btQuaternion(
0, 0, 0, 1));
let motionState = new Ammo.btDefaultMotionState(transform);
let rbInfo = new Ammo.btRigidBodyConstructionInfo(0, motionState, meshShape, localInertia);
let body = new Ammo.btRigidBody(rbInfo);
physicsWorld.addRigidBody(body);
}
)`
总结
通过模型的顶点坐标,将坐标传递到物理世界中构建出与模型相同的图形,从而达到物理效果。