C ++ OpenGL gluLookAt - PullRequest
       1

C ++ OpenGL gluLookAt

0 голосов
/ 25 ноября 2011

Я использовал команду OpenGL

gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ)

Я хочу отменить эту операцию, чтобы моя камера вернулась в исходное положение и повернулась к -z. Я читал (на разных сайтах), что пара основных команд glRotatef вместе с glTranslate(-eyeY, -eyeY, -eyeZ) может достичь желаемого результата.

Но я не могу понять, какими именно будут команды glRotate.

Ответы [ 6 ]

2 голосов
/ 25 ноября 2011

Вы можете сохранить матрицу ранее с помощью

glPushMatrix();

и восстановить ее с помощью

glPopMatrix();

, но помните о влиянии на производительность.Я думаю, это может быть причиной того, что вы хотите перевести вызов на gluLookAt.Может быть, вы можете это уточнить?

2 голосов
/ 25 ноября 2011

Почему бы просто не перезагрузить матрицу вида модели с идентификатором?Т.е.:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
0 голосов
/ 12 октября 2013

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

glMatrixMode (GL_MODELVIEW);
gluLookAt (ya know, stuff);
glLightfv (GL_LIGHTn, GL_POSITION, positionOfLight));
// ^ Putting your light positioning here will keep it in the right spot, relative only to the origin!
// Draw your stuff

Надежда немного помогла. Веселитесь.

0 голосов
/ 07 сентября 2013

Если ваш код подобен приведенному ниже:

glMatrixMode(GL_MODELVIEW)

glLoadIdentity();

gluLookAt(......);

, то матрица просмотра модели выполняется с помощью вызова gluLookAt.Итак, сначала получите матрицу вида модели, вызвав

float modelViewMat[16];

glGetFloatv(GL_MODELVIEW_MATRIX, modelViewMat);

Теперь найдите инвертированную матрицу modelViewMat.

float invertMat[16];

__gluInvertMatrixd(modelViewMat, invertMat);

Вот код для получения инвертированной матрицы.

int __gluInvertMatrixd(const float src[16], float inverse[16])
{
    int i, j, k, swap;
    float t;
    GLfloat temp[4][4];

    for (i=0; i<4; i++)
        for (j=0; j<4; j++)
            temp[i][j] = src[i*4+j];

    for(int i=0;i<16;i++)
        inverse[i] = 0;
    inverse[0] = inverse[5] = inverse[10] = inverse[15] = 1.0f;

    for(i=0; i<4; i++)
    {
        swap = i;
        for (j = i + 1; j < 4; j++)
            if (fabs(temp[j][i]) > fabs(temp[i][i]))
                swap = j;

        if (swap != i) {
            //Swap rows.
            for (k = 0; k < 4; k++) {
                t = temp[i][k];
                temp[i][k] = temp[swap][k];
                temp[swap][k] = t;

                t = inverse[i*4+k];
                inverse[i*4+k] = inverse[swap*4+k];
                inverse[swap*4+k] = t;
            }
        }

        if (temp[i][i] == 0)
            return 0;

        t = temp[i][i];
        for (k = 0; k < 4; k++) {
            temp[i][k] /= t;
            inverse[i*4+k] /= t;
        }

        for (j = 0; j < 4; j++) {
            if (j != i) {
                t = temp[j][i];
                for (k = 0; k < 4; k++) {
                    temp[j][k] -= temp[i][k]*t;
                    inverse[j*4+k] -= inverse[i*4+k]*t;
                }
            }
        }
    }

    return 1;
}

Теперь умножьте значение invertMat на любую матрицу объектов, если вы не хотите добавлять эффект матрицы вида модели.

Как:

glPushMatrix();

glMultMatrixf(invertMat);


glRotatef(...);

glTranslatef(...);

...
...

glDrawArrays(....);


glPopMatrix();
0 голосов
/ 26 ноября 2011

Почему бы просто не использовать gluLookAt (0, 0, 0, 0, 0, -1, 0, 1, 0)?

Это устанавливает камеру на 0 (положение глаза равно 0, 0, 0) и устанавливает точку обзора на (0, 0, -1), которая находится вдоль оси -z, и устанавливает вектор повышения на (0, 1, 0), которая находится вдоль оси y.

gluLookAt не является аддитивным (не уверен, что это правильное слово).Каждый вызов gluLookAt устанавливает всю матрицу представления.

Если вы хотите посмотреть на какую-то позицию и затем вернуться в ту же позицию после перемещения с помощью gluLookAt, вы можете просто сохранить глаз, точку обзора и вверхвектор и использовать их позже.

0 голосов
/ 26 ноября 2011

ИЛИ вместо того, чтобы использовать крайне устаревший материал OpenGL, напишите свои собственные классы матриц и просто сохраните их копию, а затем восстановите ее после того, как вы вызвали свой собственный метод Matrix :: LookAt:)

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