想问问,用opengl鼠标消息响应来确定在场景中前进或后退,其效果有点卡的感觉,怎么改进啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想问问,用opengl鼠标消息响应来确定在场景中前进或后退,其效果有点卡的感觉,怎么改进啊?相关的知识,希望对你有一定的参考价值。

参考技术A 在渲染前调用:

// aimCamera, 实时调整摄像机位置. 关键调用: gluLookAt( ... );
void aimCamera()
// 摄像机基本参数: // g_Camera.PositionCamera( 280, 35, 225, 281, 35, 225, 0, 1, 0);
static D3DXVECTOR3 g_vLookat(280, 35, 225); // m_vPosition
static D3DXVECTOR3 g_vEye(281, 35, 225); // m_vView
static D3DXVECTOR3 g_vUp(0,1,0); // m_vUpVector 摄像机初始参数: 0--x, 1--y, 2--z
// 摄像机辅助参数:
static D3DXVECTOR3 g_vRight(1,0,0), g_vLook(0,-1,-0.5); // 摄像机方向
g_vLook = g_vLookat-g_vEye; D3DXVec3Normalize(&g_vLook,&g_vLook);
D3DXVec3Cross(&g_vRight, &g_vUp, &g_vLook); D3DXVec3Normalize(&g_vRight,&g_vRight);

// g_Camera.Update(); ...... SetViewByMouse();
static POINT pt;
static int xo = SCREEN_WIDTH >> 1; // 用户区宽度/2.
static int yo = SCREEN_HEIGHT >> 1; // 用户区高度/2.
static float aY, aZ;
static float cRX = 0.0f; // cRX, currentRotX

GetCursorPos(&pt); // 获得鼠标的当前位置
if( !( (pt.x == xo) && (pt.y == yo) ) ) SetCursorPos(xo, yo);
aY = ( (xo - pt.x) ) / 500.0f; aZ = ( (yo - pt.y) ) / 500.0f;
cRX -= aZ;

if(cRX > 1.0f) cRX = 1.0f;
else if(cRX < -1.0f) cRX = -1.0f;
else
D3DXVec3RotateAxis(&g_vLook,&g_vLook,aZ,&g_vRight);
g_vEye=g_vLookat-g_vLook;
D3DXVec3RotateAxis(&g_vLook,&g_vLook,aY,&D3DXVECTOR3(0,1,0));
g_vEye=g_vLookat-g_vLook;
// if...else...

// if( !( ...... ) )
// g_Camera.Update(); ...... CheckForMovement();
static float v; getFPS(&v); v= kSpeed * v; // v: 每秒位移量 ----> 每帧位移量
g_vLook = g_vEye-g_vLookat; D3DXVec3Normalize(&g_vLook,&g_vLook);
D3DXVec3Cross(&g_vRight, &g_vUp, &g_vLook); D3DXVec3Normalize(&g_vRight,&g_vRight);

if( GetKeyState(VK_UP) & 0x80 || GetKeyState('W') & 0x80 ) // 移动摄像机: MoveCamera(speed);
g_vLookat+=g_vLook*v; // 改变摄像机的目标点 g_vEye+=g_vLook*v; // 改变摄像机的位置
else if( GetKeyState(VK_DOWN) & 0x80 || GetKeyState('S') & 0x80 )
g_vLookat+=-g_vLook*v; g_vEye+=-g_vLook*v;
else if( GetKeyState(VK_LEFT) & 0x80 || GetKeyState('A') & 0x80 )
g_vLookat+=g_vRight*v; // .y分量不加... g_vEye+=g_vRight*v;
else if( GetKeyState(VK_RIGHT) & 0x80 || GetKeyState('D') & 0x80 )
g_vLookat+=-g_vRight*v; // .y分量不加... g_vEye+=-g_vRight*v;
// if ... else ...
glLoadIdentity();gluLookAt(g_vLookat.x, g_vLookat.y, g_vLookat.z, g_vEye.x, g_vEye.y, g_vEye.z, g_vUp.x, g_vUp.y, g_vUp.z);
// 调整Camera位置 ...
g_vUp=D3DXVECTOR3(0,1,0);
static float t; t=g_vLookat.y;
if(g_vLookat.y < Height(g_HeightMap,g_vLookat.x, g_vLookat.z ) + 10) // 判断摄像机是否低于地平面
g_vLookat.y = Height(g_HeightMap,g_vLookat.x, g_vLookat.z ) + 10; // 设置新的位置
t -=g_vLookat.y;
g_vEye.y-=t;
// if ...

// aimCamera

MFC中如何让静态控件响应鼠标移动的消息?

我想在静态文本控件中显示3D图形(用OGRE渲染),于是我自定义了继承CWnd的CMyModule类,并且在CMyModule中已经写了响应WM_MOUSEMOVE消息的处理函数。我在对话框模板中拖入了静态文本控件。然后把这个控件关联我的自定义类,现在已经能在对话框的静态控件中显示3D图像了,现在的问题是当鼠标移动到静态控件时还是不能响应我的消息函数,不能移动图形。本人菜鸟,请高手指点。
我曾经在SDI工程下的View中能显示3D图形并且也能够响应鼠标的移动消息。

你是如何关联CMyModule类的,应该在对话框中,根据控件ID,删除已经创建的静态文件控件,然后用这个ID创建自己的子窗口。
还有,在鼠标的响应函数中,放一些TRACE宏,输出点内容,看看是否的确没有进入鼠标消息响应。
参考技术A 你在你的OnLButtonDown方法里设置个断点,调试下看看鼠标消息是否能得到响应 参考技术B WM_MOUSEMOVE

一般情况下,鼠标移动是不能拖动图形的,一定要和leftbuttondown或 rightbuttondown联合使用。

某个键按下时,同时移动鼠标,同时捕捉这两个消息,然后处理图形移动。追问

在CMyModule中我也已经写了
void CMyModule::OnLButtonDown(UINT nFlags, CPoint point)

// TODO: 在此添加消息处理程序代码和/或调用默认值
m_mouseLast = point;
CWnd::OnLButtonDown(nFlags, point);

追答

在自己的类里面,得到消息后要自己处理,就是重新画图。不能用缺省的处理。

本回答被提问者采纳

以上是关于想问问,用opengl鼠标消息响应来确定在场景中前进或后退,其效果有点卡的感觉,怎么改进啊?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL相机的相对旋转

openGL按鼠标中键实现放大缩小

opengl中如何实现图象的缩放

如何在 C++/OpenGL 中获取当前鼠标位置?

OpenGL透视和照明不起作用?

如果在加载场景时移动鼠标光标不会消失 - OpenGL 和 GLFW