如何在旋转场景中找到对象的全局位置THREE.JS

时间:2013-02-02 17:51:26

标签: vector position three.js webgl scene

我正在使用这个:http://leapmotion.com处理3D网格操纵器。到目前为止,我已经能够通过“抓住”并移动它们来操纵这些点,但是我现在希望能够旋转网格并在相反的面上工作。我所做的是添加一个名为'可旋转'的额外对象,如下所示:

scene=new THREE.Scene();
camera = new THREE.PerspectiveCamera(70,window.innerWidth/window.innerHeight,1,8000)
renderer=new THREE.WebGLRenderer( { clearColor: 0x000000, clearAlpha: 1, maxLights:5 } )


//This is the 'Mesh Scene'
rotatable = new THREE.Object3D()
scene.add(rotatable)


//Mesh we are altering
var material = new THREE.MeshNormalMaterial()
material.side=2

var geom = new THREE.SphereGeometry(200,10,10); 
var sphere = new THREE.Mesh(geom, material)

rotatable.add(sphere)

然后我尝试更改此球体的顶点,但为此我需要进行“碰撞测试”以查看顶点是否被“抓取”这包括检查顶点位置并查看它是否与你的一个手指位置(下面的psuedoCode)一致

if(finger.x == vertex.x && finger.y == vertex.y && finger.z == vertex.z){
    vertex.grabbed = true 
}

当可旋转的旋转为零时,这可以正常工作,但是当它开始旋转时,碰撞测试仍将测试未旋转的顶点位置(这是有意义的)。我的问题是如何在“场景/全局”位置找到顶点的位置。到目前为止,我能想到的唯一方法是计算'可旋转'的旋转并使用此向量来计算新的顶点位置。

我对数学一无所知,所以这可能不是可行的方法,即使是这样,我也要努力奋斗,以至于我不知道我是不是在做错误的数学运算,或者这不是我应该计算它的方式。显然我愿意完成这项工作,但只是想确保这是做到这一点的方法,而不是另一种更简单的方法。

如果对该代码有任何其他问题,请告诉我,并提前感谢您的时间!

艾萨克

1 个答案:

答案 0 :(得分:3)

要获取在局部坐标中指定的顶点的世界位置,请将对象的世界变换应用于顶点,如下所示:

vertex.applyMatrix4( object.matrixWorld );

(我对leapmotion并不熟悉,所以希望它不影响这个答案。)

提示:不再需要maxLights。最好避免material.side = 2。请改用material.side = THREE.DoubleSide

您可以在此处找到常量:https://github.com/mrdoob/three.js/blob/master/src/Three.js

three.js r.55