Как получить координаты текстуры из точки пересечения треугольника? - PullRequest
0 голосов
/ 27 октября 2019

Я собираю 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])
]

Я знаю, что этот метод не работает, но я ближе всего видел полу-работу с текстурами, как показано здесь.

enter image description here

За этой сферой находятся два треугольника, которые образуют прямоугольник. Какую еще формулу я могу сделать, чтобы преобразовать эту точку пересечения в 2D-координату на моей текстуре? Я понимаю, что мой вопрос довольно сложный, поэтому я не ожидаю, что кто-нибудь полностью поймет сценарий.

...