Я пытался написать программу в Processing 3, которая будет отображать точки из трехмерного пространства в окне просмотра.Я пока не буду показывать код, потому что смысл этого вопроса в том, есть ли какие-либо недостатки в моем методе отображения пространства в перспективе.
Идея, лежащая в основе моегоФормула для расчета координат экрана X и Y для точки в трехмерном пространстве состоит в сравнении альфа- и бета-углов (углы на картинке, значения не имеют значения прямо сейчас).Поскольку координаты 0,0 на экране начинаются в верхнем левом углу, вот что я нашел для X и Y:
где:
- γ - это угол между правым краем поля зрения и CP ИЛИ просто α + β
- β - это половинный угол поля зрения
- α - угол между вектором прямого изображения камеры и вектором CP.
- ? такой же, как γ, но в плоскости XZ (взгляд вверх и вниз)
Таким образом, когда:
- α = 0, X - ширина, и это ставит точку у правого края экрана
- α = β, X - середина экрана (ширина /2) и
- α = 2β, X равен 0, и это левый край экрана.
Я рассчитал углы, используя функции acos () и asin () иони были правы.Первой проблемой был угол α;оно никогда не было отрицательным, означая, что γ никогда не опустится ниже β, так как
β + α = β + 0.
Мне удалось исправить это, умножив α на перекрестное произведение векторов CP и направления (на изображении), чтобы определить, является ли α положительным или отрицательным.
Сначала я решил исправитьпроблема, но как только я повернул камеру, точка на экране смогла бы повернуть вправо только до определенного значения, а затем отскочить назад в противоположном направлении (как если бы перекрестный продукт больше не работал или что-то в этом роде).
Есть ли у вас идеи, есть ли недостатки в моих формулах?Спасибо за помощь!