如何使用three.js在空中翻转立方体

时间:2014-11-05 14:45:24

标签: javascript three.js

我正在使用three.js框架并将physi.js用于力和重力。我的问题是,我已经给飞机上的骰子提供了一些位置,并希望通过点击它来使其倾斜或从某个角度将其翻转,使其在空中旋转并由于平面的重力而落在平面上。 我对onclickevent方法有所了解,但我不知道如何将骰子设置为以90度的高度跳跃并以一定的角度旋转一次只需一次点击。

如果你有什么建议请给我设置骰子的方法 谢谢

1 个答案:

答案 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 } );
    }
};

forceoffset都应该是向量。 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.
}