如何将ARKit与SCNRender集成到GPUImage渲染中?

问题描述 投票:0回答:1

图表如下: 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。

有人猜测:

  1. 我可以将WARFrame摄像机转换为场景中摄像机节点的变换而无需任何复杂的操作吗?
  2. 在这种情况下,ARFrame相机的projectMatrix对我没有任何帮助?

更新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时,船就跟随我的动作直到消失在屏幕上。

我认为我错过了一些重要的事情。

ios opengl-es scenekit gpuimage arkit
1个回答
1
投票

ARCamera.transform告诉你相机在世界空间(及其方向)的位置。您可以将此直接指定给持有simdTransformSCNNodeSCNCamera属性。

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方向的投影。

© www.soinside.com 2019 - 2024. All rights reserved.