我有一个 360 度全景视频。我将此视频用作 Unity 球体上的纹理。球体内部是一个摄像头,它用作我的虚拟现实体验的设置。很基本。
我正在尝试在网络上编写一些代码,人们可以在其中上传 360 度图像和视频,在 360 度球图像/视频上放置一个标记/热点,然后在 Unity3D 中的球体上应用图像/视频纹理。如果我在 360 视频/图像纹理上覆盖一个简单的 x/y 坐标网格,放入一些 x/y 坐标以放置标记/热点,然后将纹理放回球体上,Unity 将无法正确解释这一点,因为我们现在在 3D 空间中,我们正在查看映射到平面上的球体内部的纹理,所有失真都在发生。
我的问题是,如何将 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);
}
这是我的第一篇文章,所以如果我做错了什么,请原谅我,让我知道如何改进。