тебе надо сделать класс Camera, CameraMover, KeyInput, MouseInput
1) ввод клавиш обрабатываешь в функции WndProc (после нее пишешь в соответствуюшие обьекты KeyInput состояние клавиш)
2) состояние курсора мышки лутче опрашивать "по-запросу"
POINT point;
RECT rect;
int BorderX = 0;
int BorderY = 0;
GetCursorPos(&point);
if(Window)
{
BorderX = GetSystemMetrics(SM_CXDLGFRAME);
BorderY = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYDLGFRAME);
HWND win_hWnd = Window->my_window_hwnd;
GetWindowRect(win_hWnd,&rect);
}
int posx = point.x - rect.left - BorderX - 1;
int posy = point.y - rect.top - BorderY - 1;
3) во время обновления двига посылаешь обновление в CameraMover
он считывает состояние мышки и клавиш, изменяет вектора поворота и положения камеры
вот мой код для моего двига для обработки управления камерой с помощью мышки :
if(WindowSize != Window->GetSize())
{
WindowSize = Window->GetSize();
Center.X = WindowSize.X / 2;
Center.Y = WindowSize.Y / 2;
return;
}
jeVector3df MousePos = MouseController->GetPosition();
jeVector2di CursorPos((s32)MousePos.X,(s32)MousePos.Y);
if(CursorPos != Center)
{
jeVector2di ChangeSpeed = CursorPos - Center;
jeVector3df ChangePos(ChangeSpeed.Y * Speed,ChangeSpeed.X * Speed,0);
//ChangePos = ChangePos * (-1);
ChangePos += Camera->GetRotation();
if(ChangePos.X < -90)
ChangePos.X = -90;
if(ChangePos.X > 90)
ChangePos.X = 90;
Camera->SetRotation(ChangePos);
}
MouseController->SetPosition(jeVector2df((f32)Center.X,(f32)Center.Y));
вот как у меня получается "вектор движения"
Moving.Flush();
if(Controller_Foward->IsDown())
Moving += (Foward * Speed * JEDT32);
if(Controller_Back->IsDown())
Moving -= (Foward * Speed * JEDT32);
if(Controller_Right->IsDown())
Moving += (Right * Speed * JEDT32);
if(Controller_Left->IsDown())
Moving -= (Right * Speed * JEDT32);
и после них окончательно изменяем позицию камеры
jeMatrix4f Matrix;
Matrix.SetRotationDeg(Camera->GetRotation() * (-1));
Matrix.TransformVector(Moving);
Moving.Normalize();
Moving = Moving * JEDT32 * 0.2f * (-1.0f);
Camera->SetPosition(Moving + Camera->GetPosition());
ps. JEDT32 - это дефайн который приписывает код возрата delta-time, можно его убрать
4) перед рисованием сцены надо сбросить матрицу проекции и установить её
//! Set Projection Matrix
void CRender_OpenGL::SetProjectionMatrix(f32 Fov, f32 Aspect, f32 Near, f32 Far)
{
ClearRenderMatrix(RMT_PROJECTION);
GLdouble xmin, xmax, ymin, ymax;
ymax = Near * tan(Fov * je::jeDegToRad / 2.0f);
ymin = -ymax;
xmin = ymin * Aspect;
xmax = ymax * Aspect;
glFrustum(xmin, xmax, ymin, ymax, Near, Far);
}
Дальше надо сбросить матрицу GL_MODELVIEW_MATRIX
и применить такие трансформации :
glTranslatef((GLfloat)NewPosition.X,(GLfloat)NewPosition.Y,(GLfloat)NewPosition.Z);
glRotatef((GLfloat)NewRotation.X,1.0f,0.0f,0.0f);
glRotatef((GLfloat)NewRotation.Y,0.0f,1.0f,0.0f);
glRotatef((GLfloat)NewRotation.Z,0.0f,0.0f,1.0f);
где NewPosition - текущая позиция камеры, NewRotation - текущий поворот камеры
вот и все