Что делает glLoadIdentity (), делают в OpenGL?

Я плохо знаком с OpenGL, и я немного переполнен всеми случайными функциями, которые я имею в своем коде. Они работают, и я знаю, когда использовать их, но я не знаю, почему мне нужны они или что они на самом деле делают.

Я знаю это glLoadIdentity() заменяет текущую матрицу единичной матрицей, но что точно, который делает? Если каждая программа требует его, почему единичная матрица не по умолчанию, если иначе не указано? Мне не нравится иметь функции в моем коде, если я не знаю то, что они делают. Я должен отметить, что использую OpenGL исключительно для богатых 2D клиентов, так извините мое незнание, если это - что-то очень очевидное для 3D.

Также немного перепутанный glMatrixMode(GL_PROJECTION) VS glMatrixMode(GL_MODELVIEW).

130
задан marvinIsSacul 17 July 2019 в 10:36
поделиться

3 ответа

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

, Поскольку Вы, надо надеяться, знаете, glTranslate и glRotate всегда относительно текущего состояния матрицы. Так, например, если Вы звоните glTranslate, Вы переводите из текущего 'положения' матрицы, не из источника. Но если Вы хотите запуститься в источнике, именно тогда Вы звоните glLoadIdentity(), и затем Вы можете glTranslate от матрицы, которая теперь расположена в источнике, или glRotate от матрицы, которая теперь ориентирована в направлении по умолчанию.

я думаю ответ Блага, что это - эквивалент 1, не точно корректно. Матрица на самом деле похожа на это:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

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

причина, почему это важно, состоит в том, потому что OpenGL умножает все положения и вращения через каждую матрицу; таким образом, например, при рисовании полигона (glBegin(GL_FACE), некоторые точки, glEnd()), он переводит его в "мировое пространство" путем умножения его с MODELVIEW и затем переводит его от 3D до 2D путем умножения его с матрицей ПРОЕКТА, и это дает ему 2D точки на экране, наряду с глубиной (с экрана 'камера'), который он использует для рисования пикселей. Но когда одна из этих матриц является единичной матрицей, точки умножаются с единичной матрицей и поэтому не изменяются, таким образом, матрица не имеет никакого эффекта; это не переводит точки, это не поворачивает их, это оставляет их как есть.

я надеюсь, что это разъясняется немного больше!

138
ответ дан 24 November 2019 в 00:25
поделиться

Единичная матрица является эквивалентом 1 для числа. Поскольку Вы знаете любое число, которое умножается с 1, самостоятельно (e.g. A x 1 = A),

, то же самое идет для матрицы ( MatrixA x IdentityMatrix = MatrixA).

Настолько загружающаяся единичная матрица является способом инициализировать Вашу матрицу к правильному состоянию перед умножением дальнейших матриц в матричный стек.

glMatrixMode(GL_PROJECTION): соглашения с матрицами, используемыми перспективным преобразованием или ортогональным преобразованием.

glMatrixMode(GL_MODELVIEW): соглашения с матрицами, используемыми преобразованием образцового представления. Таким образом, для преобразования объекта (иначе модель) к координатному пространству представления (или пространство камеры).

39
ответ дан 24 November 2019 в 00:25
поделиться

Единичная матрица используется для "инициализирования" матрицы к нормальному значению по умолчанию.

Одна важная вещь понять состоит в том, что умножения матриц в некотором смысле, дополнение. Например, при взятии матрицы, которая запускается с единичной матрицы, умножьте ее времена матрица вращения, затем умножьте ее времена масштабирующаяся матрица, Вы заканчиваете с матрицей, которая поворачивает и масштабирует матрицы, против которых она умножается.

2
ответ дан 24 November 2019 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: