由于您实际上并没有在3D空间中工作,因此我们可以假定子图形永远不会旋转(可以通过倾斜等方式模拟旋转)。这种简单的约束使其非常容易获得关于尺寸的精确数字(取决于距离)从相机上。
首先,您需要了解如何渲染3D对象。即使摄像机会聚到单个点,也有一个不可见的平面充当在其上绘制对象的屏幕。您需要了解的关于屏幕的唯一一件事就是它离相机有多远。
这是在两个不同距离处如何将对象渲染到摄像机的示意图。
如您所料,物体的高度取决于与相机的距离。但是由于放牧发生在近乎拣选的平面上,因此我们必须计算该点精灵的高度。
一些基本的触发计算将使您得出以下公式:
f(d, v) = v/(v+d)
* Where f is the size ratio to the original sprite aka size factor
and v is the distance to the near clipping plane (trial and error value)
and d is the distance from the near clipping plane to the object
例:
Assuming you have a sprite that is 2.5x1.8 units in size and 10 units away
from the camera, and that the near clipping plane is 5 units from the camera.
sizeFactor = 5/(5+10) = 0.3
renderHeight = actualHeight * sizeFactor = 1.8 * 0.3 = 0.54
renderWidth = actualWidth * sizeFactor = 2.5 * 0.3 = 0.75
我建议从头开始,v=5
然后根据其外观从那里进行调整。我可能会摆弄小提琴,使您可以实时查看更改。
TL; DR
The change in height or width should be multiplied by the following factor:
sizeFactor = v/(v+d)
Where v = Some number greater than 0 that never changes (try 1 thru 5)
and d = the distance from the camera
So an object that is 2.5 units tall would be rendered at 2.5*sizeFactor units tall.
编辑:
当您说沿z轴移动时,我假设您需要一个透视图(像大多数3D游戏,射击游戏等)。根据距离计算对象大小的数学方法还取决于帧中的位置,类似于周边视觉。取而代之的是,我将使用正交视图(例如Mario,Angry Birds,Super Smash Bros等)进行数学尝试。我不知道您要达到的外观,但是只要看起来真实,玩家就永远不会知道!
演示!