Помогите понять gluLookAt () - PullRequest
       3

Помогите понять gluLookAt ()

4 голосов
/ 03 сентября 2011

Представьте, что вы стоите на земле и смотрите на куб в небе. Когда вы наклоняете голову, куб движется. Я пытаюсь повторить это, используя OpenGL ES на iPhone, манипулируя наклоном камеры, глядя на простой трехмерный куб, нарисованный вокруг начала координат. Я использую функцию gluLookAt() из Cocos2d, которая должна эмулировать версию OpenGL, и кажется, что когда я пытаюсь повозиться с любым из значений, мой куб исчезает.

Мой вопрос: Можете ли вы указать здесь использование gluLookAt(), которое поможет мне начать манипулировать камерой, чтобы я мог понять, как это работает? Мне действительно просто интересно узнать, как наклонять камеру вдоль оси Y.

Вот мой текущий код:

Конфигурация области просмотра

glBindFramebufferOES(GL_FRAMEBUFFER_OES, _viewFramebuffer);
glViewport(0, 0, _backingWidth, _backingHeight);

Матрица проекции

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Maybe this should be a perspective projection?? If so,
// can you provide an example using gluPerspective()?
glOrthof(-_backingWidth, _backingWidth,-_backingHeight, _backingHeight, -1, 1);

ModelView Matrix

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

gluLookAt() // What goes here?

Код чертежа

static const GLfloat cubeVertices[] = {
    -1.0, -1.0,  1.0,
    1.0, -1.0,  1.0,
    -1.0,  1.0,  1.0,
    1.0,  1.0,  1.0,
    -1.0, -1.0, -1.0,
    1.0, -1.0, -1.0,
    -1.0,  1.0, -1.0,
    1.0,  1.0, -1.0,
};

static const GLushort cubeIndices[] = {
    0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1
};

static const GLubyte cubeColors[] = {
    255, 255,   0, 255,
    0,   255, 255, 255,
    0,     0,   0,   0,
    255,   0, 255, 255,
    255, 255,   0, 255,
    0,   255, 255, 255,
    0,     0,   0,   0,
    255,   0, 255, 255
};

glVertexPointer(3, GL_FLOAT, 0, cubeVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, cubeColors);
glEnableClientState(GL_COLOR_ARRAY);    
glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_SHORT, cubeIndices);

1 Ответ

5 голосов
/ 03 сентября 2011

Я не совсем уверен, что именно вы хотите, но вот некоторые объяснения:

gluLookAt ожидает 3 вектора (каждый по 3 двойных): сначала положение камеры (точка зрения), затем положение, куда вы смотрите (центральная точка) и, наконец, вектор вверх, который указывает направление вверх (это не обязательно должно быть идеальным ортогональным направлением вверх, так как оно все равно повторно ортогонализируется).

Таким образом, если вы стоите в точке (0,0,5) и смотрите на свой куб (который находится в центре) и хотите, чтобы ось y была направлена ​​вверх, вы бы позвонили gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0), чтобы увидеть свой куб в полной красоте.

Если вы хотите наклонить голову в сторону, вам просто нужно изменить вектор вверх и немного повернуть его в сторону. Или, если вы хотите посмотреть вверх, но не наклоняя голову в сторону, вы по-прежнему используете ось Y в качестве вектора вверх, но вы просто смотрите на другую точку, поэтому вы меняете центральную точку на точку выше и впереди. из вас (возможно, вращается вокруг положения глаз). Но это не сработает, если вы хотите смотреть прямо вверх, в этом случае вам нужно изменить вектор вверх на что-то, перпендикулярное оси Y (конечно, в дополнение к установке центральной точки на точку прямо над вами ).

Но я думаю, вам нужна перспективная проекция. Ваш текущий орто, по крайней мере, совершенно не подходит для ваших координат, так как он определяет систему координат, в которой координаты имеют размер в пикселях, поэтому ваш куб [-1,1] равен размеру пикселя на экране. Попробуйте gluPerspective(60.0, ((double)_backingWidth)/_backingHeight, 0.1, 100.0). Если вам действительно нужна ортографическая проекция без каких-либо реалистичных искажений перспективы, вы можете использовать glOrtho, но в этом случае вы должны сохранять пропорции размера параметров glOrtho и координаты вашей модели примерно синхронными (поэтому не следует указывать экран размер орто и использование координат в диапазоне [-1,1]).

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