2013-03-25 62 views
0

我有一個項目,我想製作一個使用小行星式船隻的遊戲來演示AI尋路和轉向行爲。在DirectX中圍繞質心旋轉等邊三角形

對象存儲用於位置的三角形(否則玩家的位置)和船舶中的取向度的形心的值,然後計算三個頂點像這樣的位置:

A是的鼻子三角形。當方向爲0度時,船的鼻子坐在X軸上偏移SIZE,這確定了船的大小等於它的邊界圓的半徑。

頂點B和C分別從A 120和240度的位置旋轉,然後程序繪製每個頂點之間的線段。

當我開始這個程序時,這個程序非常漂亮,我的邊界圓,方向矢量和飛船看起來是我期望的。

但是,我實現了一個控制,使得角度通過左右箭頭鍵遞增和遞減。這個控制已經過測試並證明可以按照要求工作。發生這種情況時,方向矢量會相應地進行調整,船隻旋轉......但只有一點。該點立即移動到質心,直到他們崩潰的中心,並永遠消失,不管我在旋轉的方向。

//Convert degrees into radians 
float Ship::convert(float degrees){ 
    return degrees*(PI/180); 
} 

//Rotation X-Coord 
int Ship::rotateX(int x, int y, float degrees){ 
    return (x*cos(convert(degrees)))-(y*sin(convert(degrees))); 
} 

//Rotate Y-Coord 
int Ship::rotateY(int x, int y, float degrees){ 
    return x*sin(convert(degrees))+y*cos(convert(degrees)); 
} 

//Rotate the Ship 
void Ship::rotateShip(float degrees){ 
    vertA [0]=rotateX(vertA [0], vertA [1], degrees); 
    vertA [1]=rotateY(vertA [0], vertA [1], degrees); 
    vertB [0]=rotateX(vertB [0], vertB [1], degrees); 
    vertB [1]=rotateY(vertB [0], vertB [1], degrees); 
    vertC [0]=rotateX(vertC [0], vertC [1], degrees); 
    vertC [1]=rotateY(vertC [0], vertC [1], degrees); 
} 

的旋轉功能正常工作,但我不能肯定旋轉船正在工作。它似乎應該 - vert變量是存儲該頂點的X和Y座標的數組。如果我按照船的方向角旋轉每個頂點,理論上它應該在其中心旋轉三角形,對嗎?

這些verts都是關於原點的校準,而Game對象中的drawShip()函數將這些coords加入並添加playerX和playerY以將完全繪製的船舶轉換爲玩家的位置。所以基本上,把它翻譯成原點,旋轉它,然後將它翻譯回玩家的位置。

如果有幫助,我會包含遊戲對象的相關功能。在這段代碼中,psp是Ship對象。抽取船隻取得了船對象的所有參數並且應該可以工作,但是我得到了不想要的結果。

//Draw Ship 
void Game::drawShip1(int shipX, int shipY, int vel, int alpha, int size, int* vertA, int* vertB, int* vertC, int r, int g, int b){ 
    //Draw a bounding circle 
    drawCircle(shipX, shipY, size, 0, 255, 255); 
    //Draw the ship by connecting vertices A, B, and C 
    //Segment AB 
    drawLine(shipX+vertA[0], shipY+vertA[1], shipX+vertB [0], shipY+vertB [1], r, g, b); 
    //Segment AC 
    drawLine(shipX+vertA[0], shipY+vertA[1], shipX+vertC [0], shipY+vertC [1], r, g, b); 
    //Segment BC 
    drawLine(shipX+vertB[0], shipY+vertB[1], shipX+vertC [0], shipY+vertC [1], r, g, b); 

} 


void Game::ComposeFrame() 
{ 
    float pAlpha=psp.getAlpha(); 
    if(kbd.LeftIsPressed()){ 
     pAlpha-=1; 
     psp.setAlpha(pAlpha); 
     psp.rotateShip(psp.getAlpha()); 
    } 
    if(kbd.RightIsPressed()){ 
     pAlpha+=1; 
     psp.setAlpha(pAlpha); 
     psp.rotateShip(psp.getAlpha()); 
    } 
    //Draw Playership 
    drawShip1(psp.getX(), psp.getY(), psp.getV(), psp.getAlpha(), psp.getSize(), psp.getVertA(), psp.getVertB(), psp.getVertC(), psp.getR(), psp.getG(), psp.getB()); 
    drawLine(psp.getX(), psp.getY(), psp.getX()+psp.rotateX(0+psp.getSize(), 0, psp.getAlpha()), psp.getY()+psp.rotateY(0+psp.getSize(), 0, psp.getAlpha()), psp.getR(), psp.getG(), psp.getB()); 
} 
+0

首先修改'rotateX'和'rotateY'。他們假設圍繞'(0,0)'旋轉。相反,爲他們的參數添加一個「中心點」。 – 2013-03-25 21:33:40

回答

0

我在代碼中看到幾個問題,這些問題可能與您看到的結果相加。

第一件事就是將座標作爲整數處理。由於這個原因,小數位被切斷,數值越來越小。使用浮點數甚至雙倍。

第二件事是旋轉分兩步進行。第一步(計算x座標)是正確的。但是,第二步(計算y座標)是錯誤的。您使用新的x座標,但應提供舊的座標。無論如何,你應該實現一個方法來旋轉完整的矢量,而不是它們的一部分。爲什麼不使用DirectX數學函數?