forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   OpenGL & VC++. Инициализация,Визуализация,Управление (http://forum.boolean.name/showthread.php?t=7318)

Miha 12.11.2008 15:37

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

вот проект в VC++ 6.0. Может специалисты посмотрят и ответят на мои вопросы. И если нетрудно скажите может что лишнего понописал.
Премного благодарен!!!:rolleyes:

jimon 12.11.2008 16:15

Ответ: 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 - текущий поворот камеры

вот и все :)

Miha 12.11.2008 23:12

Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
 
Спасибо! ща буду разбирать.
Непротив если по ходу буду задовать некие вопросы?

Miha 13.11.2008 23:11

Ответ: 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);
Помоему это не не камеру трансформировать а примитивы

HolyDel 13.11.2008 23:13

Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
 
воопще то не камеру трансформируют а мир.
т. например не камеру сдвинают вперед на 1цу, а мир на 1цу назад.

jimon 13.11.2008 23:42

Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
 
вообще не мир, не камеру, не примитивы, а заданную матрицу проекции

HolyDel 14.11.2008 00:25

Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
 
вобщето modelview матрицу. и это образно говоря - мир.

jimon 14.11.2008 00:37

Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
 
project она, думаешь, двигать не может ?
она всего на всего домножает текущую матрицу на матрицу трансформации

Miha 14.11.2008 00:48

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

jimon 14.11.2008 01:05

Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
 
Miha
я же уже написал

Miha 14.11.2008 01:14

Ответ: OpenGL & VC++. Инициализация,Визуализация,Управление
 
Да я видел. Но я учусь, и поэтому хочу узнать как производить полноценное управление камерой с помощью gluLookAt.
К тому же для этого она и преднозначена.

jimon спасибо!


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot