Абсолютное позиционирование в OpenGL с C - PullRequest
0 голосов
/ 15 января 2012

(с использованием OpenGL, GLUT, GLU и C) Я пытаюсь создать 3D-игру на C, и у меня есть движение камеры, обнаружение столкновений и все основные вещи готовы, однако я потерпел неудачу при первом препятствии,Для создания своих прямоугольников я использую

glutSolidCube (2.0);

И я знаю о преобразованиях, масштабах и поворотах, однако я ищу, как разместить его в точном месте.Скажем, у меня было трехмерное пространство с XYZ.Скажем, у меня была камера на 5,5,20, смотрящая в сторону 0,0,0 (под углом), и я хотел разместить куб на 5,2,10, а затем еще на -5, -2,20.Как бы я использовал эти абсолютные позиции?Кроме того, как бы я использовал абсолютные размеры, скажем, я хотел, чтобы при -5, -2,20 был размер 20,5,10.Как бы я сделал это в OpenGL?

Ответы [ 2 ]

0 голосов
/ 15 января 2012

Сначала забудьте о glutSolidCube. GLUT не является частью OpenGL, это всего лишь небольшая удобная библиотека для него.

Вы должны понимать, что OpenGL имеет дело только с точками, линиями и треугольниками. И он не поддерживает сцену, а просто рисует точки, линии и треугольники. Каждый сам по себе без какой-либо коннотации топологии. Также OpenGL не следует путать с некоторыми математическими библиотеками. Функции glTranslate, glRotate, glScale и т. Д. Являются чистым наследием и были удалены из современных версий OpenGL.

Как говорится ...

Скажем, у меня была камера на 5,5,20, смотрящая в сторону 0,0,0 (под углом), и я хотел разместить куб на 5,2,10, а затем еще на -5, -2 , 20. Как бы я использовал эти абсолютные позиции? Кроме того, как бы я использовал абсолютные размеры, скажем, я хотел, чтобы при -5, -2,20 был размер 20,5,10. Как бы я сделал это в OpenGL?

Я подойду к тому, что вы уже знаете (который использует старые OpenGL-1.1 и GLUT):

void draw()
{
    /* Viewport and projection really should be set in the
       drawing handler. They don't belong into the reshape. */
    glViewport(...);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    your_projection();


    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(5, 5, 20, 0, 0, 0, 0, 1, 0);

    glPushMatrix();
    glTranslatef(5, 2, 10);
    draw_cube();
    glPopMatrix();

    glPushMatrix();
    glTranslatef(-5, -2, 20);
    draw_cube();
    glPopMatrix();

    glPushMatrix();
    glTranslatef(-5, -2, 20);
    glScalef(20, 5, 10);
    draw_cube();
    glPopMatrix();
}
0 голосов
/ 15 января 2012

Вам нужно будет использовать функции:

glTranslatef()
glRotatef()
glScalef()

Кроме того, также изучите их:

glPushMatrix()
glPopMatrix()

Подробнее см. OpenGL .

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