我有一个应用程序,仅支持横屏显示。
在scenekit中,我有一个物体。该物体位于特定位置,由以下方式指定:
SCNNode * buttonRef = [scene.rootNode childNodeWithName:@"buttonRef" recursively:YES];
SCNVector3 buttonRefPosition = [buttonRef position];
现在我需要将
SCNVector3
转换为 mainView
的2D坐标,其中 mainView = (SCNView *)self.view;
场景使用正交相机,因此没有透视。相机是默认相机。没有旋转,没有平移。相机的正交比例尺为5.4。
我该如何进行转换?
我在SO上找到了其他关于反向问题的答案,即从CGPoint转换为SCNVector3,但对我来说不太明显如何进行反向操作,从SCNVector3到CGPoint。
如果SCNView是UIView的子类,则(0,0)是左上点,在iPhone 6横向情况下,(667,375)是右下点。
我的这个按钮几乎在右侧和高度中间。在UIKit方面,我会说这个按钮位于(600,187),但当我执行以下操作时:
SCNNode * buttonRef = [scene.rootNode childNodeWithName:@"buttonRef" recursively:YES];
SCNVector3 buttonRefPosition = [buttonRef position];
SCNVector3 projectedPoint = [mainView projectPoint: buttonRefPosition];
我得到的projectPoint等于(7.8, 375, 0) (?)
当我使用UIKit将一个10x10的视图添加到坐标(7.8, 375)时,我得到的是左下角的视图!!
正如我所说,这个应用只在横向模式下运行,但这些坐标系统都混乱了。
buttonRef
节点的几何形状是一个SceneKit对象(SCNSphere
,SCNBox
等),还是在3D建模工具中创建并作为dae文件加载的东西?所有的SceneKit对象都有一个原点在0,0,0(我的意思是球体的中心位于0,0,0),你使用的模型可能具有不围绕0居中的几何形状。一种快速检查的方法是将一个小的SCNSphere
添加为您的buttonRef
节点的子节点,并确认它出现在您认为几何形状的原点处。对于我的应用程序,projectPoint
返回预期的2D坐标。 - lock[scnView projectPoint:SCNVector3Zero];
,换句话说,我正在投影 0,0,0。投影结果是 (0, 375, 0)。在我的情况下,在场景中心可见的是 scenekit 中的 0,0,0,但它怎么会变成 (0,375,0),或者在 UIKit 上实际上是 (0,375) 呢?...这是右下角的一个点吗? - Duck