У меня сферическое видео 360 градусов. Я использую это видео как текстуру на сфере в Unity. Внутри сферы находится камера, и она работает как установка для моего опыта виртуальной реальности. Довольно простой.
Я пытаюсь написать небольшой код в Интернете, где люди могут загружать изображения и видео 360 °, размещать маркер / точку доступа на сферическом изображении / видео 360 °, а затем применять текстуру изображения / видео к сфере в Unity3D. Если я наложу простую координатную сетку x / y на 360-градусное видео / изображение-текстуру, введу некоторые x / y-координаты для размещения маркера / горячей точки и верну текстуру на сферу, Unity не будет правильно интерпретировать это, поскольку Теперь мы находимся в трехмерном пространстве и смотрим на текстуру изнутри сферы, отображаемой на плоскость, со всеми возникающими искажениями.
У меня вопрос: как преобразовать эти координаты x и y на 2D-плоскости 360-градусной видеотекстуры в координаты, которые можно понять в 3D в 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);
}
Это мой самый первый пост, поэтому, пожалуйста, извините меня, если я делаю что-то не так, и дайте мне знать, как улучшить.