3D Camera Zoom и следите за физикой в ​​Java? - PullRequest
0 голосов
/ 16 мая 2009

Я пытаюсь сделать так, чтобы независимо от того, как далеко находятся два объекта, они оба остались на экране. Я использую 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 ]

3 голосов
/ 16 мая 2009

Если оба объекта имеют 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 были правильными.

2 голосов
/ 16 мая 2009

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

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

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

1 голос
/ 16 мая 2009

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

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

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

0 голосов
/ 17 мая 2009
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...