使用点积调整glRotate

时间:2013-05-02 15:57:40

标签: c++ c math opengl vector-graphics

介绍: 我正在opengl开发一个小塔防御游戏,目前我只是对一个小问题绝望......

我希望塔中的射弹瞄准头朝向单位。所以我的问题更像是一个数学问题,但它属于opengl:)

我有以下想法;我可以使用点积来获得围绕x轴旋转的角度,以获得头部,这取决于直线向下或平放到地面的距离,然后是围绕y轴旋转的另一个角度,箭头的头部是每次调整到它所瞄准的单位。

围绕X轴旋转角度的代码(我称之为m_fYNeigung,因为头部的高度(Y)通过绕x轴旋转而改变)如下所示:

plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_fYNeigung = 
RADIANS_TO_DEGREES (acos ((float)
        (
            (faTowerPosition[0]) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[0]) +
            (faTowerPosition[1] - 1) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[1]) +
            (faTowerPosition[2]) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[2])
        )
        /
        (
            fabs (faTowerPosition[0]) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[0]) +
            fabs (faTowerPosition[1] - 1) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[1]) +
            fabs (faTowerPosition[2]) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[2])
        )
));    

其中faTowerPosition是第一个向量,从塔顶向下指向(箭头也从faTowerPosition [X / Y / Z]开始),点积的第二个向量是m_faProDirectionVector,它是一个归一化的方向向量描述从塔到单位的箭头路线。

Opengl Drawing部分看起来就像这样简单:

        for (sizeJ = 0; sizeJ < localTowerArray[sizeI].m_byteProjectilAmount; sizeJ++)
        {
            if (localTowerArray[sizeI].Projektils[sizeJ].m_bOnFlight == true)
            {
                glPushMatrix();
                glTranslatef (localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[0], localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[1], localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[2]);
                //glRotatef (360.0f - localTowerArray[sizeI].Projektils[sizeJ].m_fXNeigung, 0, 1, 0);
                glRotatef (localTowerArray[sizeI].Projektils[sizeJ].m_fYNeigung, 1, 0, 0);
                    DrawWaveFrontObject (m_pArrowProjektilObject);
                glPopMatrix();
            }
        } 

只是忽略我正在对角度做的计算,我只是尝试用箭头的动作,我只是注意到它看起来像箭头行为不同取决于(我要说:可构建)地图按x:-3.4到3.4缩放,z从4到-4)绳索建立在-x / z,-z / x,z / x,-z / -x所有这些情况下我认为是不同的并且至少取决于单元在塔的左侧或右侧运行,表现也不同....所以我忘了用这种方式使用点积来提醒?

1 个答案:

答案 0 :(得分:2)

首先,你的代码很难理解,所以我猜想要回答你很多。如果我认为有问题,我为此道歉。

我假设你想使用欧拉角旋转来正确对准你的射弹。所以,首先你要进行X旋转,然后进行Y旋转。

要进行X旋转,对于点积,您的矢量必须位于YZ平面上并假设您的射弹从Z方向开始,您的第一个矢量为(0,0,1)。如你所说,第二个向量是一个指向单位的向量,可以用(px,py,pz)表示。您必须将此向量投影到YZ平面以获得点积的第二个向量,因此该向量将为(0,py,pz)

现在,要计算点积,请应用以下公式

  

x1.x2 + y1.y2 + z1.z2 = | p1 |。| p2 | .cos a,其中| p1 |和| p2 |是矢量的模块(长度)

在这个例子中,第一个向量是单一的,但第二个不是。所以| p2 | = sqrt(py ^ 2 + pz ^ 2)。此后:

  

acos(a)= pz / sqrt(py ^ 2 + pz ^ 2)

这将为您提供围绕X轴的角度。进行相同的计算以实现Y角度旋转

PS。在我写完这个答案之后,我注意到你使用了“fabs”这个功能。我想你想找到第二个向量的模块,但晶圆厂给你一个escalar的绝对值。要计算向量的模块(其长度),您需要使用上面引用的公式。