OpenGL вращение камеры - PullRequest
       0

OpenGL вращение камеры

0 голосов
/ 17 февраля 2012

У меня есть куб с конечно 6 сторонами.Теперь я хочу не отображать все стороны, когда некоторые из этих сторон находятся вне поля зрения.Поэтому я передаю вращение камеры функции рисования, показанной ниже:

void Voxel::draw(QGLWidget *parent, GLfloat rotationX, GLfloat rotationY, GLfloat rotationZ) {

    glBegin(GL_QUADS);
    parent->qglColor(color);

    if ((rotationY > -90 && rotationY < 90) | rotationY < -270) {
        // Side top
        glVertex3f(-1.0f,  1.0f,  1.0f);  // Top Left Of The Texture and Quad
        glVertex3f( 1.0f,  1.0f,  1.0f);  // Top Right Of The Texture and Quad
        glVertex3f( 1.0f,  1.0f,  -1.0f);  // Bottom Right Of The Texture and Quad
        glVertex3f(-1.0f,  1.0f,  -1.0f);  // Bottom Left Of The Texture and Quad
    }

    // Side bottom
    glVertex3f(-1.0f,  -1.0f,  -1.0f);  // Bottom Left Of The Texture and Quad
    glVertex3f( 1.0f,  -1.0f,  -1.0f);  // Bottom Right Of The Texture and Quad
    glVertex3f( 1.0f,  -1.0f,  1.0f);  // Top Right Of The Texture and Quad
    glVertex3f(-1.0f,  -1.0f,  1.0f);  // Top Left Of The Texture and Quad

    // Side 1
    glVertex3f(-1.0f, -1.0f,  1.0f);  // Bottom Left Of The Texture and Quad
    glVertex3f( 1.0f, -1.0f,  1.0f);  // Bottom Right Of The Texture and Quad
    glVertex3f( 1.0f,  1.0f,  1.0f);  // Top Right Of The Texture and Quad
    glVertex3f(-1.0f,  1.0f,  1.0f);  // Top Left Of The Texture and Quad

    // Side 2
    glVertex3f(-1.0f,  1.0f,  -1.0f);  // Top Left Of The Texture and Quad
    glVertex3f( 1.0f,  1.0f,  -1.0f);  // Top Right Of The Texture and Quad
    glVertex3f( 1.0f, -1.0f,  -1.0f);  // Bottom Right Of The Texture and Quad
    glVertex3f(-1.0f, -1.0f,  -1.0f);  // Bottom Left Of The Texture and Quad

    // Side 3
    glVertex3f(1.0f, -1.0f,  -1.0f);  // Bottom Right Of The Texture and Quad
    glVertex3f(1.0f,  1.0f,  -1.0f);  // Top Left Of The Texture and Quad
    glVertex3f(1.0f,  1.0f,  1.0f);  // Top Right Of The Texture and Quad
    glVertex3f(1.0f, -1.0f,   1.0f);  // Bottom Left Of The Texture and Quad

    // Side 4
    glVertex3f(-1.0f, -1.0f,   1.0f);  // Bottom Left Of The Texture and Quad
    glVertex3f(-1.0f,  1.0f,  1.0f);  // Top Right Of The Texture and Quad
    glVertex3f(-1.0f,  1.0f,  -1.0f);  // Top Left Of The Texture and Quad
    glVertex3f(-1.0f, -1.0f,  -1.0f);  // Bottom Right Of The Texture and Quad

    glEnd();
}

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

Я устанавливаю вращение следующим образом:

glRotatef(rotationX, 1.0, 0.0, 0.0);
glRotatef(rotationY, 0.0, 1.0, 0.0);

Если мне нужно объяснить больше,Пожалуйста спросите.Если кто-то знает хорошую документацию об этих вещах, скажите, пожалуйста.

Ответы [ 2 ]

1 голос
/ 19 февраля 2012

Это может быть не тот ответ, который вы ожидаете, но, как правило, аппаратные средства OpenGL довольно хороши в том, чтобы не отображать лица, которые не обращены к камере, это называется отбраковкой задней поверхности. Современное настольное оборудование может отбрасывать около 4 миллиардов треугольников в секунду. Таким образом, эта оптимизация может быть не единственной и может не стоить того времени, которое вы проводите с ней.

Более того, если вы используете перспективную проекцию, ваше предположение о видимости грани куба, связанной с его вращением, может быть неверным в отношении положения куба относительно «камеры».

1 голос
/ 18 февраля 2012

Я думаю, в вашем коде есть глупая ошибка в строке

if ((rotationY > -90 && rotationY < 90) | rotationY < -270) {

, которую вы должны использовать ||вместо |

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...