Как получить координаты объекта в OpenGL - PullRequest
8 голосов
/ 24 ноября 2011

Я хочу иметь возможность получить координаты объекта (например, треугольника) после того, как он был переведен и повернут, поэтому я хочу сделать это так, чтобы позже я мог выполнять обнаружение столкновений и вычислять расстояние между объектами, используя координаты. Я думаю, что я мог бы использовать gluProject, но не уверен. Кроме того, каковы различия между различными координатными пространствами, например, мир, объект и т. д.

У меня есть некоторый код ниже, это круг в середине квадрата, как я могу определить, когда круг касается одного из краев, я могу переместить его, используя клавиши вверх, вниз, влево, вправо, просто изменяет координаты x или y, но я просто хочу иметь возможность выполнять базовое обнаружение столкновений, и я не знаю, как это сделать.

glPushMatrix();
    glColor3f(0.0f, 1.0f, 0.0f);
    glTranslatef(0.0f, 0.0f, -5.0f);

    glScalef(0.5f, 0.5f, 0.0f);
    glBegin(GL_POLYGON); 
        glVertex3f(-5.0f, -5.0f, 0.0f);
        glVertex3f(5.0f, -5.0f, 0.0f);
        glVertex3f(5.0f, 5.0f, 0.0f);
        glVertex3f(-5.0f, 5.0f, 0.0f);
    glEnd();
glPopMatrix();

glPushMatrix();


    glColor3f(1.0f, 0.0f, 0.0f);
    glTranslatef(x, y, -20.0f);

    glBegin(GL_POINTS);
        glVertex3f(-5, -5, 10.0f);
    glEnd();

    GLUquadricObj *qobj = gluNewQuadric();
    gluQuadricDrawStyle(qobj, GLU_FILL);
    gluSphere(qobj, 1.0f, 20, 20);
    gluDeleteQuadric(qobj);
glPopMatrix();

Ответы [ 2 ]

11 голосов
/ 24 ноября 2011

Также, каковы различия между различными координатными пространствами, например, мир, объект и т. д.

Это в основном вопрос соглашения, но:

  • Пространство модели (= локальное пространство) - это координатное пространство конкретной модели относительно ее "центра". Если у вас есть файл с моделью, координаты центрируются вокруг некоторой его точки (например, это геометрический центр, его основание, что угодно).

  • Пространство сцены (= мировое пространство) - это координатное пространство относительно произвольной точки вашей сцены

  • Глазное пространство (= пространство обзора) - это пространство, в котором камера находится в точке (0,0,0), x обращено вправо, y направлено вверх и z направлено out экрана (-z = глубже)

  • Область клипа - это где (-1,-1,*) - нижний левый угол окна просмотра, (1,1,*) - верхний правый угол окна просмотра, а координата Z в (-1,1 ) указывает только глубину (опять же, Z = глубже). (Фрагменты

  • Размер экрана (= координаты окна) такой же, как указано выше, за исключением того, что координаты масштабируются с -1..1 до значений в пикселях, соответствующих диапазону текущего видового экрана и диапазону глубины .

Вы преобразуете координаты из пространства модели в пространство сцены, умножая (в соглашениях OpenGL обычно левое умножение) на матрицу модели (которая содержит информацию о том, где находится модель на сцене). Если у вас есть иерархия сцен, может быть много «сложенных» матриц моделей для объекта (размещение меча относительно руки, рука относительно рыцаря, рыцарь относительно сцены).

Затем вы преобразуете координаты в пространство глаза, умножая на матрицу вида (обычно подключенную к объекту «камера»).

После этого, используя матрицу проекции , вы преобразуете эти координаты в пространство экрана, так что OpenGL отобразит эти координаты в фактические пиксели экрана (в зависимости от настройки области просмотра).

Некоторые факты:

  • Матрицы модели и вида обычно содержат перемещение, вращение и / или масштабирование, в то время как матрица проекции обычно содержит преобразование перспективы, которое делает объекты дальше от экрана меньше.

  • Старый OpenGL (версии 2.x и более ранние) требовал, чтобы вы поместили матрицы в два "матричных стека":

    • стек GL_MODELVIEW, который должен содержать View * Model (или View * Model1 * Model2 ... * ModelN),
    • стек GL_PROJECTION, который должен содержать только матрицу проекции.

Это могут быть также одиночные матрицы, а не стеки, но стек (вместе с glPushMatrix и glPopMatrix) был введен, чтобы позволить программисту "сохранять и загружать" их легко. В расчетах используется только самая верхняя матрица из каждого стека.

Матрица проекции обычно создается с gluPerspective или эквивалентным. Матрица вида может быть создана с помощью gluLookAt (или аналогично матрицам моделей), а матрицы моделей могут быть легко собраны с использованием glTranslate, glRotate и glScale.

(примечание: OpenGL 3.1+ удалил эти функции, что позволяет вам использовать любые матрицы и любые соглашения, которые вы предпочитаете)


Зная, что:

Я хочу иметь возможность получить координаты объекта (например, треугольника) после того, как он был переведен и повернут, поэтому я хочу сделать это так, чтобы позже я мог обнаруживать столкновения и вычислять расстояние между объектами, используя координаты

Разумный способ вычислить всю вашу физику - сделать это в пространстве сцены .

Следовательно, если у вас есть модель (например, треугольная сетка), чтобы получить положение любой ее вершины в пространстве сцены , вам нужно умножить ее влево только на матрицу модели модели. (или в случае иерархии по всем ее модельным матрицам).


О gluProject, на случай, если вам интересно - это удобный метод, который позволяет умножить набор координат на текущий PROJECTION*MODELVIEW и выполняет преобразование области просмотра, чтобы увидеть, где он окажется в пространстве экрана, и gluUnProject делает наоборот.

Ссылка: http://www.opengl.org/resources/faq/technical/transformations.htm

3 голосов
/ 24 ноября 2011

В дополнение к ответу Коса, имейте в виду, что OpenGL не является библиотекой управления сценами . Это просто API рисования, который рисует вещи на экране, а потом забывает о них Точно так же он не имеет никакого представления о том, что такое «объект», он знает только треугольники и даже те, которые он не может запомнить после того, как они были нарисованы. Никогда не задумывались, почему вы должны рендерить всю сцену заново каждый кадр?

Чтобы узнать абсолютное положение объекта на сцене, самостоятельно отследите преобразования и, ну, вычислите его положение по ним.

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