May 26, 2022

Трансформация нормалей

Для трансформации нормалей на объекте с отрицательным скейлом метод Unity transform.TransformDirection() дает некорректный результат. Вместо него нужно использовать более дорогой, но правильный код

public static Vector3 TransformDir(Transform transform, Vector3 dir){
    var matrix = transform.localToWorldMatrix;    
    var matrixInverse = matrix.inverse;    
    var matrixTranspose = matrixInverse.transpose;    
    var n = (Vector3) (matrixTranspose * dir);    
    return n;
}

Подробное объяснение в главе 4.5 книги Mathematics for 3D Game Programming and Computer Graphics

https://t.me/lab_sborki