Я собираю raytracer в Go, который записывает результат в файл PNG. До сих пор я добился большого прогресса, но я столкнулся с дилеммой. Я могу нарисовать треугольники на экране, но не могу преобразовать точку пересечения в треугольнике в 2D-координату на текстуре PNG треугольника. Вот что я получил до сих пор:
func (t Triangle) GetTextureCoordinate(intersect Vector3) (x, y int) {
return int(math.Floor(t.shortestSides[0][0].DistanceAcross(intersect, t.shortestSides[0][1]) * float64(t.texture.width))), int(math.Floor(t.shortestSides[1][0].DistanceAcross(intersect, t.shortestSides[1][1]) * float64(t.texture.height)))
}
Чтобы подвести итог тому, что я здесь сделал, сначала нужно понять, что я нашел две самые короткие стороны треугольника (сохраненные как t.shortestSides[0]
и t.shortestSides[1]
, которые являются массивами, которые содержат два вектора Vector3). Затем я нашел расстояние от точки пересечения до первой точки на треугольнике. Затем я взял это расстояние и разделил его на расстояние по обеим кратчайшим сторонам, и посчитал, что это координата текстуры. Вот некоторый псевдокод этого:
// Example
intersectionPoint = Vector3(0, 1, 4)
// Example
shortestSides = [
[ Vector3(0, 0, 0), Vector3(5, 5, 0) ],
[ Vector3(0, 0, 0), Vector3(0, 5, 5) ]
]
return [
distance(intersectionPoint, shortestSides[0][0]) / distance(shortestSides[0][0], shortestSides[0][1]),
distance(intersectionPoint, shortestSides[1][0]) / distance(shortestSides[1][0], shortestSides[1][1])
]
Я знаю, что этот метод не работает, но я ближе всего видел полу-работу с текстурами, как показано здесь.
За этой сферой находятся два треугольника, которые образуют прямоугольник. Какую еще формулу я могу сделать, чтобы преобразовать эту точку пересечения в 2D-координату на моей текстуре? Я понимаю, что мой вопрос довольно сложный, поэтому я не ожидаю, что кто-нибудь полностью поймет сценарий.