Как рассчитать, является ли точка в кубе видимостью в WPF 3D

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

Как и на картинке, красная вершина должна быть невидимой, а остальные должны быть видны.

Может кто подскажет формулу для расчета?

Куб может быть повернут, что у меня нет возможности это сделать.

Я пытаюсь использовать HitTest для этого, но у него плохая производительность.

Я хочу знать формулу для расчета видимости точки, лица и линии.

Редактировать:

Точка – это любая точка на прямой.

Я строю его с помощью Media3D.


person lindexi    schedule 29.03.2017    source источник
comment
любые формулы будут медленнее, чем тест на попадание, поскольку тест на попадание использует лучшую формулу, идея состоит в том, чтобы просто рассчитать линию от камеры до точки, затем с помощью ограничительных рамок исключить все формы, которые не пересекают линию, затем используя плоская геометрия найдите любые фигуры, которые имеют плоскость, пересекающую линию, затем проверьте прозрачность любых пересечений, если нет непрозрачных пересечений, вы можете увидеть точку   -  person MikeT    schedule 29.03.2017
comment
@MikeT Я не могу использовать Z-буфер для расчета. Я пробую тест на попадание, который имеет низкую производительность.   -  person lindexi    schedule 29.03.2017
comment
я никогда не упоминал, что Zbuffer и тест на попадание будут иметь лучшую производительность, чем что-либо еще, поскольку они уже делают именно то, что вы будете делать, если хотите получить более подробную информацию о процессе, см. здесь ericsink.com/wpf3d/6_RayTracing.html   -  person MikeT    schedule 29.03.2017
comment
@MikeT Спасибо, но тест на попадание подождет рендеринг. Поэтому я хочу иметь формулу, которая не может дождаться.   -  person lindexi    schedule 29.03.2017
comment
Чего вы хотите добиться с помощью этой информации?   -  person wkl    schedule 07.04.2017
comment
@wkl Я хочу сделать образовательное приложение для старшеклассника, который хочет понять 3D   -  person lindexi    schedule 08.04.2017
comment
Самый простой способ сделать это — провести рейкаст из этой точки на камеру и посмотреть, пересекаете ли вы куб (вам нужно будет сделать это для каждой точки куба, то есть 8 раз за кадр). если вы ищете алгоритмы raycasting, посмотрите здесь: gamedev.stackexchange.com/questions/18436/   -  person Timothy Groote    schedule 18.04.2017
comment
@TimothyGroote Спасибо за ответ.   -  person lindexi    schedule 18.04.2017


Ответы (2)


Если какая-либо из граней, соединенных с вершиной, имеет нормаль, обращенную к камере (см. отсечение задней грани), вершина видна. Это должно быть довольно быстро вычислено.

person Orhan ODABAŞI    schedule 18.04.2017
comment
Можете ли вы дать мне алгоритмы? - person lindexi; 19.04.2017
comment
Алгоритм, который подробно описал Дрю, — это алгоритм отбраковки обратной стороны. - person Orhan ODABAŞI; 19.04.2017
comment
Спасибо, позвольте мне попробовать ваш алгоритм. - person lindexi; 19.04.2017

Попробуйте взять скалярное произведение «вектора камеры» (обычно это (0,0,1)) и всех векторов нормалей граней куба, которых касается рассматриваемая вершина.
Если какое-либо из скалярных произведений возвращается отрицательное значение, то угол между вектором камеры и вектором нормали соответствующей грани куба больше 90 градусов, и, следовательно, он "лицом" к камере.
Если интересующая точка является вершиной, вы будете работает с тремя точечными продуктами. Если точка интереса находится вдоль линии между вершинами, вы вычислите только две.

person Drew Sands    schedule 18.04.2017
comment
Спасибо, позвольте мне попробовать ваши алгоритмы. - person lindexi; 19.04.2017