欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-16 21:24:58
...

设置摩擦力和弹性

我们可以在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();
};