Показать сообщение отдельно
Старый 12.11.2008, 16:15   #2
jimon
 
Сообщений: n/a
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление

тебе надо сделать класс 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 - текущий поворот камеры

вот и все

Последний раз редактировалось jimon, 12.11.2008 в 17:05.
 
Ответить с цитированием