Вращение и перевод OpenGl - PullRequest
1 голос
/ 04 июля 2011

Я прохожу серию уроков по NeHe OpenGK. Tutorial # 9 делает некоторые интересные вещи; Я все понял, за исключением двух вещей, которые, я думаю, являются основой всего урока.

В функции DrawGlScene я не понял следующую строку.

glRotatef(tilt,1.0f,0.0f,0.0f);  // Tilt The View (Using The Value In 'tilt') 

Я понимаю, что делает эта строка, и она также очень четко упоминается в руководстве. Но я не понимаю, почему он хочет наклонить экран.

Другое дело, сначала он наклоняет экран, а затем поворачивает его на звездный угол, и сразу после этого он делает обратное. Что это за техника? Что нужно наклонить? Просто вращайте звезду, когда звезда обращена к пользователю.

glRotatef(star[loop].angle,0.0f,1.0f,0.0f); // Rotate To The Current Stars Angle
glTranslatef(star[loop].dist,0.0f,0.0f);    // Move Forward On The X Plane

glRotatef(-star[loop].angle,0.0f,1.0f,0.0f); // Cancel The Current Stars Angle
glRotatef(-tilt,1.0f,0.0f,0.0f);             // Cancel The Screen Tilt

Я буду очень благодарен, если кто-нибудь скажет мне механизм, который происходит под капотом.

1 Ответ

1 голос
/ 04 июля 2011

Я не понимаю, почему он хочет наклонить экран.

Наклон заставляет вас видеть звезды под другим углом, а не просто "прямо над" ними.

Другое дело, сначала он наклоняет экран, а затем поворачивает его на звездный угол, и сразу после этого делает обратное.Что это за техника?

Это потому, что он хочет вращать звезду вокруг выбранной плоскости (в данном случае плоскости Y), но (!) Он также хочет, чтобы текстурированный квадратор смотрел на зрителя.Допустим, он повернул его на 90 градусов, если это так, вы увидите только (как он заявляет в учебнике) «толстую» линию.

Рассмотрите эти комментарии:

// Rotate the current drawing by the specified angle on the Y axis 
// in order to get it to rotate.
glRotatef(star[loop].angle, 0.0f, 1.0f, 0.0f); 

// Rotating around the object's origin is not going to make 
// any visible effects, especially since the star object itself is in 2D.
// In order to move around in your current projection, a glRotatef()
// call does rotate the star, but not in terms of moving it "around" 
// on the screen.
// Therefore, use the star's distance to move it out from the center.  
glTranslatef(star[loop].dist, 0.0f, 0.0f);

// We've moved the star out from the center, with the specified 
// distance in star's distance. With the first glRotatef() 
// call in mind, the 2D star is not 100 % facing
// the viewer. Therefore, face the star towards the screen using 
// the negative angle value.
glRotatef(-star[loop].angle, 0.0f, 1.0f, 0.0f);

// Cancel the tilt on the X axis.
glRotatef(-tilt, 1.0f, 0.0f, 0.0f);
...