Войти
ПрограммированиеФорумГрафика

Правильная трансформация нормалей. (2 стр)

Страницы: 1 2 3 Следующая »
#15
18:28, 6 апр. 2017

Хм.. а как быть, если матрица содержит и перспективные искажения?
И преобразования транспонированной инверсной матрицей, и мой предыдущий вариант дают одинаковый неверный результат.

#16
9:37, 7 апр. 2017

Решил!
Это уже не аффинное преобразование, трансформировать нормаль в отрыве от позиции было нельзя, вот так работает:

Public Sub TransformPosNorm(Pos As D3DVECTOR, Norm As D3DVECTOR, M As D3DMATRIX)
  Dim V1 As D3DVECTOR
  Dim V2 As D3DVECTOR
 
  If Abs(Norm.x) < Abs(Norm.y) Then
    V1 = Vec3(1, 0, 0)
  Else
    V1 = Vec3(0, 1, 0)
  End If
  D3DXVec3Cross V1, V1, Norm
  D3DXVec3Cross V2, V1, Norm
  D3DXVec3Add V1, V1, Pos
  D3DXVec3Add V2, V2, Pos
  D3DXVec3TransformCoord Pos, Pos, M
  D3DXVec3TransformCoord V1, V1, M
  D3DXVec3TransformCoord V2, V2, M
  D3DXVec3Subtract V1, V1, Pos
  D3DXVec3Subtract V2, V2, Pos
  D3DXVec3Cross Norm, V2, V1
  D3DXVec3Normalize Norm, Norm
End Sub

#17
14:43, 19 апр. 2017

Кстати я вот что не понял.
Есть скажем t-позиция r-поворот s-скейл
N- нормаль
Делаю:
Matrix m = setmatrix(t, r, s)
m = m. Inverse. Transpose
N = N * m
Нормаль трансформирует правильно.
Упрощаю:
Matrix m = martixfromquaternion(r)
N = N * m
И получается чето не то..
Выходит что ротация и скейл также влияют на нормаль?

#18
17:31, 19 апр. 2017

Mira
Выходит, что matrixfronquaternion косячит

#19
17:51, 19 апр. 2017

AMM1AK
да но первый вариант со сборкой матрицы, та кже содержит эту операцию

procedure _D3DMATRIX.Transformation(const position: TD3DVector;
  const Rotation: TD3DQuaternion; const scale: TD3DVector);
var
  mt,mr,ms:TD3DMatrix;
begin
  mr.RotationFromQuaternion(Rotation);

  mr.Row[0]:= mr.Row[0] * scale.x;
  mr.Row[1]:= mr.Row[1] * scale.y;
  mr.Row[2]:= mr.Row[2] * scale.z;
  mr.Row[3].v3 := position;
  self:=mr;
end;
а в теории Inverse. Transpose должен дать тот же результат?
я просто видел что везде для нормали юзают именно IT матрицы, а инверсия-транспонирование довольно дорогая операция когда этих матриц в стеке штук 500 =)
подумал нельзя ли матрицу для нормали проще собирать, сразу из одного вращения.
еще думал может сразу умножать на кватернион, но там операция какая-то вертикальная, хренова ложится на SIMD
#20
17:55, 19 апр. 2017

Mira
> транспонирование довольно дорогая
с чего вдруг.

#21
17:57, 19 апр. 2017

Aroch
Там "инверсия-транспонирование", и именно инверсия действительно довольно дорогая.

#22
18:00, 19 апр. 2017

точняк. инверсе просто огромная (причем даже на обычном)
Transpose

+ Показать

Inverse
+ Показать

#23
18:08, 19 апр. 2017

Mikle
для матрицы вращения транспонирование и есть инверсия.

#24
18:19, 19 апр. 2017

а да, это я занубил. не в том порядке перемножил кватернионы в иерархии.
так шустрее получается и работает.

#25
19:28, 19 апр. 2017

Mira
> подумал нельзя ли матрицу для нормали проще собирать, сразу из одного вращения.
Нельзя. Надо еще домножать на обратный скейл.
[cht]\[M^{it}=(RS)^{it}=R^{it}S^{it}=RS^i\][/cht]
Причем, т. к. нормаль все равно надо отдельно нормализовывать, то общий множитель не важен и обратный скейл можно считать без делений:
[cht]\[S^i=diag(S_x,\quad S_y,\quad S_z)^i=diag(1/S_x,\quad 1/S_y,\quad 1/S_z)=diag(S_yS_z,\quad S_xS_z,\quad S_xS_y)/(S_xS_yS_z)\][/cht]

#26
19:55, 19 апр. 2017

}:+()___ [Smile]
у меня видимо зашло, так как скейл единичный.

#27
20:24, 19 апр. 2017

кстати, зачем в шейдер передавать нормализованные нормали? вроде итак катит + в шейдере так или иначе используется нормализация нормали уже в VS

#28
20:41, 19 апр. 2017

Mira
> кстати, зачем в шейдер передавать нормализованные нормали? вроде итак катит + в
> шейдере так или иначе используется нормализация нормали уже в VS
Если нормализация в VS есть - то незачем. Однако если нормализацию в VS не сделать, а передать это дело в пиксельный шейдер, то будет бяка после интерполирования. Примерно такая:
not_normalized | Правильная трансформация нормалей.

#29
4:46, 20 апр. 2017

Ваще нихрена не понял. Особенно, почему

Mikle
> Vec3TransformNormal не подходит, если матрица включает не только переносы и
> повороты, но и скейл. Нормализация нормалей после Vec3TransformNormal тоже не
> панацея, даже в результате чистого скейла нормали меняют направление (и должны
> менять, но не так, как меняют).
нормали меняют направление.

Объясните пожалуйста нубу.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.