c++ - 使用点积调整 glRotate

标签 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 是第一个 vector ,它从塔顶向下指向(箭头也从 faTowerPosition[X/Y/Z] 开始),点积的第二个 vector 是 m_faProDirectionVector,它是标准化方向 vector 描述箭头从塔到单位的路线。

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();
            }
        } 

忽略我对角度所做的计算,我只是为了试验箭头的作用,我只是注意到箭头的作用似乎会根据(我不得不说:可构建的 map 按 x 缩放:-3.4 到 3.4,z 从 4 到 -4),塔是在 -x/z、-z/x、z/x、-z/-x 上 build 的,我猜所有这些情况都是不同的并且至少根据单元在塔的左侧或右侧运行,作用也不同......所以我忘记通过这种方式使用点积来提醒什么?

最佳答案

首先,你的代码很难理解,所以我猜测了很多来尝试回答你。如果我认为有什么问题,我会为此道歉。

我假设您想使用欧拉角旋转来正确对齐您的射弹。因此,首先您将进行 X 旋转,然后进行 Y 旋转。

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

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

x1.x2+y1.y2+z1.z2 = |p1|.|p2|.cos a, where |p1| and |p2| is the module of vector (its length)

在此示例中,第一个 vector 是酉 vector ,但第二个 vector 不是。所以|p2| = sqrt(py^2 +pz^2)。此后:

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

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

PS。在我写完这个答案后,我注意到您使用了“fabs”函数。我猜你想找到第二个 vector 的模,但 fabs 给你的是标量的绝对值。要计算 vector 的模(其长度),您需要使用上述引用的公式。

关于c++ - 使用点积调整 glRotate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16342563/

相关文章:

c++ - 查找包含值的单元格的索引并突出显示 QTableView 中的所有这些单元格

c++ - 如何从 QNetworkReply 读取数据?

c - 我如何使用指针在该数组(函数)内部移动而不是数组订阅

德尔福数学: Why is 0. 7<0.70?

c++ - 使用智能指针进行观察

c++ - 线程等待父级

c - 隐式转换如何处理有符号字符和无符号整数?

计算 C 中空格、制表符的数量

php - 使用朴素贝叶斯分类器对推文进行分类 : some problems

c# - 人气算法