将360texture平面上的坐标转换为球形

时间:2016-03-15 00:04:35

标签: c# unity3d cartesian-coordinates 360-virtual-reality

我有一个360球形视频。我将此视频用作Unity中球体上的纹理。球体内部是一个摄像头,它可以作为虚拟现实体验的设置。非常基本。

我正在尝试在网络上编写一些代码,用户可以上传360个图像和视频,在360度球形图像/视频上放置标记/热点,然后将图像/视频纹理应用于球体上Unity3D。如果我在360视频/图像纹理上叠加一个简单的x / y坐标网格,放入一些x / y坐标来放置标记/热点,并将纹理放回到球体上,Unity将不会正确解释这个我们现在处于3D空间中,我们正在查看映射到平面上的球体内的纹理,并发生所有失真。

我的问题是,如何将360视频纹理的2D平面上的这些x和y坐标转换为Unity3D中可以理解的坐标?

我的第一个想法是使用二维笛卡尔坐标并将它们转换为球面坐标,但我似乎在笛卡尔坐标中缺少一​​个z轴来使其工作。

z轴是0还是从球心到x / y坐标的半径? z轴代表什么?可能有两个坐标系。一个是平面上的坐标,另一个是来自球体中心的坐标?

这是我到目前为止的转换代码:

public static void CartesianToSpherical(Vector3 cartCoords, out float outRadius, out float outPolar, out float outElevation){
    if (cartCoords.x == 0)
        cartCoords.x = Mathf.Epsilon;
    outRadius = Mathf.Sqrt((cartCoords.x * cartCoords.x)
                    + (cartCoords.y * cartCoords.y)
                    + (cartCoords.z * cartCoords.z));
    outPolar = Mathf.Atan(cartCoords.z / cartCoords.x);
    if (cartCoords.x < 0)
        outPolar += Mathf.PI;
    outElevation = Mathf.Asin(cartCoords.y / outRadius);
}

这是我的第一篇文章,请原谅我,如果我做错了,请告诉我如何改进。

1 个答案:

答案 0 :(得分:0)

球面坐标与2d或3d坐标不同,因为您需要以弧度为单位测量它们。它通常从球体的中心和XY轴测量。它标记了球体表面上的矩形区域。请参阅此链接,了解统一的球形坐标 - https://blog.nobel-joergensen.com/2010/10/22/spherical-coordinates-in-unity/