2013-03-25 59 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数学函数?