如何将二维点转换为三维使用SceneKit的unprojectPoint没有深度值?

是否可以使用SceneKit的unprojectPoint将2D点转换为3D而不具有深度值? 我只需要在XZ平面中find3D位置。 因为我没有使用它,所以Y可以是0或者任何值。

我正在尝试为iOS 8 Beta做这个。

我有类似的JavaScript和Three.js(WebGL)是这样的:

function getMouse3D(x, y) { var pos = new THREE.Vector3(0, 0, 0); var pMouse = new THREE.Vector3( (x / renderer.domElement.width) * 2 - 1, -(y / renderer.domElement.height) * 2 + 1, 1 ); // projector.unprojectVector(pMouse, camera); var cam = camera.position; var m = pMouse.y / ( pMouse.y - cam.y ); pos.x = pMouse.x + ( cam.x - pMouse.x ) * m; pos.z = pMouse.z + ( cam.z - pMouse.z ) * m; return pos; }; 

但是我不知道如何用unprojectVector将部件翻译成SceneKit。


我想要做的就是只能在XZ平面上拖动一个物体。 垂直轴Y将被忽略。

由于对象需要沿着一个平面移动,所以一个解决scheme就是使用hitTest方法,但是对于每个触摸/拖动事件,我认为在性能方面并不是很好。 而且,它也不允许物体移出飞机。

我已经尝试了一个基于接受的答案在这里的解决scheme,但它没有奏效。 对于unprojectPoint使用一个深度值,如果在+/- Z方向上拖动对象,对象不会停留在手指下太长,而是远离它。 无论在XZ平面中移动的位置,我都需要将被拖动的物体留在手指下。

首先,你是在寻找xz平面还是xy平面? 默认情况下,相机以-z方向查看,因此3D场景套件坐标系的x轴和y轴与2D视图坐标系中的方向相同。 (嗯,在UIKit中y被默认翻转,但它仍然是垂直轴)。然后xz平面与屏幕平面正交。

其次,深度值是从2D转换到3D的必要部分。 我不是three.js的专家,但是通过查看他们的库文档 (显然不能被链接到),他们的unprojectVector仍然需要一个Vector3 。 这就是你在上面代码中为pMouse构造的东西 – 一个vector,它的z和y坐标来自二维鼠标位置,z坐标是1。

SceneKit的unprojectPoint以同样的方式工作 – 它需要一个z坐标指向剪辑空间深度的点,并将其映射到场景世界空间中的一个点。

如果您的世界空间的方向是您所关心的唯一变化是在x轴和y轴上,那么您可以传递任何想要unprojectPoint的z值,并忽略向量中的z值。 否则,传递-1映射到远裁剪平面, 1为近裁剪平面或0在中间位置 – z坐标(摄像机空间中)为0的平面。 如果使用非投影点来定位场景中的节点,最好的build议是尝试不同的z值(介于-1和1之间),直到获得所需的行为。

但是,想一想你正在使用一个未被投影的vector是一个好主意,如果接下来要做的事情是testing与场景几何的交集,请看hitTest:。