不是很整洁的数学,但我希望它对你有用:
输入
假设给你一个
- worldViewPerspectiveMatrix
M
(将世界空间转换为透视空间,正交矩阵也应该可以工作!)
- 屏幕空间中的恒定速度(更具体地说是每帧的距离)
v_screen
- 世界空间中的(归一化)方向向量
V_dir
,这将给出对象移动的方向。将计算矢量的实际长度。
X
您的对象放置在世界空间中的位置。
结果
- 用于在屏幕空间中沿世界空间
a
移动对象“v_screen”单位的比例因子。V_dir
因此,您实际上想要移动您的对象X += a*V_dir
。
首先,我们使用齐次坐标和 w-clipping将世界空间映射到屏幕空间的公式。.
表示矩阵乘法运算符。
X_proj := M.(x,y,z,1);
X_screen := (x_proj/w_proj,y_proj/w_proj);
从那里我们可以指定对象X
在屏幕空间中的位置以及应用定向移动后的位置X+(a*V_dir)
。
屏幕空间的长度以及所需的距离(每帧)很简单
Length[(X+(a*dir))_screen - X_screen] == v_screen.
让我们解决这个问题a
。我用我的 Mathematicaa
为你计算。如果您想了解更多详细信息,我可能会详细说明答案。假设M
,X
和V_dir
是
/ xp \ / vx \ / vxp \
X_proj = | yp | V_dir = | vy | V_proj = M.V_dir = | vyp |
| zp | | vz | | vzp |
\ wp / \ 0 / \ vwp /
并且v_screen
是您想要的屏幕空间速度。然后a
是:
vlen = v_screen*v_screen;
a = (-dwp*vlen*wp + dxp*xp + dyp*yp +
0.5*Sqrt(
Power(-2*dwp*vlen*wp + 2*dxp*xp + 2*dyp*yp,2) -
4*(dxp*dxp + dyp*dyp - dwp*dwp*vlen)*(xp*xp + yp*yp - wp*wp*vlen)
)
) /
(dxp*dxp + dyp*dyp - dwp*dwp*vlen);
记住,-a
也是一种解决方法。