2011-08-21 59 views
1

我有两个向量:headingtarget。我怎样才能通过某种因素将标题转向面对目标?每帧说10%或什么的。旋转一个矢量面对另一个,但慢?

社区编辑:target矢量是不断变化的。

谢谢!

+0

这个问题太含糊。你是否希望以恒定的角速度(例如每秒一度)或以某种其他方式转动?你的标题的大小是否意味着什么?等 – ninjagecko

回答

3

查找使用点积的两个矢量之间的角度:

heading . target = |heading|*|target|*cos(theta) 

然后每一帧,使用旋转矩阵通过0.10*theta旋转heading

+0

这假设你有某种旋转矩阵。在2D中,这是一个明确定义的操作,但是在3D中它变得病态定义。 –

+3

它在3D中完美定义为“沿着旋转轴旋转θ的矩阵”。 – ninjagecko

+0

尽管如何选择特定的旋转轴?我记得最近试图解决这个确切的问题,但我不记得这是什么解决方案。 (在一个不相关的笔记中,我可能不应该试图在凌晨3点做数学) –

0

假设唯一重要的是方向headingtargetHeading,我们将假设所有矢量都被归一化。你也说过,你想这是真的:

dheadingDegrees/dt = angle(targetHeading,heading) degrees/sec in the direction of targetHeading 

(至少这是我如何理解它,而不是“得到通过每帧10%接近,但永远不会到达目的地”)

为了得到确切的答案,你需要整合和一些数学。如果你想模拟它并得到一个精确的答案,你可能想要将它从“帧”中解耦出来,并根据所需的精度将其模拟为每秒100个时间间隔。

这样:

every time interval dt: 
target = getCurrentTarget() 
rotationSpeed = angleBetween(target,currentHeading)/(1second) 
heading = {rotate heading by dt*rotationSpeed radians towards target} 
      ^-------- for how to do this, see below ----------------^ 

to rotate a vector v1 to v2 from time t=0 to t=1, with constant angular velocity: 
v1normalized = normalized(v1) 
v2perpNormalized = normalized(v2 - v2*v1normalized) 
animated = cos(t*pi/2)*v1normalized + sin(t*pi/2)*v2perpNormalized 
+1

有时我希望堆栈溢出有数学格式。 –