Рассчитайте точку XYZ сферы, учитывая координату UV ее текстуры - PullRequest
2 голосов
/ 20 октября 2011

У меня есть сфера в 3D.Во время выполнения я генерирую динамическую текстуру 2048x1024 для него.На этой текстуре нарисован крошечный круг, который может быть где угодно.У меня есть x / y этого круга на текстуре, и, следовательно, соответствующие координаты UV.Теперь я хотел бы интерполировать, где именно на моей сфере находится этот маленький круг.

Это код, который я использовал, но он всегда кажется выключенным на +/- 90 градусов

// U, V are original UV obtained from dynamic texture.

_u =  Math.PI * U;  
_v =  -2 * Math.PI * V;

_x = Math.cos(_u) * Math.sin(_v) * radius;
_y = Math.sin(_u) * Math.sin(_v) * radius;
_z = Math.cos(_v) * radius;

Спасибо за любую помощь!

Ответы [ 3 ]

2 голосов
/ 20 октября 2011

В соответствии с кодом, который вы разместили в комментариях, вот как генерировать значения X, Y и Z.

theta = 2 * PI * U;
phi = PI * V;

_x = Math.cos(theta) * Math.sin(phi) * radius;
_y = Math.sin(theta) * Math.sin(phi) * radius;
_z = -Math.cos(phi) * radius;

СТАРЫЙ ОТВЕТ:

Ваш код в порядке.Вы уверены, что сфера генерируется таким же образом, и что полюса расположены вдоль оси Z, как это?«Обычно» сферы создаются с полюсами вдоль оси Y.Проверьте это.

В противном случае, если вы всегда отклоняетесь на +/- 90 °, поиграйте с sin и cos, определяя x и y.Например:

_x = -Math.sin(_u) * Math.sin(_v) * radius;
_y = Math.cos(_u) * Math.sin(_v) * radius;

Поворот оригинала на 90 °.

Существует 8 различных способов выполнить грех / cos этих двух компонентов с разными знаками.Не зная, как создается ваша сфера, вам придется испытать их все.Они идут

(x = sin(u), y = cos(u));
(x = sin(u), y = -cos(u));
(x = -sin(u), y = cos(u));
(x = -sin(u), y = -cos(u));

(x = cos(u), y = sin(u));
(x = cos(u), y = -sin(u));
(x = -cos(u), y = sin(u));
(x = -cos(u), y = -sin(u));

Однако это больно и смешно, я настоятельно рекомендую попытаться выяснить, как создается ваша сфера.Они обычно генерируют позиции x, y, z, просматривая U и V.

0 голосов
/ 09 октября 2015

В уравнении, которое вы используете для создания сферы, полюс рассматривается как ось Z. Если вы используете что-то вроде GLUT, система координат по умолчанию имеет Z плюс нормаль к экрану с «Вверх», являющимся осью Y. Если вы поменяете местами Z и Y, это может сработать для вас. Я только что закончил делать что-то подобное, и я был доволен результатами.

Я использовал следующее.

double theta = ((2 * PI) / lWidth) * u;
double phi = (PI / lHeight) * v;

double dX = std::cos(theta) * std::sin(phi) * radius;
double dZ = std::sin(theta) * std::sin(phi) * radius;
double dY = std::cos(phi) * radius;

lWidth и lHeight - это размеры растрового изображения, которое я отображал на сфере.

0 голосов
/ 31 октября 2011

Убедитесь, что вы правильно определили оси, например:

ЕНУ - восток север вверх NED - Северо-восток вниз

Преобразование отличается для NED и ENU обычно потому, что угол азимута определяется одинаково, то есть по часовой стрелке относительно севера.

сделайте 90- по тэте в каждом или используйте правило совместного угла.

Попробуйте получить формулы самостоятельно ... убедитесь, что вы знаете, какие соглашения используются

...