10 Physijs暂停物理模拟和手动更新模型的位置旋转(Three.js的物理引擎)

设置摩擦力和弹性

我们可以在Physijs里面直接使用Three.js的材质,但是这样无法设置物体的摩擦力和弹性。
所以,我们在创建材质的时候需要使用Physijs.createMaterial方法来进行材质创建,需要额外配置两个参数:friction(摩擦系数)和restitution(弹性系数)。
注意:两个值的取值范围在0到1之间。

var friction = 0.8; // 高 摩擦系数
var restitution = 0.3; // 低 弹性系数

var material = Physijs.createMaterial(
    new THREE.MeshBasicMaterial({ color: 0x888888 }),
    friction,
    restitution
);

// 创建一个摩擦系数为 0.8 弹性系数为0.3的模型
var mesh = new Physijs.BoxMesh(
    new THREE.CubeGeometry( 5, 5, 5 ),
    material
);

对象缩放

可以在将对象添加到场景之前对其进行缩放。一旦它们被添加到场景中,您将无法修改其比例。这使您可以在Three.js中以不同大小创建和重用相同的几何对象。缩放是不能动态的对象矩阵的一个属性。

停止模拟

var render = function() {
    if (!isPaused) {
        scene.simulate();
    }
    renderer.render();
};

恢复仿真需要调用场景的onSimulationResume方法,该方法将最后一次仿真时间设置为等于当前时间,防止仿真未暂停时发生的所有仿真。如下所示。

var unpauseSimulation = function() {
    isPaused = false;
    scene.onSimulationResume();
};

更新对象的位置和旋转

有一个方法,是无法和Three.js无缝衔接,就是更新对象的位置和旋转。如果这样做,则必须将该对象的标志__dirtyPosition__dirtyRotation标志设置为true,否则它将被模拟中最后已知的值覆盖。

var mesh = new Physijs.BoxMesh( geometry, material );
scene.add( mesh );

var render = function() {
    // 改变对象的位置
    mesh.position.set( 0, 0, 0 );
    mesh.__dirtyPosition = true;

    // 改变对象的旋转
    mesh.rotation.set(0, 2, 3);
    mesh.__dirtyRotation = true;

    // 你也可能想取消对象的自身速度
    mesh.setLinearVelocity(new THREE.Vector3(0, 0, 0));
    mesh.setAngularVelocity(new THREE.Vector3(0, 0, 0));

    scene.simulate();
    renderer.render();
};

猜你喜欢

转载自blog.csdn.net/qq_30100043/article/details/80517780