Нахождение углов для осей X, Y и Z в 3D - OpenGL / C ++ - PullRequest
6 голосов
/ 10 ноября 2010

В настоящее время я пытаюсь использовать OpenGL (с SDL), чтобы нарисовать куб в том месте, где я щелкнул левой кнопкой мыши на экране, а затем заставить его указывать в положение на экране, где я щелкаю правой кнопкой мыши.

Я могу успешно нарисовать куб в желаемом месте, используя gluUnproject. Это означает, что я уже знаю координаты, в которых находится мой куб.

Однако я не знаю, как рассчитать все углы, необходимые для создания моего куба.указать новое местоположение.

Конечно, я все еще использую gluUnproject, чтобы найти координаты моего щелчка правой кнопкой мыши, но я знаю только, как вращаться вокруг оси Z из 2D-графики.

Например, раньше, если бы я хотел повернуть четырехугольник вокруг оси Z (конечно, это был бы вид сверху вниз, где ось Z все еще «проходит» через экран) в 2D, я бы сделал что-то вроде:

angle = atan2(mouseCoordsY - quadPosY, mouseCoordsX - quadPosX);
glRotatef(angle*180/PI, 0, 0, 1);

Мой вопрос: как мне поступить в 3D?

  • Нужно ли рассчитывать углы для каждой оси, как я делал выше??
  • Если да, то как рассчитать угол поворота вокруг осей X и Y?
  • Если нет, какой метод следует использовать для достижения желаемых результатов?

Любая помощь очень ценится.

1 Ответ

9 голосов
/ 10 ноября 2010

Если ваш куб в точке A = (x0, y0, z0)

Если ваш куб в данный момент смотрит на B = (x1, y1, z1)

и если вы хотите, чтобы он смотрел на C = (x2, y2, z2), тогда;

пусть v1 будет вектором от A до B

v1 = B - A

и v2 будет от А до С

v2 = C - A

Сначала нормализуйте их.

v1 = v1 / |v1|
v2 = v2 / |v2|

затем рассчитайте угол поворота и ось вращения как

angle = acos(v1*v2) //dot product
axis = v1 X v2 //cross product

Вы можете вызвать glRotate с помощью

glRotate(angle, axis[0], axis[1], axis[2])
...