#opengl #glulookat
#opengl #glulookat
Вопрос:
У меня есть 2 объекта в разных системах координат: планета и цилиндр. У меня есть координаты глаз обоих объектов. Я хочу сориентировать цилиндр вдоль вектора, который соединяет его и планету.
glLoadMatrixf( PlanetTransform);
// .. draw planet
glLoadMatrixf( CylinderTransform);
glColor3f(0, 1, 0);
DrawCylinder();
// draw vector that connects cylinder and planet
glColor3f(1, 0, 0);
glLoadIdentity();
glBegin(GL_LINES);
// planet eye pos e.g. (0.045; -0.049; -0.186)
glVertex3f(point1.x, point1.y, point1.z);
// cylinder eye pos e.g. (-0.109; -0.064; -0.203)
glVertex3f(point2.x, point2.y, point2.z);
glEnd();
// orient cylinder along red vector
// TVector normal(0, 0, 1);
glLoadIdentity();
gluLookAt(point2.x, point2.y, point2.z,
point1.x, point1.y, point1.z,
normal.x, normal.y, normal.z);
DrawCylinder();
Нарисовать код цилиндра:
void DrawCylinder()
{
glPushMatrix();
glRotatef(90, 1, 0, 0);
gluCylinder(gp_quadratic, 0.01, 0, 0.03, 15, 15);
glPopMatrix();
}
Я попытался также указать normal как:
TVector normal;
TVector::cross(point2 - point1, TVector(0, 0, 1), normal);
Итак, в конце я ожидаю увидеть 2 цилиндра — 1 зеленый, 1 — красный. Красный должен быть ориентирован вдоль красного сегмента. Но я не вижу красного. Не могли бы вы помочь мне найти, что здесь не так? Красный цилиндр не отображается в центре системы координат зеленого цилиндра..
Комментарии:
1. Дайте мне ваши point1 и point2, пожалуйста. И расскажите нам, как вы рисуете цилиндры.
2. Отредактированный вопрос в соответствии с вашим комментарием. Спасибо
Ответ №1:
глюцилиндр (/**/)
- построен вдоль локальной оси z, таким образом, указывая наружу вдоль красной линии
- локальная ось y — это глобальная ось z_axis (указывающая на зрителя), спроецированная на плоскость обзора планеты
- таким образом, локальная ось x проходит примерно вдоль плоскости обзора планеты
- таким образом, после glRotatef(90, 1, 0, 0); цилиндр направлен в сторону от пользователя в глубину изображения и скрыт за планетой
- таким образом, если вместо glRotatef(180, 1, 0 ,0 ); используется, все должно быть хорошо afais.
У меня за плечами довольно длинная ночная смена, поэтому мое видение может быть ошибочным, но это дешево попробовать, не так ли.
Если я ошибаюсь, попробуйте использовать glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) для планеты и просто посмотрите, где находится цилиндр.