我有这个应用程序,只适用于景观. 我在scenekit上有一个对象.该对象位于某个位置,由下式指定: SCNNode * buttonRef = [scene.rootNode childNodeWithName:@"buttonRef" recursively:YES]; SCNVector3 buttonRefPosition
我在scenekit上有一个对象.该对象位于某个位置,由下式指定:
SCNNode * buttonRef = [scene.rootNode childNodeWithName:@"buttonRef" recursively:YES]; SCNVector3 buttonRefPosition = [buttonRef position];
现在我需要将SCNVector3转换为mainView 2D坐标,其中
mainView = (SCNView *)self.view;
场景是使用正交相机,所以没有透视.相机是默认相机.没有轮换,没有翻译.相机的orthographicScale是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将10×10视图添加到坐标(7.8,375)时,我会在左下方看到一个视图!
就像我说应用程序仅在横向操作,但这些坐标系统都是混乱的.
将模型空间点转换为屏幕空间点称为投影(因为它将相机的投影变换应用于从3D空间映射到2D空间).渲染器(通过GPU)每帧执行很多次,以将场景中的点数放到屏幕上.当您需要自己动手时,还有一种方便的方法:projectPoint: