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();
};
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值