Kje*_*lly 3 xcode objective-c scenekit
我想从CGPoint获得一个SCNVector3.我正在使用手势识别器来获取触摸的位置(作为CGPoint).
问题是,当我点击测试时,触摸并不会总是碰到某些东西,因为触摸的对象并不总是存在.(触摸空白区域将船舶移至该空白处).
我发现的其他Stack Overflow问题使用SCNHitTestResult来获取worldCoordinates但是这对我不起作用.
有谁知道如何找到这个?鉴于我当然知道z坐标.移动的船始终以az位置1移动.
我需要worldCoordinates能够使用将SCNNode移动到具有CGPoint的触摸点的操作.谢谢!
那么,你想将视图空间中的一个点转换为场景空间中的一个点吗?当然,问题在于场景空间具有第三维,而视图空间则没有.您使用SCNView(或其他渲染器)方法projectPoint并unprojectPoint在场景空间(3D)和视图空间(也是3D )之间进行转换?Yep - 屏幕像素点的两个维度和标准化深度之一:对于近剪裁平面上的点,z坐标为0,对于远剪裁平面上的点,z坐标为1.
无论如何,你有一个有用的约束,你正在寻找将视图空间点映射到z=1场景空间中的特定平面().如果您的场景空间是朝向的,那么您有一个更有用的约束,以便所述平面与视图方向正交 - 即摄像机直接指向+ z或-z方向.
如果要将视图空间点映射到特定的场景空间深度,则需要知道该平面的视图空间深度.使用projectPoint为:
SCNVector3 projectedPlaneCenter = [view projectPoint:planeNode.position];
float projectedDepth = projectedPlaneCenter.z;
Run Code Online (Sandbox Code Playgroud)
现在,抓住它,您可以在需要将触摸位置映射到该平面时使用它:
CGPoint vp = [recognizer locationInView:view];
SCNVector3 vpWithDepth = SCNVector3Make(vp.x, vp.y, projectedDepth);
SCNVector3 scenePoint = [view unprojectPoint:vpWithDepth];
Run Code Online (Sandbox Code Playgroud)
如果您的场景没有与z轴平行于摄像机定向,那就更难了 - 您必须在您z=1处理的任何视图空间点上独立计算您的平面.在这种情况下,您可能会发现SCNPlane在场景中添加不可见更容易,并使用hitTest/ worldCoordinates方法在该平面上定位点.
| 归档时间: |
|
| 查看次数: |
2477 次 |
| 最近记录: |