设置摩擦力和弹性
我们可以在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();
};