Поэтому я пытаюсь заставить загрузку OBJ работать в моем raytracer. Загрузка OBJs работает нормально, но у меня возникли проблемы с наложением текстур.
Вот изображение моего результата. Предполагается, что это черная сфера с цветными линиями «широта и долгота» с черным пятном посередине. Но кажется, что каждый второй треугольник остается черным. Вы можете увидеть результат здесь:
Мой проф сказал, что похоже, что нормали задом наперед, но я не думаю, что это так, потому что форма все еще находится под ударом, а цвет «неправильных» треугольников — это цвет фона текстуры (т.е. чёрный в этом случае).
Когда я загружаю OBJ, каждая вершина имеет координаты UV, связанные с ней. То, что я делаю, чтобы получить координату UV, когда луч достигает формы, выглядит следующим образом:
T: the triangle that was hit
hp: where on the triangle the ray hit
v1,v2,v3: the vertices of the triangle, each has a UV coord UV1, UV2, UV3
find the distance to each v[i] from hp (d1,d2,d3 respectively)
find the weight of each of these (w1 = d1/(d1+d2+d3), same for d2,d3)
find the weighted UV coord: UV1/w1 + UV2/w2 + UV3/w3
find the pixel color based on this weighted coord
У кого-нибудь есть идеи, что может происходить? Я могу опубликовать части своего кода, если вы думаете, что это поможет.
У вас действительно есть ошибка в ваших вычислениях UV-координат (независимо от того, есть ли у вас дополнительная ошибка с вашими нормалями).
Причина, по которой я так говорю: если у вас hp, например, очень близкий к v1, у вас в итоге будет вес w1, очень близкий к нулю, а когда вы вычисляете UV1 / w1, он будет стремиться к + бесконечности вместо ожидаемого значения. UV1.
Таким образом, вы должны смотреть на барицентрические координаты
Других решений пока нет …