Ответ Никола Боласа в значительной степени говорит о том, что вы делаете неправильно, поэтому я пропущу это. Вы ищете решение, а не говорите, что не так, поэтому давайте сразу же приступим к нему.
Это код, который я использую для матрицы проекции:
glViewport(0, 0, mySize.x, mySize.y);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fovy, (float)mySize.x/(float)mySize.y, nearPlane, farPlane);
Несколько слов, чтобы описать это:
glViewport устанавливает размер и положение места отображения для openGL внутри окна. Не знаю почему, я всегда включаю это для обновления прогноза. Если вы используете его как я, где mySize - это 2D вектор, определяющий размеры окна, область рендеринга openGL будет занимать все окно. Вы должны быть знакомы с 2 следующими звонками и, наконец, gluPerspective
. Первый параметр - это ваше «поле зрения по оси Y». Он определяет угол в градусах, который вы увидите, и я никогда не использовал ничего, кроме 45. Хотя он может быть использован для масштабирования, но я предпочитаю оставить это для работы камеры. Второй параметр аспект. Он обрабатывает то, что если вы рендерите квадрат, а размеры вашего окна не будут в соотношении 1: 1, он будет по-прежнему квадратным. Третий - около плоскости отсечения, геометрия ближе к камере не будет отображаться, то же самое с farPlane, но, напротив, он устанавливает максимальное расстояние, в котором отображается геометрия.
Это код для матрицы вида модели
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( camera.GetEye().x,camera.GetEye().y,camera.GetEye().z,
camera.GetLookAt().x,camera.GetLookAt().y,camera.GetLookAt().z,
camera.GetUp().x,camera.GetUp().y,camera.GetUp().z);
И снова кое-что, что вы должны знать: опять же, вы можете использовать первые 2 вызова, поэтому мы переходим к gluLookAt
. У меня есть класс камеры, который обрабатывает все движения, вращения и тому подобное. Eye, LookAt и Up являются трехмерными векторами, и эти 3 - действительно все, на что указывает камера. Глаз - это положение камеры, в которой оно находится в пространстве. LookAt - это положение объекта, на который вы смотрите, или лучше точки в трехмерном пространстве, на которую вы смотрите, потому что это может быть где угодно, а не просто центр объекта. И если вы беспокоитесь о том, что такое Up vector, это действительно просто. Вектор перпендикулярен вектору (LookAt-Eye), но поскольку таких векторов бесконечное количество, вы должны указать один. Если ваша камера находится на (0,0,0)
, а вы смотрите на (0,0,-1)
, и вы хотите стоять на ногах, вектор вверх будет (0,1,0)
. Если вы хотите встать на голову вместо этого, используйте (0,-1,0)
. Если вы не поняли идею, просто напишите в комментарии.
Поскольку у вас нет класса камеры, вам нужно хранить эти 3 вектора отдельно. Я считаю, что у вас есть что-то вроде центра 3D-объекта, который вы перемещаете. Установите эту позицию как LookAt после каждого обновления. Также на этапе инициализации (когда вы создаете 3D-объект) выберите положение камеры и вектор вверх. После каждого обновления положения объекта обновляйте положение камеры таким же образом. Если вы переместите свой объект на 1 точку вверх по оси Y, сделайте то же самое с положением камеры. Верхние векторы остаются постоянными, если вы не хотите вращать камеру. И после каждого такого обновления звоните gluLookAt
с обновленными векторами.
Для обновленного сообщения:
Я действительно не понимаю, что происходит без большей системы отсчета (но я все равно не хочу это знать). Есть несколько вещей, которые меня интересуют. Если центр - это трехмерный вектор, в котором хранится положение вашего объекта, почему вы устанавливаете центр этого объекта в правом верхнем углу окна? Если это центр, у вас должны быть эти + diam также во 2-м и 4-м параметре glOrtho
, и если дела идут плохо, вы используете неправильные имена для переменных или делаете что-то где-то до того, как это неправильно. Вы устанавливаете положение LookAt прямо в своем обновленном сообщении, но я не понимаю, почему вы используете эти параметры для Eye. У вас должно быть что-то вроде: centerX, centerY, centerZ-diam
в качестве первых 3 параметров в gluLookAt
. Это дает вам камеру в том же положении X и Y, что и ваш объект, но вы будете смотреть на нее вдоль оси Z с расстояния diam