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

Posted

技术标签:

【中文标题】如何使用 SCNRender 将 ARKit 集成到 GPUImage 渲染中?【英文标题】:How to integrate ARKit into GPUImage render with SCNRender? 【发布时间】:2018-06-03 01:16:23 【问题描述】:

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

一些猜测:

    我可以将 ARFrame 相机的变换分配给场景中相机节点的变换而不需要任何复杂的操作吗? 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);

运行应用程序。 1.我看不到整艘船,只能看到一部分。所以我在相机的变换中添加了一个翻译。我在下面添加代码,就可以看到整艘船了。

cameraMatrix = SCNMatrix4Mult(cameraMatrix, SCNMatrix4MakeTranslation(0, 0, 15));

2。当我向上或向下移动 iPhone 时,跟踪似乎起作用了。但是当我向左或向右移动 iPhone 时,船会跟随我的移动直到消失在屏幕上。

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

【问题讨论】:

你有没有得到这个工作/匹配的 ARSCNView?我在做类似的事情,也看到了一些不太正确的结果。谢谢! 【参考方案1】:

ARCamera.transform 告诉您相机在世界空间中的位置(及其方向)。您可以将其直接分配给持有您的SCNCameraSCNNodesimdTransform 属性。

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

【讨论】:

感谢您的回复。我尝试了一下,并在问题中有一些问题更新。请看一看,救救我。如果您需要详细信息,我稍后会将示例上传到 github。再次感谢。

以上是关于如何使用 SCNRender 将 ARKit 集成到 GPUImage 渲染中?的主要内容,如果未能解决你的问题,请参考以下文章

带有 ARkit 和 CoreML 的视觉框架

如何使用设备指南针将对象或模型放置在统一 ARkit 中?

ARKit - 如何沿识别的表面移动物体?

ARKit 3.5 – 如何使用 LiDAR 从新 iPad Pro 导出 OBJ?

如何录制 ARKit 场景但排除 UI 元素?

ARKit 如何在没有跟踪时暂停视频