|
12.11.2008, 15:37
|
#1
|
Нуждающийся
Регистрация: 07.04.2007
Сообщений: 50
Написано 5 полезных сообщений (для 30 пользователей)
|
OpenGL & VC++. Инициализация,Визуализация,Управление
Здрасть!!!
Вообщем непойму некоторые выжные аспекты OpenGL.
Пытаюсь программировать в WinApi приложении, ООП методом.
Создал ксласс->обьект(Инициальзация,Resize,Рендеринг)
К окошку прилепил менюшку(нужно будет в дальнейшем).
Вывел туда треугольник разноцветный.
А вот как:
-Крутить треугольник
-Крутить камеру
-все выше сказанное с помощью девайса (клава,мышь)
Вопрос даже ни "Как" а где энто писать то все?
Пробовал всякие glRotatef,glTranslate, ничё некрутиться ни вертится.
Я неочень то понимаю смысл команды glMatrixMode(...)
где и когда её писать?
вот проект в VC++ 6.0. Может специалисты посмотрят и ответят на мои вопросы. И если нетрудно скажите может что лишнего понописал.
Премного благодарен!!!
|
(Offline)
|
|
12.11.2008, 16:15
|
#2
|
|
Ответ: 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
|
Нуждающийся
Регистрация: 07.04.2007
Сообщений: 50
Написано 5 полезных сообщений (для 30 пользователей)
|
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
Спасибо! ща буду разбирать.
Непротив если по ходу буду задовать некие вопросы?
|
(Offline)
|
|
13.11.2008, 23:11
|
#4
|
Нуждающийся
Регистрация: 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
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
воопще то не камеру трансформируют а мир.
т. например не камеру сдвинают вперед на 1цу, а мир на 1цу назад.
|
(Offline)
|
|
13.11.2008, 23:42
|
#6
|
|
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
вообще не мир, не камеру, не примитивы, а заданную матрицу проекции
|
|
|
14.11.2008, 00:25
|
#7
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
вобщето modelview матрицу. и это образно говоря - мир.
|
(Offline)
|
|
14.11.2008, 00:37
|
#8
|
|
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
project она, думаешь, двигать не может ?
она всего на всего домножает текущую матрицу на матрицу трансформации
|
|
|
14.11.2008, 00:48
|
#9
|
Нуждающийся
Регистрация: 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
|
|
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
Miha
я же уже написал
|
|
|
14.11.2008, 01:14
|
#11
|
Нуждающийся
Регистрация: 07.04.2007
Сообщений: 50
Написано 5 полезных сообщений (для 30 пользователей)
|
Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
Да я видел. Но я учусь, и поэтому хочу узнать как производить полноценное управление камерой с помощью gluLookAt.
К тому же для этого она и преднозначена.
jimon спасибо!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
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, время: 16:11.
|