В компьютерной графике преобразования представлены матрицами. Если вы хотите что-то вращаться, вы умножаете все его вершины (вектор) на матрицу вращения. Хотите, чтобы он переместился? Умножить на матрицу перевода и т. Д.
tl; dr: Вы не можете описать перевод по оси z с помощью 3D-матриц и векторов. Вам нужно как минимум еще 1 размер, поэтому они просто добавили фиктивный размер w
. Но вещи ломаются, если это не 1, поэтому держите его в 1: P.
. В любом случае, теперь мы начнем с быстрого обзора по умножению матрицы:
Вы в основном положили x
выше a
, y
выше b
, z
выше c
. Умножьте весь столбец на переменную, которую вы только что переместили, и суммируйте все в строке.
Итак, если вам нужно перевести вектор, вам нужно что-то вроде:
Посмотрите, как x
и y
теперь переведены на az
и bz
? Это довольно неудобно:
z
, когда вы перемещаете вещи (что, если z
было отрицательным? Вам пришлось бы двигаться в противоположных направлениях Это тяжело, если вы просто хотите переместить что-то на дюйм ...) z
. Вы никогда не сможете летать или уходить в подполье Но если вы всегда можете убедиться, что z = 1
:
Теперь гораздо яснее, что эта матрица позволяет вам перемещаться по плоскости xy значениями a
и b
. Только проблема в том, что вы концептуально левитируете все время, и вы все равно не можете идти вверх или вниз. Вы можете перемещаться только в 2D.
Но вы видите рисунок здесь? С 3D-матрицами и 3D-векторами вы можете описать все основные движения в 2D. Итак, что, если бы мы добавили 4-мерное измерение?
Выглядит хорошо. Если мы постоянно сохраняем w = 1
:
Там мы идем, теперь вы получаете перевод по всей оси 3. Это то, что называется однородными координатами.
Но что, если бы вы делали большие и большие; сложная трансформация, приводящая к w != 1
, и нет никакого способа обойти это? OpenGL (и в основном любая другая система CG, я думаю) будет выполнять так называемую нормализацию: разделите результирующий вектор на компонент w
. Я не знаю достаточно, чтобы точно сказать, почему (потому что масштабирование является линейным преобразованием?), Но оно имеет благоприятные последствия (может использоваться в перспективных преобразованиях). В любом случае, матрица перевода будет выглядеть так:
И вот вы посмотрите, как каждый компонент скроется w
, то это переводится? Вот почему w
управляет масштабированием.
У вас есть правильный ответ, просто умножьте его на 24, если вы хотите сохранить время отдельно, или добавьте его к соответствующей дате, если вы хотите использовать дату / время, и в любом подходящем формате.