У меня есть рабочий трассировщик лучей (написанный на узле с использованием gl-матрицы). Он прекрасно работает со сферами, но теперь я добавляю матричные преобразования общего назначения (перевод, вращение, масштабирование) для поддержки других типов объектов.
У меня есть две матрицы преобразования на объект, одна обратная для мира к объекту с именем trans
и одна обратно transFwd
, настроенная с помощью fromRotationTranslationScale
// Here pos is center of sphere and r is radius
mat4.fromRotationTranslationScale(this.transFwd, rotation, [pos[0], pos[1], pos[2]], [r, r, r]);
mat4.invert(this.trans, this.transFwd);
Я преобразую все лучи, используя преобразование trans
, в пространство объектов, вычисляя пересечение моего луча с объектом (значение t ) относительно начала координат со сферами радиуса 1.
Задача после вычисления t , работы с моим пересечением и нормалями.Когда я добавляю какой-либо поворот в свое преобразование, все они искажаются
// ray has already been transformed to object space
// getPoint simply returns ray.pos + t * ray.dir
let intersect: vec4 = ray.getPoint(t);
let normal: vec4 = vec4.sub(vec4.create(), i, [0, 0, 0, 1]);
vec4.normalize(n, n);
// move intersect back to world space
vec4.transformMat4(intersect, intersect, this.transFwd);
Как правильно обращаться с нормалями при использовании матриц преобразования для ваших объектов?Я попытался преобразовать обратно в мировое пространство после этого, я попытался вычислить нормальное после перемещения пересечения назад, но ничего не работает!