使用点积调整glRotate
Adjusting glRotate, using dot product
简介:我正在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的绝对值。要计算向量的模(其长度(,您需要使用上面引用的公式。
- 为char数组调整zlib-zpipe
- 调整大小后指向元素值的指针unordered_map有效?
- 在C++中调整向量中的索引
- 哪些库可以通过Opencv调整曝光率
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- 在容量内调整矢量大小时的性能影响
- 将 boost::odeint 与向量类一起使用,而无需调整向量的大小
- 将摄像机调整到俯视图
- Qt 图表条形图调整大小崩溃
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- 调整布局上的 QGraphicsView 小部件的大小
- 如何在构建链接列表时调整头、尾指针
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 当您在此单词中搜索单词时调整字符数组的大小?
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 如何按另一个向量的方向调整一个向量?
- 使用大小调整大小调整 wxListView 的大小
- 调整大小和复制哈希表数组中的元素
- 使用点积调整glRotate