【问题标题】:Three.js - Collision by raycasting with a rotated origin meshThree.js - 使用旋转的原点网格进行光线投射碰撞
【发布时间】:2014-06-29 15:27:00
【问题描述】:

你好我尝试控制一个网格,他可以通过mesh.translate相对于它的旋转转动和移动。

但是对于碰撞,我找不到相对于其旋转的光线投射。 如果原始网格没有旋转,或者我使用 mesh.position.x++ 移动它,它可以工作。但是旋转和用 translateX(1) 就不行了。

感谢您的关注。 这是我仅用于右侧 (+X) 的函数:

function coll(b1,b2){

var hit = false;
var dist = (width/2);

var matrix = new THREE.Matrix4();
matrix.extractRotation( b1.matrix );

var origin = new THREE.Vector3(b1.position.x,b1.position.y,b1.position.z);

var direction = new THREE.Vector3( 1, 0, 0 );
direction = matrix.multiplyVector3( direction );

var ray = new THREE.Raycaster(origin, direction,0,dist);
var collisionResult = ray.intersectObject(b2);

if(collisionResult!=0){
hit = true; b1.translateX( -1 );
}else{
hit = false;
}//if

return hit;

}//coll() 

这是整个代码以防万一:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>three.js webgl - geometry - cube</title>
        <meta charset="utf-8">
        <style>
            body {
                margin: 0px;
                background-color: #000000;
                overflow: hidden;
                    color: white;
                    }
                </style>
    </head>
    <body>

    <script src="../build/three.min.js"></script>

    <script>

var camera, scene, renderer;
var width = 100;
var mesh, mesh2;

var key = {left:false};


function keyDown(e){

    if (e.keyCode == 39) {  key.right = true;  }

}//keyPress()
window.addEventListener("keydown", keyDown);


function keyUp(e){

    if (e.keyCode == 39) {  key.right = false;  }

}//keyPress()
window.addEventListener("keyup", keyUp);



function moove(m){

    if (key.right){ 
        m.translateX( 1 );

    //m.position.x++;

    }//if

    if (key.left){

        m.translateX( -1 );

    }//if

}//moove()



function coll(b1,b2){

var hit = false;
var dist = (width/2);


    var matrix = new THREE.Matrix4();
matrix.extractRotation( b1.matrix );

var origin = new THREE.Vector3(b1.position.x,b1.position.y,b1.position.z);

var direction = new THREE.Vector3( 1, 0, 0 );
direction = matrix.multiplyVector3( direction );

 var ray = new THREE.Raycaster(origin, direction,0,dist);
 var collisionResult = ray.intersectObject(b2);

  if(collisionResult!=0){
  hit = true; b1.translateX( -1 );
}else{
hit = false;
}//if

return hit;

}//coll()



            init();
            animate();

            function init() {

                renderer = new THREE.WebGLRenderer();
                renderer.setSize( window.innerWidth, window.innerHeight );
                document.body.appendChild( renderer.domElement );

                //

                camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 );
                camera.position.z = 400;

                scene = new THREE.Scene();

                var geometry = new THREE.BoxGeometry( width, 10, 10);

                mesh = new THREE.Mesh( geometry);
                scene.add( mesh );
                mesh.position.x = -100;
                mesh.position.y = -20;
                mesh.rotation.z = 1;

                geometry = new THREE.BoxGeometry( width, 100, 100);
                mesh2 = new THREE.Mesh( geometry);
                scene.add( mesh2 );

                window.addEventListener( 'resize', onWindowResize, false );

            }//init()

            function onWindowResize() {

                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();

                renderer.setSize( window.innerWidth, window.innerHeight );

            }//resize()

            function animate() {

                requestAnimationFrame( animate );

                coll(mesh,mesh2);
                moove(mesh);    


                renderer.render( scene, camera );

            }//animate()

        </script>

    </body>
</html>

我也试过四元数,但结果还是一样:

direction.applyQuaternion(b1.quaternion);

我与 mesh.position.x++ 发生了冲突,所以可能 translateX 做错了什么?

【问题讨论】:

  • 您要求某人为您调试代码。这不是本网站的目的。请提出对其他人有用的问题。尽管如此,如果您进行以下更改,您最初编写的代码仍然有效:var ray = new THREE.Raycaster( origin, direction, 0, 2 * dist )mesh.rotation.z = 0.5;。将OrbitControlsAxisHelper 添加到您的演示中,这样您就可以看到自己在做什么。如果您添加OrbitControls,您将不得不小心竞争击键。
  • 感谢您的评论。嗯,我认为它对每个想用这种角色制作视频游戏的人都很有用,我在编写所有代码之前提取了这个小函数。它最终可能通过将 mesh.position.y -= 10 更改为 30 来工作。愚蠢的错误:碰撞可能太高了,如果没有 OrbitControls,我无法看到你所说的。

标签: three.js rotation collision raycasting


【解决方案1】:

现在好了。这种碰撞最终效果很好。

【讨论】:

  • 感谢您的描述。
猜你喜欢
  • 2016-06-19
  • 2019-11-18
  • 2012-11-07
  • 2023-04-04
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多