Матрицы в Cinema 4D
Матрица — это тип для представления линейных преобразований в Cinema 4D. Матрица состоит из четырех компонентов:
v1 — ось X или базисный вектор i кадра линейного преобразования, определенного экземпляром Matrix.
v2 — ось Y или базисный вектор j кадра линейного преобразования, определенного экземпляром Matrix.
v3 — ось z или базисный вектор k кадра линейного преобразования, определенного экземпляром Matrix.
off — дополнительный компонент перемещения.
Матрицу можно создать несколькими способами, поскольку все аргументы ее конструктора необязательны:
Матрицы достаточно, чтобы хранить все три важных свойства объекта: положение, вращение и масштаб. (Положение хранится в первом векторе, вращение определяется направлением трех осевых векторов, а масштаб определяется их длиной.) Поэтому каждый объект имеет матрицу, которую вы можете получить с помощью BaseObject.GetMl().
Чтобы понять как набор из трех векторов (v1, v2, v3) определяет вращение и масштаб объектов сцены - нужно представить что к каждому объекту прикреплены три единичных вектора (взаимно перпендикулярных). Каждый из этих векторов имеет проекцию на оси X,Y и Z, поэтому имеем набор из 3x3 = 9 чисел. Изначально, каждый из трех векторов параллелен одной из осей и имеет максимальное значение проекции на эту ось равное 1, и две проекции на другие оси со значениями 0. Имеем:
Если мы начнем вращать объект вокруг оси Z то увидим как меняются проекции векторов v1 и v2 на оси X и Y
После поворота, на последнем кадре будет:
Чтобы сравнить два объекта в разных иерархиях, нам нужен способ получить их глобальные координаты. Здесь на помощь приходит умножение матриц. Умножение двух матриц — это не просто умножение соответствующих чисел; это гораздо сложнее. Фактически, умножение матриц даже не коммутативно: a*b — это не то же самое, что b*a . К счастью, для этого не обязательно знать, как умножать две матрицы.
Если матрица Mp является матрицей родительского элемента, а Mc — матрицей дочернего элемента, то произведение Mp*Mc дает матрицу, которая представляет положение и вращение дочернего элемента, но в системе координат родительского элемента. Это означает, что получение глобальной матрицы дочернего элемента — это всего лишь вопрос умножения ее на каждую из матриц его родителей.
К счастью, нам не придется делать это умножение самостоятельно. Каждый объект имеет следующие предопределенные функции:
Например, если у вас есть объект с именем «MyObject», спрятанный глубоко в иерархии объектов, следующий код напечатает его глобальную позицию:
Чтобы вычислить расстояние между двумя объектами в разных иерархиях, просто используйте их глобальные позиции:
Если вы хотите написать плагин средней точки, безопасный для иерархии, вы можете сделать следующее:
Last updated