1

我正在使用这个: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)

然后我试图改变这个球体的顶点,但要这样做,我需要做一个“碰撞测试”以查看顶点是否被“抓取”这涉及检查顶点位置并查看它是否与一个重合你的手指位置(下面的伪代码)

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

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

我对数学一无所知,所以这可能不是要走的路,即使是这样,我也将不得不如此努力地挣扎,以至于我永远不会知道我是否只是做错了数学,或者这不是不是我应该去计算它的方式。显然我愿意完成这项工作,但只是想确保这是这样做的方法,而不是另一种更简单的方法。

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

艾萨克

4

1 回答 1

3

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

vertex.applyMatrix4( object.matrixWorld );

(我不熟悉跳跃运动,所以希望它不会影响这个答案。)

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

你可以在这里找到常量:https ://github.com/mrdoob/three.js/blob/master/src/Three.js

三.js r.55

于 2013-02-02T18:20:54.747 回答