使用点积调整glRotate

Adjusting glRotate, using dot product

本文关键字:调整 glRotate      更新时间:2023-10-16

简介:我正在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绘图部分看起来就这么简单:

        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我想所有这些情况都是不同的,至少根据机组在塔的左侧或右侧运行,动作也不同。。。。那么我用这种方式使用点乘忘了提醒什么了?

首先,您的代码很难理解,所以我猜会有很多问题试图回答您。如果我认为有什么不对劲,我深表歉意。

我假设你想使用欧拉角旋转来正确对齐你的投射物。所以,首先你要做一个X旋转,然后做一个Y旋转。

要进行X旋转,点积的向量必须在YZ平面上,并且假设投射物从Z方向开始,第一个向量是(0,0,1(。正如您所说,第二个向量是指向单位的向量,可以用(px,py,pz(表示。你必须将这个向量投影到平面YZ上,才能得到点积的第二个向量,所以这个向量将是(0,py,pz(

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

x1.x2+y1.y2+z1.z2=|p1||p2|.cosa,其中|p1|和|p2|是向量(其长度(的模

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

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

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

PS。在我写下这个答案后,我注意到你使用了函数"fabs"。我想你想找到第二个向量的模,但fabs给了你一个escalar的绝对值。要计算向量的模(其长度(,您需要使用上面引用的公式。