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

时间:2017-03-21 18:20:45

标签: ios swift scenekit

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

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

我知道<div id="c{field:uid}"并尝试使用非常宽的FOV,但这导致鱼眼视图无法正确映射(除非我做错了)。我假设我需要应用某种变换?或者也许有一种更简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

关键是“照片粘在球的内部”。你有一堆悬挂在太空中的矩形。将其转换成适合投射到球体上的一个图像是一项工作。您必须将每个矩形投影到球体上,并相应地扭曲图像。

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

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

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