2011-08-21 45 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

有時我希望堆棧溢出有數學格式。 –

相關問題