Преобразование нормалей в Maxscript - PullRequest
0 голосов
/ 17 мая 2018

Я хочу масштабировать нормали (значения Point3), поэтому я считаю, что мне нужно создать масштабную матрицу, а затем использовать ее обратную транспонирование для масштабирования нормали. Это то, что я обычно делаю с матрицами 4x4 однородных. Однако maxscipt использует матрицу 3x3 и 4-ую строку для перевода. Как я могу сделать преобразование? Макс скрипт позволяет мне создать масштабную матрицу и инвертировать ее. Однако в нем говорится, что нет метода транспонирования для значений matrix3.

Это код, который не работает:

smat = scaleMatrix [1, 2, 3]
smat = inverse smat
smat = transpose smat -- No transpose function for matrix3
p = p * smat

Также мне интересно, меняют ли нормали направление, даже если поверхность, которой они принадлежат, масштабируется неравномерно. Моя интуиция говорит, что нет :) 1006 *

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Если матрица, которую вы хотите применить, является ортогональной, вам не нужен шаг обратного + транспонирования. В противном случае вам понадобится транспонировать только часть 3х3:

fn transpose3x3 TM =
        matrix3 [TM.row1[1], TM.row2[1], TM.row3[1]] \
                [TM.row1[2], TM.row2[2], TM.row3[2]] \
                [TM.row1[3], TM.row2[3], TM.row3[3]] [0, 0, 0]
0 голосов
/ 19 мая 2018

По первому вопросу, если вы хотите масштабировать только нормали, почему вы не можете масштабировать по одному или трем триплетам вместо матрицы?

x = [1,2,3]
x*2          -- yields [2,4,6]
x*[2,3,4]    -- yields [2,6,12]

По вашему второму вопросу, неравномерная шкала действительно является проблемой для нормалей. Хотя модификатор Edit Normals сообщит одно и то же значение до и после масштабирования объекта, $Box001.modifiers[1].getNormal 1 node:$Box001, в окнах просмотра и рендере вы можете видеть, что нормали растянуты. Это одна из причин, по которой художников учат никогда не использовать неравномерное масштабирование.

Слева находится объект Box, смоделированный как куб, затем был применен Edit Normals, затем объект был масштабирован до прямоугольника. Справа находится объект Box, смоделированный как прямоугольник, первоначально до применения Edit Normals. Нормальные значения выглядят по-разному в области просмотра, а затенение отличается как в области просмотра, так и при визуализации.

enter image description here

0 голосов
/ 17 мая 2018

Я использовал тип BigMatrix в maxscript. Однако для этого нужен метод умножения матрицы * Point3. Я написал это также.

-- constructing the scale matrix
smatrix = bigMatrix 3 3
smatrix[1][1] = sx
smatrix[2][2] = sy
smatrix[3][3] = sz

invert smatrix
transpose smatrix

function bigMulti m v =
(
  local p = [0, 0, 0]
  p.x = m[1][1] * v.x + m[2][1] * v.y + m[3][1] * v.z
  p.y = m[1][2] * v.x + m[2][2] * v.y + m[3][2] * v.z
  p.z = m[1][3] * v.x + m[2][3] * v.y + m[3][3] * v.z

  p = normalize p
  return p
)

-- lets say we want to transform this normal [0, 1, 0]
normal = [0, 1, 0]
normal = bigMulti smatrix normal
...