图表如下: ARFrame - > 3DModelFilter(SCNScene + SCNRender) - > OtherFilters - > GPUImageView。
加载3D模型:
NSError* error;
SCNScene* scene =[SCNScene sceneWithURL:url options:nil error:&error];
渲染3D模型:
SCNRenderer* render = [SCNRenderer rendererWithContext:context options:nil];
render.scene = scene;
[render renderAtTime:0];
现在,我很想知道如何将ARFrame的相机转换应用到SCNScene。
有人猜测:
更新2017-12-23。
首先,感谢@rickster的回复。根据你的建议,我在ARSession didUpdateFrame回调中添加代码:
ARCamera* camera = frame.camera;
SCNMatrix4 cameraMatrix = SCNMatrix4FromMat4(camera.transform);
cameraNode.transform = cameraMatrix;
matrix_float4x4 mat4 = [camera projectionMatrixForOrientation:UIInterfaceOrientationPortrait viewportSize:CGSizeMake(375, 667) zNear:0.001 zFar:1000];
camera.projectionTransform = SCNMatrix4FromMat4(mat4);
运行应用程序 我看不到整艘船只是其中的一部分。所以我在相机的变换中添加了一个翻译。我在下面添加了代码,可以看到整艘船。
cameraMatrix = SCNMatrix4Mult(cameraMatrix, SCNMatrix4MakeTranslation(0, 0, 15));
2.当我向上或向下移动iPhone时,跟踪似乎是有效的。但是当我向左或向右移动iPhone时,船就跟随我的动作直到消失在屏幕上。
我认为我错过了一些重要的事情。
ARCamera.transform
告诉你相机在世界空间(及其方向)的位置。您可以将此直接指定给持有simdTransform
的SCNNode
的SCNCamera
属性。
ARCamera.projectionMatrix
告诉你相机如何看待世界 - 基本上,它的视野是什么。如果您希望SceneKit呈现的内容看起来像是在摄像机图像中看到的真实世界,您需要使用ARKit提供的信息设置SCNCamera
。方便地,您可以绕过所有单独的SCNCamera
属性并直接在SCNCamera.projectionTransform
属性上设置投影矩阵。请注意,属性是SCNMatrix4
,而不是ARKit提供的SIMD matrix_float4x4
,因此您需要将其转换为:
scnCamera.projectionTransform = SCNMatrix4FromMat4(arCamera.projectionMatrix);
注意:根据视图的设置方式,您可能需要使用
ARCamera.projectionMatrixForOrientation:viewportSize:zNear:zFar:
而不是ARCamera.projectionMatrix
,以便获得适合视图大小和UI方向的投影。