可能是因为我的数学生锈了,或者在我试图长时间解决这个问题后我只是陷入了我的盒子里,无论哪种方式我需要你的帮助。
背景:我正在使用XNA在C#中制作基于2D的游戏。在那个游戏中,我希望相机能够放大/缩小,以便对象的某一部分始终在视野中。毋庸置疑,当相机移动三时,对象会以两个维度移动。
情况:我目前正在使用基本的三角函数来计算相机应该显示的所有对象的高度。我还将相机放在这些物体之间。
它看起来像这样:
1.浏览所有对象以找到对象的外边缘:farRight,farLeft,farUp,farDown。
2.当我们知道必须显示的边缘是什么时,计算中心,也称为相机位置:
CenterX = farLeft + (farRight - farLeft) * 0.5f;
CenterY = farUp + (farDown - farUp) * 0.5f;
3.通过我们的边缘,找到与我们的相机位置相比最大的值,从距离屏幕中心最远的距离。
4.使用最大距离值,我们可以轻松计算显示所有这些物体(点)所需的高度:
float T = 90f - Constants.CAMERA_FIELDOFVIEW * 0.5f;
float height = (float)Math.Tan(MathHelper.ToRadians(T)) * (length);
到目前为止,相机基于计算完美地定位了自己。
问题:
a)我的渲染目标是1280 * 720,视场为45度,因此人们总是在X轴上看到更多,实际上多了560个像素。这本身不是问题,但更多的是b)......
b)我希望相机比它更远,所以人们可以看到更多关于最远点之外发生的事情。当然,这发生在X轴上,但从技术上讲,这是我错误的逻辑结果。我希望能够在X轴和Y轴上看到更多并控制这种行为。问题
嗯,所以要澄清一下。我希望在一种方法上有一些输入来使相机定位,创建这种状态:物体不会比X轴边缘150个像素和Y轴边缘100个像素更接近。为此,摄像机应沿Z轴定位,以便视野覆盖所有视野。
我不需要编码的帮助,只需要计算相机高度的数学和逻辑。正如你可能看到的那样,我很难把它包裹在脑海中,甚至更难以向你解释它。
如果那里的任何人一直在处理这个或者在数学方面比我好,我会很感激你所说的一切! :)
答案 0 :(得分:2)
在步骤3中,您是否只需要在循环中的每个距离测量中添加或减去150或100像素(取决于您正在查看的边缘),并在步骤4中将此较大的值转换为长度?或者我错过了什么。
答案 1 :(得分:0)
目前我还无法进一步探索这一领域,但如果有人遇到同样的问题,但对提供的答案不满意,那么XNA还有另一种可能性。
ViewPort.Unproject()
这个漂亮的功能将屏幕空间坐标转换为世界空间坐标。
ViewPort.Project()
是否相反,即将世界空间转换为屏幕空间。只是觉得有人可能想要比我更进一步。尽管我的强迫症不喜欢让事情变得不完美,但我还是无法完美......但是。