Трассировка лучей в пространстве объектов, преобразование нормалей - PullRequest
0 голосов
/ 03 июня 2018

У меня есть рабочий трассировщик лучей (написанный на узле с использованием 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);

Как правильно обращаться с нормалями при использовании матриц преобразования для ваших объектов?Я попытался преобразовать обратно в мировое пространство после этого, я попытался вычислить нормальное после перемещения пересечения назад, но ничего не работает!

1 Ответ

0 голосов
/ 05 июня 2018

Мне удалось решить это.Я был на правильном пути, только я не преобразовывал свои нормальные отраженные лучи и , так что это все еще выглядело странно.Сложная вещь с трассировкой лучей - это единственное тестирование, которое вы можете сделать, это «визуальный осмотр»

Вот краткий обзор моего рабочего кода пересечения для сферы в пространстве объектов

// Intersection in object space
let intersect: vec4 = ray.getPoint(t);

// Normal is pointing from center of sphere (0,0,0) to intersect (i)
// Divide by sphere radius 
vec4.div(normal, intersect, [radius, radius, radius, 1]);
n[3] = 0;

// Move i back to world space
vec4.transformMat4(intersect, intersect, transFwd);

// Reflected ray about the normal, & move to world
let reflect: vec4 = ray.reflect(normal);
vec4.transformMat4(reflect, r, transFwd);
vec4.normalize(reflect, reflect);   

// Move normal into world & normalize
vec4.transformMat4(normal, normal, transFwd);
vec4.normalize(normal, normal);
...