Вопрос

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

float distance = (float) ((Math.sqrt((p1.x - p2.x) + (p1.y - p2.y))));
float camx = (float)((p1.x + p2.x) * 0.5);
float camy = (float)((p1.y + p2.y) * 0.5);
float camz = (float) (distance * 5);

Какая математика мне нужна, чтобы Z правильно увеличивал и уменьшал масштаб?

Это было полезно?

Решение 4

float distance = (float) ((Math.sqrt(Math.pow((p1.x - p2.x),2.0) + Math.pow((p1.y - p2.y), 2.0))));
float camx = (float)((p1.x + p2.x) * 0.5);
float camy = (float)((p1.y + p2.y) * 0.5);
float camz = (float) Math.abs(distance);

Другие советы

Если оба объекта имеют z=0 и угол обзора вашего экрана (с центр экрана до края) — это ax и ay для горизонтального и вертикального углов, тогда:

zx = abs((p1.x-p2.x)*0.5)/tan(ax)
zy = abs((p1.y-p2.y)*0.5)/tan(ay)

и

camz = max(zx, zy)

Здесь zx и zy — расстояния, на которых объекты помещаются на горизонтальный и вертикальный размеры экрана, а camz — расстояние, удовлетворяющее обоим критериям.Также обратите внимание, что ax и ay указаны в радианах (например, если вы предполагаете, что ширина вашего экрана 40 градусов, то ax равен 20 градусам или ax =20*(pi/180)=0,3419 радиан).

Ваши значения для camx и camy были правильными.

Возможно, я неправильно понимаю вашу ситуацию, но не могли бы вы просто сделать

float camx = (p1.x + p2.x) * 0.5;
float camy = (p1.y + p2.y) * 0.5;
float camz = (p1.z + p2.z) * 0.5;

Это позволит расположить камеру прямо между двумя объектами.

Если это необходимо исправить, например,

float distance = (float) ((Math.sqrt((p1.x - p2.x)^2 + (p1.y - p2.y)^2)));

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top