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

Posted

技术标签:

【中文标题】如何在旋转场景中查找对象的全局位置 THREE.JS【英文标题】:How to Find global position of objects in a rotating scene THREE.JS 【发布时间】:2013-01-17 20:25:57 【问题描述】:

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

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 

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

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

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

艾萨克

【问题讨论】:

【参考方案1】:

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

vertex.applyMatrix4( object.matrixWorld );

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

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

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

three.js r.55

【讨论】:

哇,当我只寻找 1 时,我得到了 3 个答案!非常感谢。 BackSide 是否完成了与 side = 2 相同的所有目标?我也认为你会喜欢 Leap,它对 THREE.JS 的影响是相当惊人的 :) 糟糕。错字。我的意思是 THREE.DoubleSide。更新了答案。另外,避免使用像“2”这样的数字常量。 还有一个问题,也许这应该是一个全新的堆栈溢出问题,如果应该,请告诉我。 applyMatrix4 完全按照我想要的方式工作(感谢您为我节省了大约 5 天的痛苦:))但是每当它被调用时,它也会旋转球体本身(通过根据它可能添加到旋转中的旋转重新定义位置) ? sphere.geometry.vertices[i].applyMatrix4(rotatable.matrixWorld);调用时,可能会增加可旋转对象的旋转吗? 我不清楚您在做什么,但请尝试将矩阵应用于顶点的副本。您可以使用Vector3.copy()Vector3.clone() 最佳选择:参考***.com/questions/11966779/…,并研究three.js源代码。

以上是关于如何在旋转场景中查找对象的全局位置 THREE.JS的主要内容,如果未能解决你的问题,请参考以下文章

基于Three.js中的父/其他对象坐标系保持对象旋转?

如何根据对象的本地位置/旋转在 OpenGL 中移动/旋转对象

unity3d 如何让子对象的顺序改变?

如何在three.js对象渲染中从中心向左更改轴(x,y,z)位置?

如何使用 glm::lookAt() 旋转对象?

Three.js - 计算相对旋转