blender模型变成threejs物理模型 😄

1,044 阅读1分钟

内容介绍

通过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);

}
)`

总结

通过模型的顶点坐标,将坐标传递到物理世界中构建出与模型相同的图形,从而达到物理效果。