Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 12.11.2008, 15:37   #1
Miha
Нуждающийся
 
Регистрация: 07.04.2007
Сообщений: 50
Написано 5 полезных сообщений
(для 30 пользователей)
OpenGL & VC++. Инициализация,Визуализация,Управление

Здрасть!!!
Вообщем непойму некоторые выжные аспекты OpenGL.
Пытаюсь программировать в WinApi приложении, ООП методом.
Создал ксласс->обьект(Инициальзация,Resize,Рендеринг)
К окошку прилепил менюшку(нужно будет в дальнейшем).
Вывел туда треугольник разноцветный.
А вот как:
-Крутить треугольник
-Крутить камеру
-все выше сказанное с помощью девайса (клава,мышь)
Вопрос даже ни "Как" а где энто писать то все?
Пробовал всякие glRotatef,glTranslate, ничё некрутиться ни вертится.
Я неочень то понимаю смысл команды glMatrixMode(...)
где и когда её писать?

вот проект в VC++ 6.0. Может специалисты посмотрят и ответят на мои вопросы. И если нетрудно скажите может что лишнего понописал.
Премного благодарен!!!
Вложения
Тип файла: zip Use_OpenGL.zip (21.4 Кб, 460 просмотров)
(Offline)
 
Ответить с цитированием
Старый 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.
 
Ответить с цитированием
Старый 12.11.2008, 23:12   #3
Miha
Нуждающийся
 
Регистрация: 07.04.2007
Сообщений: 50
Написано 5 полезных сообщений
(для 30 пользователей)
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление

Спасибо! ща буду разбирать.
Непротив если по ходу буду задовать некие вопросы?
(Offline)
 
Ответить с цитированием
Старый 13.11.2008, 23:11   #4
Miha
Нуждающийся
 
Регистрация: 07.04.2007
Сообщений: 50
Написано 5 полезных сообщений
(для 30 пользователей)
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление

glTranslatef((GLfloat)NewPosition.X,(GLfloat)NewPo sition.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);
Помоему это не не камеру трансформировать а примитивы
(Offline)
 
Ответить с цитированием
Старый 13.11.2008, 23:13   #5
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление

воопще то не камеру трансформируют а мир.
т. например не камеру сдвинают вперед на 1цу, а мир на 1цу назад.
(Offline)
 
Ответить с цитированием
Старый 13.11.2008, 23:42   #6
jimon
 
Сообщений: n/a
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление

вообще не мир, не камеру, не примитивы, а заданную матрицу проекции
 
Ответить с цитированием
Старый 14.11.2008, 00:25   #7
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление

вобщето modelview матрицу. и это образно говоря - мир.
(Offline)
 
Ответить с цитированием
Старый 14.11.2008, 00:37   #8
jimon
 
Сообщений: n/a
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление

project она, думаешь, двигать не может ?
она всего на всего домножает текущую матрицу на матрицу трансформации
 
Ответить с цитированием
Старый 14.11.2008, 00:48   #9
Miha
Нуждающийся
 
Регистрация: 07.04.2007
Сообщений: 50
Написано 5 полезных сообщений
(для 30 пользователей)
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление

лан лан!
тут вот вопрос встал таков. Более с матикой связан.
gluLookAt(px,py,pz,rx,ry,rz,0,1,0);
воопщем px,py,pz-позиционирую камеру
rx,ry,rz-позиционируют цель.
px,pz энто клава (вперёд,назад,влево, вправо)
rx,ry это позиция мышкой
Мне надо двигатся туда куда камера глядит, а не х.з. куда.
Вроде как с синусами косинусами делать надо (позицию умнажать вроде).
Может кто знает как реализовать?
(Offline)
 
Ответить с цитированием
Старый 14.11.2008, 01:05   #10
jimon
 
Сообщений: n/a
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление

Miha
я же уже написал
 
Ответить с цитированием
Старый 14.11.2008, 01:14   #11
Miha
Нуждающийся
 
Регистрация: 07.04.2007
Сообщений: 50
Написано 5 полезных сообщений
(для 30 пользователей)
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление

Да я видел. Но я учусь, и поэтому хочу узнать как производить полноценное управление камерой с помощью gluLookAt.
К тому же для этого она и преднозначена.

jimon спасибо!
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление KingMaks Blitz3D 4 27.11.2009 01:56
управление в RPG JeSss 3D-программирование 37 16.01.2008 18:46
Управление smaller 3D-программирование 12 20.12.2006 02:20


Часовой пояс GMT +4, время: 00:42.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com