2013-11-13 2 views
1

я использую OpenGL с Python, и имеют следующий код:OpenGL правильный порядок преобразования матрицы для поворота объекта в неподвижной точке

glTranslatef(0, 0, -3.0) 
glRotatef(rotation * 100.0, 0.0, 1.0, 0.0) 
square.render() 

- когда вращение является целым числом, которое увеличивается на раме и square.render() просто делает четверной на экран.

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

+0

Я хотел бы рассмотреть другой способ описания этого в будущее. Когда я читаю *** «фиксированную точку» *** в контексте компьютерной графики, первое, что приходит в голову, это целочисленный тип данных, который имеет масштаб для определения точки счисления ... может быть, «фиксированное местоположение»? :) –

+0

@ AndonM.Coleman Ах, да. Черт побери, эти технические возможности всегда убегают от меня! Спасибо за головы :) – Fitzy

ответ

2

Подумайте о glRotatef() как будто вы на самом деле «нарисовать» ось, которая начинается с (0, 0, 0) и указывает на любые координаты, которые вы ему даете. В вашем примере используется (0, 1, 0), который является осью World Y.

Но скажем, вы хотите повернуть свою P точку (10, 10, 0) вокруг оси A [(3, 3, 3), (3, 4, 3)]. Эта ось - как вы можно увидеть - параллельно с Y.

Сначала вам нужно перевести весь мир, так что теперь ваша ось A будет лежать на Мировой оси Y.

glClear(GL_COLOR_BUFFER_BIT) 
glTranslatef(3, 3, 3) 

Теперь вы должны повернуть все вокруг оси мира по Y:

glRotatef(rotation*100.0, 0, 1, 0) 

И тогда вы должны перевести его обратно:

glTranslatef(-3, -3, -3) 

И теперь вы можете сделать свой P точку :

glBegin(GL_POINTS) 
glVertex3f(10, 10, 0) 
glEnd() 

ПРИМЕЧАНИЕ: забудьте мой глупый пример glBegin/End, это древний, используйте VAO и VBOs!


Я не знаю, какие рамки вы используете, но здесь довольно простой пример pyglet:

import pyglet 
from pyglet.gl import * 

window = pyglet.window.Window(256, 256) 

x = 0 
def update(dt): 
    global x 
    x += 1 


@window.event 
def on_draw(): 
    global x 

    glClear(GL_COLOR_BUFFER_BIT) 
    glLoadIdentity() 
    glTranslatef(128, 128, 0) 
    glRotatef(x, 0, 0, 1) 
    glTranslatef(-128, -128, 0) 

    glBegin(GL_TRIANGLES) 
    glColor3f(1, 0, 0) 
    glVertex3f(128, 128, 0) 
    glColor3f(0, 1, 0) 
    glVertex3f(200, 128, 0) 
    glColor3f(0, 0, 1) 
    glVertex3f(200, 200, 0) 
    glEnd() 

pyglet.clock.schedule_interval(update, 1/60) 
pyglet.app.run() 

AND THE RESULT IS HERE!

+1

Замечательно! Большое вам спасибо, теперь это имеет гораздо больше смысла, и я смог исправить свою проблему! :) – Fitzy

 Смежные вопросы

  • Нет связанных вопросов^_^