我正在尝试为一个对象设置动画,假设它是一辆汽车。我希望它从点开始
x1,y1,z1
指向x2,y2,z2。它移动到这些点,但它似乎是在漂移而不是指向运动方向。所以我的问题是:如何在我的 updateframe() 事件中解决这个问题?你能给我指出一些好的资源的方向吗?
谢谢。
我正在尝试为一个对象设置动画,假设它是一辆汽车。我希望它从点开始
x1,y1,z1
指向x2,y2,z2。它移动到这些点,但它似乎是在漂移而不是指向运动方向。所以我的问题是:如何在我的 updateframe() 事件中解决这个问题?你能给我指出一些好的资源的方向吗?
谢谢。
首先,您如何代表道路?
我最近做了这件事,我在道路上使用了Catmull-Rom样条线。要定向对象并使其遵循样条线路径,您需要从沿着样条线的t插入当前x、y、z位置,然后将其沿 Frenet 坐标系或Frenet 框架定向到该特定位置。
基本上,对于每个点,您需要 3 个向量:切线、法线和副法线。切线将是您希望对象(汽车)指向的实际方向。
我选择 Catmull-Rom 是因为它们很容易在任何点扣除切线 - 只需将其他 2 个邻近点与当前点之间的(向量)差值。(假设你在t,选择t-epsilon和t+epsilon - 其中 epsilon 是一个足够小的常数)。
对于其他 2 个向量,您可以使用这种迭代方法- 也就是说,您从一端的一组已知向量开始,然后在每个updateframe()的基础上工作一个新的集合)。
您需要计算出汽车的初始方向,以及汽车在目的地的最终方向,然后在它们之间进行插值以确定当前时间步长之间的方向。
本文描述了插值背后的数学原理,以及与旋转对象有关的一些其他可能对您有用的事情。一般来说,gamasutra.com 是这类事情的绝佳资源。
我认为插值会给你看到的漂移。您需要对转向的工作方式进行建模..您的更新功能应该 1) 始终沿其指向的方向移动汽车 2) 将汽车转向当前目标 .. 一个不应该影响另一个,以便转弯将比到达更快地发生和完成。
一般来说,汽车指向的方向是沿着它的速度向量,这是它的位置向量的一阶导数。
例如,如果汽车每n秒绕原点绕一圈(半径为r ),则汽车位置的x分量由下式给出:
x = r.sin(2πt/n)
其速度矢量的x分量将是:
vx = dx/dt = r.(2π/n)cos(2πt/n)
对所有x、y和z分量执行此操作,对结果向量进行归一化,然后您就有了方向。
始终将汽车指向目的地既简单又便宜,但如果汽车沿着弯曲的路径行驶,它就行不通了。在这种情况下,您需要将汽车沿切线指向其当前位置(参见上面的其他答案)。
going from one position to another gives an object a velocity, a velocity is a vector, and normalising that vector will give you the direction vector of the motion that you can plug into a "look at" matrix, do the cross of the up with this vector to get the side and hey presto you have a full matrix for the direction control of the object in motion.