2013-07-13 5 views
3

Я пытаюсь повернуть объект вокруг одной из его сторон, и уже попробовал общий подход, как найти на форумах:
Вращение вокруг точки поворота с OpenGL

translate(-P); 
rotate(); 
translate(P); 

В OpenGL (реверсивный порядок перевода/повороты), я использовал следующий код:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glPushMatrix(); 
    glTranslatef(-50, 50, 0); 
     glRotatef(rotationCoord, 0, 1, 0); 
    glTranslatef(50, -50, 0); 
    glBegin(GL_QUADS); 
     glVertex3f(-50.0, 50.0, 0); 
     glVertex3f(50.0, 50.0, 0); 
     glVertex3f(50.0, -50.0, 0); 
     glVertex3f(-50.0, -50.0, 0); 
    glEnd(); 
glPopMatrix(); 

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

http://youtu.be/VgEZ_rsG3xU

Как установить стержень для этого объекта так, чтобы она вращалась вокруг этой точки?

+0

Выбор стержня нечетный. Компонент трансляции оси y не действует, поскольку вы вращаетесь в плоскости xz. Это то, что вы намеревались? –

+0

@MarceloCantos: На данный момент я не собирался вращать вокруг оси Y. Просто ось Х. Но левая сторона прямоугольника кажется движущейся, в то время как ось вращения должна быть неподвижной. правильно? – user1240679

+0

'glRotatef (..., 0, 1, 0)' является вращением вокруг оси y (aka xz-plane), а не осью x. –

ответ

2

Проблема возникает из

glTranslatef(0, 0, -10.0); 

вы звоните после вращение. Это означает, что (0,0, -10) применяется к координатам объекта (+ -50, + - 50,0), прежде чем они будут преобразованы чем-либо еще, поэтому квадроцикл будет смещен до того, как он будет повернут.

Вот код, который я использовал для тестирования, может быть, вы получите что-то из этого:

#include <glm/glm.hpp> 
#include <glm/ext.hpp> 
using namespace glm; 

void display(void) 
{ 
    glClearColor(0,0,0,0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    GLfloat aspect = (float)g_Width/g_Height; 
    mat4 eyeToCamera = perspective(45.f, aspect, g_nearPlane, g_farPlane); // projection 
    mat4 cameraToWorld = lookAt(vec3(0, 0, -150), vec3(), vec3(0, 1, 0)); // view 

    vec3 pivot(50, -50, 0); 
    mat4 worldToObject = translate(pivot) 
    * rotate(rotationAngle, vec3(0, 1, 0)) 
    * translate(-pivot); // model 
    glLoadMatrixf(value_ptr(eyeToCamera * cameraToWorld * worldToObject)); 
    glBegin(GL_QUADS); 
    glVertex3f(-50.0, 50.0, 0); 
    glVertex3f(50.0, 50.0, 0); 
    glVertex3f(50.0, -50.0, 0); 
    glVertex3f(-50.0, -50.0, 0); 
    glEnd(); 

    glutSwapBuffers(); 
} 

Обратите внимание, что я не использую какие-либо функции стеки матрицы, и я только установить матрицу GL_MODELVIEW.

+0

Мне нужно было перевести назад на '-10', потому что у меня есть матрица проецирования, как указано выше (что необходимо для одной из моих последующих операций, которая должна появиться позже). Я попытался уменьшить значение «z» прямоугольника, чтобы изменить, как далеко рисован прямоугольник, и посмотреть, создает ли это проблему с вращением. Но даже если прямоугольник находится в '-0,1', я все равно не получаю фиксированный стержень.Из-за пост-умножения OpenGL, которые переводят на '-10', должно быть после вращения, чтобы сделать прямоугольник полностью видимым внутри проекции перспективы. – user1240679

+0

Я не уверен, почему этот перевод на '-10' вызывает или как я должен ходить вокруг фиксированной оси с прямоугольником, который все еще отображается в моей проекции перспективы. – user1240679

+0

@ user1240679 Поместите вызов 'glTranslatef (0, 0, -10.0)' перед вращением, т. Е. Непосредственно после вызова 'glPushMatrix' выше. Таким образом, перевод применяется после поворота объекта. –