Является ли система координат OpenGL правой или левой рукой? - PullRequest
5 голосов
/ 02 марта 2011

Скажем, я использую Identity Matrix для своей модели ModelViewTransformation Matrix в программе OpenGL ES 2.0.Система координат в этом случае является канонической системой координат OpenGL, которая простирается от (-1, -1, -1) до (1,1,1).

Является ли эта система координат правильнойот руки или от левой?

Более широкий вопрос: существует ли документ с OpenGL, в котором можно перечислить все математические соглашения, которым следует API?

Ответы [ 4 ]

7 голосов
/ 02 марта 2011

У меня вопрос, эта система координат - правша или левша?

По умолчанию OpenGL всегда правша.Вы можете наблюдать это автоматическим нормальным созданием.Вы можете принудительно создать обычное левостороннее создание, указав его для каждой точки, но в целом правило правой руки применяется постоянно.См. 9.150 в FAQ по OpenGL для подробного обсуждения природы OpenGL, предназначенной только для правой руки.

... все математические соглашения, которым следует API?

Непонятно, о чем вы просите.Математика - это базовая линейная алгебра с сильным акцентом на матричная математика и линейные преобразования .

РЕДАКТИРОВАТЬ для ответа на вопрос с комментариями:

ПОМНИТЕ , однако, что если вы используете вызовы с единообразной матрицей, а не более старые glRotates и т. Д., Вы должны указать, используете ли вы матрицы строк или столбцов.В этом случае (из кода, упомянутого в комментарии):

glUniformMatrix4fv(uniforms[UNIFORM_MVP], 16, GL_FALSE, mvpMatrixZRotation);

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

Измените это на GL_TRUE, и все будет хорошо.

Вот очень простой пример с доски обсуждений OpenGL, который имеет отношение к этой конкретной теме.

Еще одно редактирование для ответа на запрос комментариев : Вот еще одно подробное объяснение конвейера матрицы в OpenGL.Обратите внимание на диаграмму GL_MODELVIEW с тремя осями: они иллюстрируют правую систему координат.Приведенная выше ссылка в FAQ также по-прежнему применима.

5 голосов
/ 02 июля 2014

ALWAYS REMEMBER!! OPENGL ONLY KNOWS NDC ,AND IT IS LEFT_HANDED!

иллюзия openGL правша, потому что в фиксированном конвейере фиксированная функция правша, как glOrtho (...), glFrustrum (..), все эти функции устарели во времена программируемых трубопроводов.

OpenGL не волнует, какую систему координат вы используете для промежуточных матричных процессов. Вы можете использовать систему координат оси, если хотите, если вы отражаете ее в NDC.

забудьте о камере!

потому что наш экран - 2D-плоскость. Представьте себе, ваш видовой экран - желтая резиновая плоскость. Соснитесь на этих четырех углах к NDC. что-то вроде этого: enter image description here

все вершины в NDC попадают на желтую резиновую плоскость вдоль оси -z. Это то, что вы видите на реальном экране.

4 голосов
/ 27 марта 2014

Канонический объем представления, или нормализованные координаты устройства, является / левосторонним.Это легко проверить, передав матрицу тождеств и нарисовав 2 треугольника, скажем

float points[] = { -1,  1,  -0.5,
                   -1, -1,  -0.5,
                    1, -1,  -0.5,

                    1,  1,   0.5,
                   -1, -1,   0.5,
                    1, -1,   0.5 };

и посмотрев на результаты (с glEnable (GL_DEPTH_TEST))

Таким образом, ваш вершинный шейдер будет выглядеть следующим образом:

uniform mat4 mvp_mat;

// Incoming per vertex... position (fills in 1 for w if from vec3 buf)
layout (location = 0) in vec4 v_vertex;


void main(void) 
{ 
    // multiplying by identity doesn't transform the geometry
    gl_Position = mvp_mat * v_vertex;
}

или вы можете даже проверить это более просто, так как единичная матрица ничего не делает

layout (location = 0) in vec4 v_vertex;

void main(void) 
{
    //no transformation, no confusion, just straight to OpenGL
    gl_Position = v_vertex;
}

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

Также см. этот пост и мой комментарий / вопрос в нем: plus.google.com/114825651948330685771/posts/AmnfvYssvSe

Я не знаю, где все неправильноинформация поступает из Интернета и даже из учебников.OpenGL по умолчанию правша, только если вы говорите об обмотке треугольника для определения передней грани (CCW по умолчанию = правша).Пространство мира, пространство объектов и пространство глаз не существуют для OpenGL, только для графического программиста.OpenGL просто берет точки, обрезает что-либо вне объема канонического представления [-1, -1, -1] x [1, 1, 1] и преобразует их в координаты экранного пространства / окна, которые по умолчанию равны [0, w) x [0, h) x [0, 1].Если проверка глубины включена, поведение по умолчанию - левша, глядя вниз + z.

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

http://www.opengl.org/sdk/docs/man3/xhtml/glDepthFunc.xml

Еще одно доказательство того, что это левша, здесь http://www.opengl.org/sdk/docs/man3/xhtml/glDepthRange.xml

"Послеотсечение и деление на w, координаты глубины находятся в диапазоне от -1 до 1, что соответствует ближнему и дальнему плоскостям отсечения ", т. е. положительный z попадает на экран = левша.Вы также можете использовать DepthRange, чтобы перейти к правостороннему поведению.

РЕДАКТИРОВАТЬ: В ответ на настойчивое требование Боба Кросса, что я не прав, приведу программу с одним исходным файлом, которая показывает, что я прав.https://github.com/rswinkle/opengl_reference/blob/master/src/left_handed.c

Вы можете увидеть скриншот в README https://github.com/rswinkle/opengl_reference

1 голос
/ 14 апреля 2011

Система координат Opengl ES действительно является правосторонней системой, включая канонический объем от (-1, -1, -1) до (1,1,1). Я подтвердил это с помощью кода.

...