将放置在 360 纹理平面上的坐标转换为球面坐标

Converting coordinates placed on 360texture plane to spherical

我有一个 360 度全景视频。我将此视频用作 Unity 球体上的纹理。球体内部是一个摄像头,它用作我的虚拟现实体验的设置。很基础。

我正在尝试在网络上编写一些代码,人们可以在其中上传 360 度图像和视频,在 360 度球形 image/video 上放置一个 marker/hotspot,然后应用 image/video-Unity3D 球体上的纹理。如果我在 360 video/image-texture 上覆盖一个简单的 x/y 坐标网格,输入一些 x/y 坐标来放置 marker/hotspot,然后将纹理放回球体上,Unity将无法正确解释这一点,因为我们现在处于 3D space 中,并且我们正在查看映射到平面上的球体内部的纹理,并发生所有失真。

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

我的第一个想法是使用二维笛卡尔坐标并将其转换为球坐标,但我似乎缺少笛卡尔坐标中的 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);
}

这是我的第一个post所以如果我做错了什么请原谅我,让我知道如何改进。

球面坐标不同于 2d 或 3d 坐标,因为您需要以弧度为单位测量它们。它通常从球体中心和 XY 轴开始测量。它在球体表面标记了一个矩形区域。统一球面坐标请参考这个link - https://blog.nobel-joergensen.com/2010/10/22/spherical-coordinates-in-unity/