OpenGL - 旋转玩家位置以面对鼠标指针
OpenGL - rotate player position to face mouse pointer
我是OpenGL和C++的新手,我正在尝试开发一个小游戏。我试图实现的想法是一个2D射击游戏,玩家面对鼠标指向的方向。我在网上寻找了一些帮助和例子,但找不到太多。我从哪里开始,有没有人有一些好的伪代码来使这项工作?谢谢!
无论您使用什么 API 来创建窗口/GL 上下文,都允许您处理事件,即鼠标运动事件,以便您可以跟踪鼠标在屏幕坐标上的位置。然后,您可能会使用正交投影,并且您的摄像机可能不是静态的,而是随着播放器一起移动。
考虑到这些变量,这里列出了您需要的内容。
-
首先,您需要获取鼠标屏幕坐标。
-
将它们转换为世界坐标。
-
计算从玩家到这一点的向量。
1 - 对于第一点,例如,我将使用 SDL,因为这是我在自己的项目中通常使用的。否则,我将尝试使代码尽可能通用。
...
while ( SDL_PollEvent( &event ) ) {
if ( event.type == SDL_MOUSEMOTION ) {
mouseScreen.x = event.motion.x;
mouseScreen.y = event.motion.y;
}
}
...
2 - 对于第二点,让我们了解一些背景和假设。通常设置相机会像这样,
viewport( 0, screenWidth, 0, screenHeight );
...
ortho( projection, cameraLeft, cameraRight, cameraBottom, cameraTop )
translate( view, -cameraPosition )
//cameraWidth = cameraRight - cameraLeft;
在大多数 2D 游戏中,您的屏幕尺寸将与相机尺寸相同。如果您更改相机尺寸,则相机看起来就像在放大/缩小,因此我们会将其考虑在内。
现在让我们假设相机的原点位于屏幕的中心。在这种情况下,您的正交函数如下所示,
// halfCamWidth = cameraWidth/2;
// halfCamHeight = cameraHeight/2;
ortho( projection, -halfCamWidth, halfCamWidth, -halfCamHeight, halfCamHeight );
它可能是左下角。但这完全取决于您决定如何制作游戏。使用左下角,您可以通过执行以下操作将相机居中放在一个点 (x,y) 上,
cameraPosition.x = x - cameraWidth/2;
cameraPosition.y = y - cameraHeight/2;
而如果你使用中心作为原点,你会这样做
cameraPosition.x = x;
cameraPosition.y = y;
这使我们的计算稍微容易一些。因此,如果您使用不同的引用,我将留给您。
回到转换,我们现在可以通过两步从屏幕坐标转换为世界坐标。首先,我们需要在相机投影中调整鼠标位置。(请注意整数运算,因为您可能必须将维度转换为浮点数)
mouseWorld.x = cameraLeft + ( mouseScreen.x / screenWidth ) * cameraWidth;
mouseWorld.y = cameraBottom + ( mouseScreen.y / screenHeight ) * cameraHeight;
这个公式得到x在[-halfCameraWidth, halfCameraWidth]
以内和y在[-halfCameraHeight, halfCameraHeight]
内的相关值,基本上在正交函数的极限之内。也许如果事件处理可以检测到窗口外的鼠标位置,您会得到此间隔之外的值,但这对于此公式来说不是问题。
其次,我们现在需要将这个点放在相机的中心周围,
mouseWorld.x = mouseWorld.x + cameraPosition.x;
mouseWorld.y = mouseWorld.y + cameraPosition.y;
现在我们有了世界地位。
3 - 最后,第三点,我们计算从玩家到这一点的向量。
Vector2 playerToMouseDirection = ( mouseWorld - player.position );
playerToMouseDirection.normalize();
仅此而已。
如果您的播放器立即旋转,您就完成了。如果你想让你的玩家旋转得更慢,你必须找到一种方法来线性插值矢量(或角度)。祝你好运。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 如何在启动时在Qt应用程序中隐藏鼠标指针
- Wince 6.0如何在操作系统靴子后移动鼠标指针
- QTEXTEDIT:在鼠标指针下获取单词
- 如何在启动时隐藏鼠标指针
- OpenGL - 旋转玩家位置以面对鼠标指针
- 使用 OpenCV 将鼠标指针悬停在图像上时在图像上打印像素坐标
- 在 MFC 中捕获鼠标指针形状更改事件
- 如何将光标(鼠标指针对象)转换为bmp图像的自动序列
- 使用QStyledItemDelegate将鼠标悬停在文本上时,如何更改鼠标指针
- 将原始鼠标/指针数据转换为有意义的内容
- 如何恢复我的鼠标指针时,它不可见的QWSSERVER::SetCursorVisible(false)
- 鼠标指针渲染器
- 有一个Quad跟随鼠标指针(没有Glut)
- 用指针和引用混淆自己,c++(从WinAPI获取鼠标坐标)