3d вращение вокруг начала координат - PullRequest
7 голосов
/ 22 декабря 2011

Я знаю, что есть много вопросов о трехмерном вращении, на которые здесь даны ответы, но все они, похоже, имеют дело с вращательными матрицами и кватернионами в OpenGL (и мне все равно, получу ли я блокировку подвеса). Мне нужно получить трехмерные координаты EX: (x, y, z) точки, которая всегда должна быть на одном и том же расстоянии, сейчас я назову ее «d» от начала координат. Единственная информация, которую я имею в качестве ввода - это дельтакс и дельта мыши по экрану. Итак, вот что я попробовал:

Во-первых:

thetaxz+=(omousex-mouseX)/( width ); 
thetaxy+=(omousey-mouseY)/( height);

(thetaxy - это угол в радианах по оси x, y и thetaxz по оси x, z) (Я ограничиваю оба угла так, чтобы, если они меньше или равны 0, они равны 2 * PI)

Второе:

pointX=cos(thetaxz)*d;
pointY=sin(thetaxy)*d;

(pointX - это координата x точки, а pointY - это y)

Третье:

if(thetaxz)<PI){
 pointZ=sqrt(sq(d)-sq(eyeX/d)-sq(eyeY/d));
}else{
  pointZ=-sqrt(abs(sq(d)-sq(eyeX/d)-sq(eyeY/d)));
}

(sq () - это функция, которая возводит в квадрат, а abs () - это функция абсолютного значения) (точка Z должна быть координатой точки z, за исключением пересечения между положительным полушарием z и отрицательным полушарием z. По мере приближения к краю точка растягивается дальше, чем расстояние, на которое она всегда должна быть в x и y и, казалось бы, случайным образом около 0,1-0,2 радиана от thetazz, координата z становится NAN или не определена)

Я думал об этом некоторое время, и, честно говоря, мне трудно исказить понятие кватернионов и вращательных матриц, однако, если вы покажете мне, как их использовать для генерации фактических координат, я был бы рад узнать. Я все еще предпочел бы, чтобы я мог просто использовать некоторую тригонометрию по нескольким осям. Заранее благодарю за любую помощь, и если вам нужна дополнительная информация, просто спросите.

Подсказка / идея в последнюю минуту: я думаю, что это может иметь какое-то отношение к позиции z, влияющей на позиции x и y назад, но я не уверен.

РЕДАКТИРОВАТЬ: Я нарисовал диаграмму: enter image description here

1 Ответ

7 голосов
/ 22 декабря 2011

Если вы действительно хотите успеха в этом, вам нужно будет прикусить пулю и узнать о матрицах вращения и / или кватернионных вращениях . Могут быть и другие способы сделать то, что вы хотите, но матрицы вращения и кватернионные вращения используются просто потому, что они широко понятны и являются одним из самых простых способов выражения и применения вращений к векторам. Любое другое представление, которое кто-либо может придумать, вероятно, будет более сложной переформулировкой одного или обоих из них. Фактически можно показать, что вращение представляет собой линейное преобразование и поэтому может быть выражено как матрица . Кватернионные вращения - это просто упрощенное средство вращения векторов в 3D, и поэтому они имеют эквивалентные матричные представления.

Тем не менее, звучит так, как будто вы заинтересованы в том, чтобы захватить объект в вашей сцене щелчком мыши и вращать естественным образом. Если это так, вы должны взглянуть на метод ArcBall (есть множество примеров , которые вы можете просмотреть). Это все еще требует, чтобы вы знали что-то из кватернионов. Вы также обнаружите, что по крайней мере минимальное понимание основных аспектов линейной алгебры будет полезным.

Обновление : Судя по вашей диаграмме и содержащимся в ней комментариям, все, что вы действительно пытаетесь сделать, - это преобразовать Сферические координаты в Декартовы координаты . Пока мы согласны с нотацией, это легко. Позвольте & theta; угол, который вы называете XY, то есть угол между осью X, повернутой вокруг оси Z; это называется азимутальным углом и будет в диапазоне [0, 2 & pi;) радиан или [0 & deg ;, 360 & deg;). Пусть & phi; быть углом между плоскостью XY и вашим вектором; он называется углом места и будет в диапазоне [- & pi; / 2, + & pi; / 2] или [-90 °, + 90 °] и соответствует углу, который вы называете углом XZ ​​(вращение в плоскости XZ вокруг оси Y). Есть и другие соглашения, поэтому убедитесь, что вы последовательны. Во всяком случае, преобразование просто:

x = d∙cos(&phi;)∙cos(&theta;)
y = d∙cos(&phi;)∙sin(&theta;)
z = d∙sin(&phi;)
...