Я буду использовать это как общий справочник, но чем больше я просматриваю онлайн-документы и книги, тем меньше я понимаю об этом.
const float vertexPositions[] = {
0.75f, 0.75f, 0.0f, 1.0f,
0.75f, -0.75f, 0.0f, 1.0f,
-0.75f, -0.75f, 0.0f, 1.0f,
};
В этой онлайн-книге приведен пример того, как нарисовать первый и классический привет для OpenGL о создании треугольника.
Структура вершин треугольника объявлена так, как указано в коде выше.
В книге, как и во всех других источниках об этом, подчеркивается, что Clip Space - это 4-мерная структура, которая используется для определения того, что будет растеризовано и отображено на экране.
Здесь у меня есть свои вопросы:
- я не могу представить что-то в 4D, я не думаю, что человек может сделать это, что такое 4D для этого пространства клипов?
- самый читаемый человеком документ, который я читал, говорит о камере, которая является просто абстракцией над концепцией отсечения, и я понимаю, что проблема в том, почему бы не использовать концепцию камеры в первую очередь, которая является более знакомая 3D структура? Единственная проблема, связанная с концепцией камеры, заключается в том, что вам нужно определить перспективу другим способом, и поэтому вам нужно добавить еще одно утверждение о том, какую камеру вы хотите иметь.
- Как я должен это читать
0.75f, 0.75f, 0.0f, 1.0f
? Все, что я получаю, это то, что все они являются значениями с плавающей запятой, и я получаю значение первых трех значений, что это означает последнее?
Ответы:
Волшебный термин «Гомогенные координаты», которые используются в системах, где перспектива является фактором. Проверьте вики для обзора, но это действительно долгий курс обучения, чтобы понять его (чего я не знаю).
источник
Прочитайте введение книг, которые вы прочитали, вы будете удивлены;)
http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html в разделе Обзор растеризации
Значение «w» (где первые 3 значения x, y и z) в основном говорит, каковы размеры пространства клипа. Поскольку это 1 скалярное значение, все 3 измерения пространства клипа равны (и поэтому пространство клипа является кубом). У каждой вершины есть свое собственное пространство клипа, в котором она существует (и в основном она должна «вписываться», иначе это CLIPS: D), не существует 1 «мира», который является пространством клипа (хотя все пространства клипа находятся в одном и том же » мир "Я думаю, даже у меня есть проблемы с этим; P).
Так, если ваша вершина имеет, например, координату [1,1,1], если пространство клипа равно 1, то вершина находится в верхнем правом углу экрана (когда все по умолчанию, я не знаю, если направления можно изменить). Но если вершина имеет пространство обрезки 2, то координата [1,1,1] будет где-то, скажем, 3 четверти по экрану вправо, 3 четверти по экрану сверху и третье измерение можете догадаться.
Я думаю, что, скажем, пространство клипа 5 будет означать, что места в этом пространстве клипа находятся в диапазоне от -5 до 5 для каждого измерения, а не куб 5x5x5. Но это, вероятно, потому, что проще говоря: все координаты xy и z делятся на размерность пространства клипа, поэтому в основном ваши вершины проходят это:
х = х / ж
y = y / w
z = z / w
И это то, что делает все это возможным. Я думаю, что причина этого существует для простых сравнений. Если координаты были разделены на размер пространства клипа, то координата, которая имеет 1 или более компонентов со значением больше 1, существует вне пространства клипа. Итак, если ваше пространство клипа, скажем, 1024, но координата равна [2000,3, -100], то компонент x (2000) находится вне пространства клипа (которое находится в диапазоне от -1024 до 1024).
В вычислительном отношении легко определить, находится ли что-то внутри пространства клипа, если все, что вам нужно сделать, это (очень грубо говоря, ofc): (x / w) <1 && (x / w)> - 1, а затем выполнить рендеринг. Кроме того, я предполагаю, что наличие всех пространств клипа во всех вершинах одинакового размера (поэтому каждый куб пространства клипа в диапазоне от -1 до 1 в каждом измерении) упрощает все, что происходит после процесса нормализации, поскольку с этого момента все координаты плавает в диапазоне от 0 до 1 (независимо от того, что было обрезано).
источник
TL; DR это не 4D пространство, это 3D плюс масштабное число, которое практически всегда равно 1. Если это 1, вы можете игнорировать его, и первые три числа x, y, z. Если нет, то все становится сложнее.
Вот простое объяснение. Вершины в 3D должны иметь только три компонента
⌈x⌉ v = |y| ⌊z⌋
Если мы хотим манипулировать ими (например, вращение, масштабирование и т. Д.), Мы используем матрицу. Самым распространенным примером, конечно, является матрица Model-View-Projection (MVP), которая преобразует мировые координаты в пространство клипа. Как это:
⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋
Однако это имеет большой недостаток: вы не можете сделать перевод. Если
[x,y,z]
ноль, то независимо отm
результата всегда будет ноль, поэтому у нас не может быть MVP, который включает перевод. Очевидно, нам бы это понравилось. Решение состоит в том, чтобы добавить 1 к концу наших векторов и расширить матрицу до 4x4:⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋
(Если вы посмотрите на любую ортогональную матрицу MVP - например, от
glOrtho()
- вы обнаружите, что 4-я строка - это0 0 0 1
. Иногда она даже остается неявной.) Если вы поработаете над математикой, вы увидите, что это то же самое, что и⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋
4-й компонент вызывается
w
, и хотя он не должен быть равным 1, он почти всегда таков ( во всяком случае, перед преобразованием; впоследствии он обычно повторно гомогенизируется путем деления целого вектора на 1,w
поэтому он снова равен 1). Это своего рода хак, чтобы разрешить преобразованиям включать в матрицы преобразования.редактировать
Я считаю, что первоначальная мотивация была для перспективных проекций , которые невозможны с трехмерными координатами. Существуют и другие преобразования, которые вы можете выполнять только с 4D-векторами, но перевод легче всего понять.
источник
Я также вижу еще одну причину, которая не была упомянута в предыдущих ответах.
Матрицы перевода 4х4, так что вы также можете перевести объект вокруг «мира». Потому что с матрицей 3x3 вы можете вращать и масштабировать трехмерную координату, но вы можете перевести трехмерную координату только с матрицей 4x4, отсюда необходимо выразить трехмерные координаты в 4d-векторе.
источник