Вы не можете проецировать трехмерную точку, которая находится за вашей камерой, на 2-мерное пространство экрана, и это не имеет никакого смысла. так что вам нужно определить, по крайней мере, ближнюю плоскость, к которой нужно привязать. После того, как вы трансформируете точки из мирового пространства в пространство камеры, но перед тем, как проецировать на пространство экрана, вам нужно будет сделать некоторые отсечения. Вы захотите определить ближнюю плоскость, что-то вроде z = 1
или что-то близкое, но перед камерой, и вы определите пространство, где точки могут проецироваться в пространство экрана.
У вас есть три варианта, во-первых, если какая-либо точка в многоугольнике отстает от ближней плоскости, тогда не рисуйте весь многоугольник. Это просто, но обычно недопустимо. Сравните каждую точку с ближней плоскостью (если polygon.points[i].z < near.z
). Но это заставит многоугольники исчезать и появляться, казалось бы, случайно на краях экрана.
Ваш второй вариант - обрезать полигон до ближайшей плоскости. Для треугольников, если все три точки находятся за ближней плоскостью, не рисуйте. Если две точки позади, обрежьте два отрезка линии в ближней плоскости и нарисуйте треугольник. Если одна точка находится за ближней плоскостью, то обрежьте и сделайте два новых треугольника и нарисуйте. Если никто не находится за ближней плоскостью, тогда просто нарисуйте. Если бы я не публиковал это со своего телефона, я бы углубился в детали, но, надеюсь, это имеет смысл.
И, наконец, вы можете сделать полное отсечение по траектории и вместо того, чтобы просто отсечь к ближней плоскости, обрезать все 6 сторон вашего видимого усеченного конуса.
Для каждого из этих подходов существуют алгоритмы оптимизации, но я бы начал с основ и продолжил работу. Каждый шаг, по сути, является продолжением последнего, поэтому я бы начал с первого, а затем усложнялся до тех пор, пока вы не получите требуемые визуальные уровни и уровни производительности.