0

我正在努力做到这一点,以便无论两个对象相距多远,它们都将保留在屏幕上。我正在使用 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

4 回答 4

3

如果两个对象的 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 的值是正确的。

于 2009-05-16T03:08:48.460 回答
2

也许我误解了你的情况,但你不能这样做

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

这会将相机直接定位在两个物体之间。

于 2009-05-16T00:31:32.457 回答
1

如果需要更正,

浮动距离 = (float) ((Math.sqrt((p1.x - p2.x)^2 + (p1.y - p2.y)^2)));

我不太确定语法。我只是告诉您在添加向量之前需要获得 2 的幂。

于 2009-05-16T01:58:52.373 回答
0
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);
于 2009-05-17T18:53:56.540 回答