模拟2D空间中3D距离的公式?

时间:2014-05-02 04:33:00

标签: javascript html5 math 3d css-transforms

我正在制作一个简单的2D游戏,并试图模仿3D视角(类似于像Monkey Island这样的早期游戏)。我现在已经搜索了一段时间,而且一切似乎都在处理3D。有没有人碰巧知道我会用DIV向上移动(远离)相机时使用的公式?

谢谢!

5 个答案:

答案 0 :(得分:2)

在猴岛,背景是具有不同透视度的2D图像。如何缩放角色取决于背景的视角。在某些场景中,角色仅在屏幕上移动,因此角色不需要更改比例。在某些人物中,角色可能会沿着街道向下移动,并且视角很高。在某些情况下,角色可能会在一个房间内移动,而且视角很小。

需要为每个背景场景计算关于角色缩放的计算。需要在背景和长度上绘制透视线。

下面的两个示例显示了如何计算角色的比例。

在每种情况下,缩放都基于当前在屏幕上定位的字符。变量y是字符在垂直方向上与其SMALLEST大小位置的距离的度量。变量h是根据y确定角色高度变化的度量。

在房间场景中,比例是> 1因为角色当前位于场景的后面。

在街景中,比例为< 1,因为角色当前处于场景的起源。

不按比例绘制的三角图

room scene

enter image description here

答案 1 :(得分:1)

我不确定DIV(我没有JavaScript体验)是什么,但这些链接可能会有所帮助。

答案 2 :(得分:1)

我会这样做:

projection

// equation for objects appearing the same size
h=d*tan(α)

// now the scaling the size for arbitrary object
scale       d        h
1.0        d0       h0  // object with no scaling 
0.5   2.0*d0       h0  // half size
0.25  4.0*d0       h0  // quoter size
0.5        d0 0.5 *h0
0.25       d0 0.25*h0

// so scale is:
scale = (d0/d)*(h/h0)  // or 
scale = (d0*h)/(d*h0)
  • 根据您的视图设置d0,h0常量
  • d0控制放大率,h0 = d0 * tan(α)

如果您的相机在轴之间具有不同的视角,则必须应用两个缩放系数

  • 一个用于x轴,一个用于y轴
  • 以相同的方式计算,但使用了不同的角度
  • d0对于两者都是相同的

3D中的常用相机视角为60度或90度,但在这种情况下,我会使用30度

  • 如果您还在地下观察地下60,相机轴在地面上

答案 3 :(得分:0)

在真实的透视投影中,缩放因子由S(D)= Df / D给出,其中Df是从观察者到全尺寸物体的深度,D是当前深度。

例如,如果一个字符高40像素,在前景中看到16大(假设距离观看者3米),则在深度为6米时为20乘8像素,在12米处为10乘4。

比参考距离更近将导致放大(在1.5米处为80×32)。

[如果您的对象位于(X,Y,Z)坐标,X水平,Y垂直,Z垂直于屏幕,指向背面,并且在屏幕深度为0,则您有D = Z + Df和S(D)= Df /(Df + Z)。]

答案 4 :(得分:0)