2017-06-29 79 views
0

對於我和朋友創建的遊戲,我們正在製作雷達。我們已經制定了一個基本的雷達,就是說所有的東西都顯示在適當的位置,但是我們正在試圖增加雷達的旋轉。這種旋轉基於當地球員的角度,從0度開始直接朝北,順時針旋轉360度直到再次爲北。在畫布中圍繞原點旋轉一個點

我想知道如何從本地玩家角度旋轉畫布上的所有點(這些可以是其他玩家,物品等)。我們正試圖讓玩家在前進的同時,也可以直接在雷達上移動。無論旋轉的程度如何,玩家應該始終直接向前走向雷達「上」。我試着做基本的旋轉,像這樣給每個玩家: var baseX = x - localX,baseY =(canvas.height-y) - localY; var localAngle = toRadians(players [0] .rotation);

var newX = baseX * Math.cos(localAngle) - baseY * Math.sin(localAngle); 
    var newY = baseX * Math.sin(localAngle) + baseY * Math.cos(localAngle); 

    newX += localX; 
    newY += localY; 

問題是,我並不總是要「上」雷達,它取決於我在哪裏尋找。謝謝。

+0

歡迎來到StackOverflow!爲了幫助我們解決您的代碼問題,您需要實際**顯示**我們的代碼。請更新您的問題,以便在[** minimal,complete,and verifiable example **](http://stackoverflow.com/help/mcve)中顯示所有**相關代碼**。有關詳細信息,請參閱有關[**如何提出良好問題**](http://stackoverflow.com/help/how-to-ask)的幫助文章,並參加該網站的[**遊覽**](http://stackoverflow.com/tour :) :) –

+0

加入了我所嘗試的,但是,我並不確定如何去做我所要求的,因此提供代碼有點困難。 –

回答

1

爲了高效地旋轉東西,您需要從線性代數理解基本概念。簡而言之,這意味着您需要兩個單獨的向量(基本向量),爲您定義所有向量(對象)的位置是空間(在您的情況下爲2D)。所以如果你想在場景中旋轉對象,你需要對它們應用旋轉變換。這可能是: (旋轉到右)

Math.cos -Math.sin 0 
Math.sin Math.cos 0 
0   0  1 

(旋轉至左)

Math.cos Math.sin 0 
-Math.sin Math.cos 0 
0   0  1 

所以它是這樣的:

let multiplyMatrixVector = (A, v) => { 
    let C=[]; 
    C[0] = (A[0]*v.x)+(A[1]*v.y)+(A[2]*v.z); 
    C[1] = (A[3]*v.x)+(A[4]*v.y)+(A[5]*v.z); 
    C[2] = (A[6]*v.x)+(A[7]*v.y)+(A[8]*v.z); 
    return {x:C[0], y:C[1], z:C[2]}; 
}; 


let locations = [{x:34,y:7,z:0}]; 
let newLocations = map(
        (location) => { 
         return multiplyMatrixVector(matrix,location) 
        }, 
        locations 
        ) 

編輯: 如果你想不僅要在雷達上旋轉點,還要移動它,您需要應用

translation to your point object in matrix form: 
x+a  1 0 a  x 
y+b <- 0 1 b <- y 
1  0 0 1  z 

您可以將它與旋轉合成爲單個矩陣。 因此,您的矢量進入平移矩陣,然後旋轉,不要忘記原始矢量。你需要在變革中考慮它。

+0

你確定我必須使用轉換嗎,至少想到這種方式來實現我描述的問題?我很確定我只是缺少一些小東西。原始問題中的代碼使得我可以看到任何角度,我周圍的物品/玩家都是相對於該方向放置的。唯一的問題是,當我向前走時,我不會在雷達上「起來」。謝謝你的解釋,但我不認爲這是必要的。 –

+0

嗯,我認爲這樣做會大大降低複雜性,因爲您可以將場景和對象與適當的轉換組合進行映射。我得到了你所問的,你想要與玩家一起移動一個雷達與玩家模型?如果是這樣,等一下我會增加我的答案... –

+0

錯誤我相信我們在同一頁面上。當我向前移動時,我只想做到這一點,我在雷達上「上」,所有物品/玩家都旋轉得很好,這意味着如果我在第一象限上看到一個點,在我的遊戲中,他們應該在我的右邊。 –