我有一個項目,我想製作一個使用小行星式船隻的遊戲來演示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());
}
首先修改'rotateX'和'rotateY'。他們假設圍繞'(0,0)'旋轉。相反,爲他們的參數添加一個「中心點」。 – 2013-03-25 21:33:40