Я хотел бы написать функцию, которая возвращает «Истина», если треугольник (заданный его вершинами и нормальным) в трехмерном пространстве, видна из заданной точки в трехмерном пространстве (заданная ее х, у и z co'rds), учитывая, что другие треугольники в пространстве могут действовать как «блокирующие», которые останавливают вас видеть указанный треугольник от точки.Узнайте, существует ли какой-либо конкретный треугольник в трехмерном пространстве из данной точки с произвольным числом других треугольников, потенциально на пути
Под «видеть» и «видимые» я имею в виду, что можно подключить любой точки треугольника до точки наблюдения с прямым линии, которая не пересекают никаких блокирующих треугольников.
hopefully this shows what I mean
Я посмотрел на «г буферизации» и другие методах для решения «проблемы видимости», однако, так как я не оказывающий треугольники в пиксели для отображения на экране через определенный вид порт я считаю, они не актуальны.
Мои два подхода наивы;
1) проецировать линию от точки наблюдения через каждую вершину потенциального «блокирующего» треугольника до некоторого очень большого радиуса (для моего приложения никакие треугольники не будут находиться на расстоянии более 1000 единиц от точки наблюдения, скажем так, я бы выберите 1001 единиц). Тогда у меня была бы область за трафиком с краями, описанными проецируемыми линиями, в которых объект не может быть замечен. Я сделаю это для всех блокировщиков, затем найду объединение всех этих областей и проверит, находится ли мой треугольник под одной из (потенциально многих) областей.
или
2) Опять стреляют линии для всех блокирующих вершин треугольника, найти точку, в которой эти линии пересекают плоскость, в которой треугольник испытуемого находится, чтобы получить проецируемый треугольник каждого блокатора в плоскости. Смешайте любые перекрывающиеся проецируемые треугольники в один многоугольник. Затем проверьте, что тестируемый треугольник не полностью находится внутри любого из проецируемых треугольников или объединенных полигонов.
Проблема с методом 1) заключается в том, что его трудно найти, если форма полностью закрыта трехмерным томом и еще сложнее объединить пересекающиеся трехмерные тома в один большой объем 3D.
Проблема с методом 2) бывают случаи, когда проецируемые линии через блокирующие вершины треугольника никогда не попадут в плоскость представляющего интерес треугольника. Нельзя просто игнорировать эти случаи, они все еще могут заглушить интересующий треугольник, они просто проливают бесконечную длинную тень на самолет.
Я опираюсь на метод 2, но, как я уже сказал, эти методы кажутся немного наивными, если кто-то может предложить более элегантное решение, это было бы очень интересно для меня! Описание или псевдокод является идеальным, в конце концов я надеюсь реализовать это в matlab или C++, но на данный момент позволяет держать вещи вообще!