2013-11-24 78 views
0

我試圖在3d環境中爲玩家角色實現一些基本動作,但我正在努力應對一些基礎知識。速度之間的平滑過渡

當按下任意一個移動鍵時,角色應該加速直到他在移動方向上達到一定的速度。很簡單。

問題是,應該從他的舊速度平滑過渡到運動速度。

如果球員向前移動,但他以前的速度推倒了他,他應該明顯停下來,然後開始正常移動。

如果玩家向前移動,但他以前的速度向右轉20度,速度更快,速度方向應接近他的移動方向,但大部分舊速度應保持不變。

很遺憾,關於如何構建fps遊戲的移動系統,網絡上沒有太多的信息,所以我現在有點卡住了。向正確的方向微調將不勝感激。

UPDATE

我想我會更加具體。運動的實際執行不是問題。

假設我的角色在沒有旋轉的情況下直線前進。他的最大移動速度是每秒120個單位。沒有外力,他應該加速直到他達到那個速度。一旦他達到那個速度,他的速度就是Vector(1,0,0)* 120(假設'forward'是x軸)

現在我們添加一個Vector的外力(500,60,0)。角色當前移動方向(矢量(1,0,0))上的力的速度爲500,因此比他的最大移動速度快,因此他不應該加速。

對於這個例子,這不是一個問題,但假設角色的移動方向是Vector(0.827846,0.560955,0)而外部力是Vector(181,760,0)。我如何才能獲得相對於他目前運動方向的力量?

(當我說「速度」,我指的是速度的長度)

+0

因此,將新的加速度添加到舊的速度(使用正確的時間步長)。怎麼了? – Thomas

+0

也許你會在你的問題標題/標籤中想要關於'3d'和'遊戲物理'的東西。 – xtofl

+0

「沒有太多的信息」.... https://www.google.be/search?q=game+physics+tutorial&oq=game+physics&aqs=chrome.1.69i57j0l5.4230j0j7&sourceid=chrome&espv=210&es_sm=93&ie=UTF-8#es_sm=93&espv=210&q=game%20physics %20tutorial%203d – xtofl

回答

0

我假設你有一個週期性update任務。如果你沒有,你可能想要實現一個。

基本上你有一個位置矢量。這個矢量由XY表示座標

Vector 
- int X 
- int Y 

還具有速度矢量。您可以在更新任務的每次迭代中將此添加到您的位置向量中。您可以通過添加它們的X座標並添加它們的Y座標來添加矢量。

你也可以有一個加速度向量。您可以在更新任務的每次迭代中將其添加到速度矢量中。

您可以根據用戶輸入管理您的加速度。

你最終得到的是一個運動系統,它有點反映了實際的物理學。

2

假設玩家是人類或動物,玩家運動中需要注意的一件事非常重要的一點是,這種運動與過於簡化的牛頓模型所暗示的非常不同。如果你正在駕駛飛船,那麼加速度將會保持不變,你可以使用你在物理課上看到的各種理想模型。通過基於腿部的運動,您可以看到速度幾乎不變。玩家會期望能夠迅速減速,然後加速到最大速度,否則他們會覺得他們在溜冰場。 是不是想擁有完美精確的物理任何遊戲的基本原理是這些:

  • 有它的是遊戲將保持跟蹤的時間量最小設置的時間間隔。較小的間隔增加了控制的準確性和響應性,但也增加了計算強度。常見的時間間隔是1/20秒。每隔一段時間後,遊戲將檢查物理。在間隔之間,您的渲染線程將顯示播放器以恆定速度移動。
  • 速度由您將移動每個間隔的距離表示。每次檢查物理時,都會嘗試將玩家移動該距離,但檢查是否與固體物體發生碰撞。由於這是一個3D環境,因此您需要將速度分解爲其分量向量,X,Y和Z方向各有一個。由於這些是恆定的方向,你可以用浮點數來表示它們中的每一個。 (不推薦使用整數;只有當您使用非常小的距離單位時纔會起作用,這會導致代碼混淆。)
  • 加速度反過來是每個區間的速度變化。通常情況下,大部分時間都是零。當擊球或外力作用於玩家時,則將加速度設爲其初始值,然後在物理檢查期間根據玩家的狀態確定需要改變多少加速度。

當然,你應該調整到底如何深入你做什麼樣的遊戲。有時候,可以完全跳過加速度,並且在各個方向上都具有恆定的速度,特別是如果您的遊戲沒有涉及移動的技能測試。請務必不要讓玩家神奇地改變半空中的速度,儘管許多遊戲允許您在半空中進行一些控制以幫助瞄準跳躍。