沿路径计算旋转

3
我正在尝试对一个物体进行动画处理,比如一辆汽车。我希望它从点 x1,y1,z1 移动到点 x2,y2,z2。它会移动到这些点,但似乎是在漂移而不是指向运动方向。所以我的问题是:如何在我的updateframe()事件中解决这个问题?您能指引我一些好的资源吗?
谢谢。
6个回答

2
首先,你如何表示道路?
最近我做了这件事情,我使用了Catmull-Rom样条曲线来表示道路。为了定位一个物体并使其沿着样条路径移动,你需要从沿着样条线行走的t中插值出当前的x,y,z位置,然后根据该特定位置的Frenet坐标系或Frenet Frame将其定向。
基本上,每个点都需要3个向量:切线、法线和副法线。切线将是你想让你的物体(汽车)指向的实际方向。
我选择Catmull-Rom,因为它们很容易在任何点上推导出切线-只需取当前点附近的另外两个点的(向量)差异即可。(比如说你在t处,选择t-epsilont+epsilon,其中epsilon是一个足够小的常数)。
对于另外两个向量,你可以使用这个迭代方法 - 即你从已知的一组向量开始,在每个updateframe()中基于之前的向量计算出一个新的向量集。

这个问题已经发布很久了,你写过任何博客文章或存储库来解决这个问题吗?谢谢。 - Josyula Krishna
1
@JosyulaKrishna 请查看 https://github.com/valentingalea/android-3d-engine/blob/master/Source/VTrajectory.cpp - Valentin Galea
非常感谢您,瓦伦丁! :) - Josyula Krishna

1
你需要计算出汽车的初始方向和到达目的地时的最终方向,然后在它们之间插值以确定当前时间步长中间的方向。 这篇文章描述了执行插值的数学原理,以及与旋转物体有关的其他一些事情,这些对你可能有用。总的来说,gamasutra.com是这类问题的绝佳资源。

0

从一个位置到另一个位置的移动会给物体一个速度,速度是一个向量,将该向量归一化将给出运动的方向向量,您可以将其插入“观察”矩阵中,通过上方向量与该向量进行叉积以获得侧面向量,然后您就拥有了一个完整的矩阵,用于控制物体运动的方向。


0

始终将汽车指向目标点是简单而廉价的,但如果汽车沿着弯曲的路径行驶,则无法奏效。在这种情况下,您需要将汽车指向其当前位置的切线(请参见上面的其他答案)。


0

我认为插值是导致你看到的漂移的原因。 你需要模拟转向的方式..你的更新函数应该 1) 总是将汽车移动到它指向的方向,2) 将汽车转向当前目标..两者不应互相影响,以便转向会更快地发生和完成而不是到达。


0
一般来说,汽车指向的方向沿着它的速度矢量,这是其位置矢量的一阶导数。
例如,如果汽车每隔n秒钟绕原点以半径为r的圆形运动,则汽车位置的x分量由以下公式给出:
x = r.sin(2πt/n)

它的速度向量的x分量将为:

vx = dx/dt = r.(2π/n)cos(2πt/n) 

对于所有的xyz分量,执行此操作,归一化结果向量,即可得到您的方向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接