我正在使用three.js框架并将physi.js用于力和重力。我的问题是,我已经给飞机上的骰子提供了一些位置,并希望通过点击它来使其倾斜或从某个角度将其翻转,使其在空中旋转并由于平面的重力而落在平面上。 我对onclickevent方法有所了解,但我不知道如何将骰子设置为以90度的高度跳跃并以一定的角度旋转一次只需一次点击。
如果你有什么建议请给我设置骰子的方法 谢谢
答案 0 :(得分:1)
我对physi.js没有经验,对于物理我使用cannon.js,所以我确实有一些物理经验。我可以告诉你它是如何完成的,但我还是不能提供一个例子。你需要做的第一件事就是cast a ray从相机到骰子。这会告诉您是否单击了该对象。从那里你可以将力施加到单击对象的位置。我希望这会有所帮助。
编辑/跟进: 我一直在查看physi.js,它看起来与cannon.js非常相似。此外,您要问的内容有很多方面,但我会尽量做到最全面。
首先要做的是设定引力。在示例中,它通过以下方式完成:
var scene = new Physijs.Scene({ fixedTimeStep: 1 / 120 });
scene.setGravity(new THREE.Vector3( 0, -30, 0 ));
接下来要做的是将骰子所在的平面定义为刚体,将骰子定义为刚体。
var dice = new Physijs.BoxMesh(
new THREE.CubeGeometry(5, 5, 5), //the collision geometry
new THREE.MeshLambertMaterial({ map: THREE.ImageUtils.loadTexture('images/dicetexture.jpg' )});, // material of the dice
5, // mass, for the plane use 0, meaning it doesnt move.
{ restitution: .2, friction: .8 } //contact material
);
最后,你需要施加一个力量,我找不到它的一个例子,但是快速越过source,我发现:
// Physijs.Mesh.applyForce
Physijs.Mesh.prototype.applyForce = function ( force, offset ) {
if ( this.world ) {
this.world.execute( 'applyForce', { id: this._physijs.id, force_x: force.x, force_y : force.y, force_z : force.z, x: offset.x, y: offset.y, z: offset.z } );
}
};
force
和offset
都应该是向量。 force
是方向和幅度,offset
是起源点。
我将用physi.js进行更多实验,它似乎解决了我一直在思考的一些问题。如果这仍然无法解决问题。我会发一个例子。
至于让它在预设的高度旋转一定次数,我认为这是很多试验价值......
编辑2:
在你发布的小提琴中,你解释的问题是一个未定义的变量,effect
。
if (intersects.length > 0) {
intersects[ 0 ].applyImpulse(effect, offset);
}
将其更改为:
if (intersects.length > 0) {
var effect = new THREE.Vector3( 0, 100, 0 );
var offset = new THREE.Vector3( 0, 0, 0 );
intersects[ 0 ].object.applyImpulse(effect, offset);
}
值已定义,但您可以在不同的函数中定义它们。
function apply_force(){
var effect = new THREE.Vector3( 0, 100, 0 );
var offset = new THREE.Vector3( 0, 0, 0 );
object.applyImpulse( effect, offset );
}
此功能将不再使用,因此您也可以将其删除。
点击计时器:
if(canClick == true){
//process click
canClick = false;
setTimeout(function(){canClick = true}, 5000)//5 seconds before the user can click again.
}