首页 文章

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

提问于
浏览
1

我有一个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);
}

这是我的第一篇文章所以请原谅我,如果我做错了什么,让我知道如何改进 .

1 回答

相关问题