@lock 的答案看起来不错,有几个补充:
(1) 访问 SCNNode worldTransform 而不是 transform 如果 cameraNode 是动画或父节点:
let view = SCNMatrix4Invert(cameraNode.presentationNode.worldTransform)
(2) 代码没有考虑视图的纵横比。例如,假设一个透视投影,你会想要做:
perspMatrix.m11 /= viewportAR; //if using Yfov -> adjust Y`
/* or, */
perspMatrix.m22 *= viewportAR; //if using Xfov -> adjust X`
在哪里,viewportAR = viewport.width / viewport.height
另一种方法是在场景中有一个带有渲染委托的节点,并从该委托中检索 SceneKit 的矩阵(它们作为选项传递):
FOUNDATION_EXTERN NSString * const SCNModelTransform;
FOUNDATION_EXTERN NSString * const SCNViewTransform;
FOUNDATION_EXTERN NSString * const SCNProjectionTransform;
FOUNDATION_EXTERN NSString * const SCNNormalTransform;
FOUNDATION_EXTERN NSString * const SCNModelViewTransform;
FOUNDATION_EXTERN NSString * const SCNModelViewProjectionTransform;