将整个 SceneKit 场景转换为适合纹理的图像



我用CoreMotion、AV和SceneKit编写了一个小应用程序来制作一个简单的全景图。当您拍照时,它会将其映射到SK矩形上,并将其放置在相机面向的任何CM方向的前面。这工作正常,但是...

我希望用户能够单击"完成"按钮并将整个场景转换为单个图像。然后,我可以将其映射到球体上以供将来查看,而不是重新创建整个对象集。我不需要缝合或类似的东西,我希望单个图像保持单独的矩形,就像粘在球内部的照片一样。

我知道snapshot并尝试将其与非常宽的 FOV 一起使用,但这会导致鱼眼视图无法正确映射回来(除非我做错了)。我认为我需要应用某种转换?或者也许有一种更简单的方法可以做到这一点?

关键是"粘在球内侧的照片"。你有一堆矩形,悬浮在空间中。将其转换为适合投影到球体上的图像是一项艰巨的工作。您必须将每个矩形投影到球体上,并相应地扭曲图像。

如果只想重建场景以供将来在 SceneKit 中查看,请使用 SCNScene 内置的序列化、write(to:​options:​delegate:​progress​Handler:​)SCNScene(named:)

要计算图像到球体上的映射,您需要进行一些坐标转换。对于每个图像,将拐角的坐标转换为球面坐标,原点位于您的视点。将每个角坐标的半径更改为球体的半径,现在投影角的位置就在球体上。

对输入矩形图像中的每个像素重复此过程是很诱人的。但这会在球形输出图像中留下空像素。所以你会反过来工作。对于球形输出图像中的每个像素(在 4 个角点内),计算从 POV 到该点的光线(在球面坐标中完成)。将该射线转换回笛卡尔坐标,计算其与矩形图像平面的交点,并在输入图像中的该点进行采样。您需要执行一些像素权重,因为输出图像和输入图像将具有不同的像素尺寸。

最新更新