Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Камера от 1-го лица

13K
22 февраля 2010 года
karimchik
65 / / 16.06.2008
Народ!Хелп плиз!Скока не ходил по инету,скока сам ни делал, ни как не могу создать рабочую камеру от первого лица!
Вроде пробывал делать,у меня получалось поворачивать её относительно оси y.А вот по оси x он начинал поворачивать её относительно начальных координат.
Если кому не жалко поделитесь исходником!Ну или функцией.
536
22 февраля 2010 года
alex-kniaz
382 / / 07.08.2008
для начала что юзаете (дрект икс, опен гл)
9
22 февраля 2010 года
Lerkin
3.0K / / 25.03.2003
Дополнительно вопрос: на чем вращение основываете? Кватернионы, углы Эйлера, али как еще? И что у вас с мировой системой координат? Как сцену строите?
13K
23 февраля 2010 года
karimchik
65 / / 16.06.2008
Делаю я вот так:
Код:
D3DXVECTOR3 eye(cam_x,cam_y,cam_z);
    D3DXVECTOR3 at(cam_x+1,cam_y+0,cam_z+0);
    D3DXVECTOR3 up(0,up_y,0);

    D3DXMatrixLookAtLH(&matView,&eye,&at,&up);

    D3DXMatrixRotationYawPitchRoll(&z2,xxx,0,0);
    D3DXMatrixRotationYawPitchRoll(&z4,0,yy,0);

    D3DXMatrixTranslation(&z5,50,0,0);
   
    z3=matView*z2*z4*z5;   

    g_pd3dDevice->SetTransform(D3DTS_VIEW,&z3);


XXX и YY я вставляю в обработчик клавы.Код находится в фун-ии рендера.
В начале координат камера работает просто отлично,исправно накланяется и поварачивается.Но вот стоит её только отодвинуть её на определённое растояние, как по оси х начинается проблемма,а именно камера начинает двигаться относительно начала координат(тоесть глобальных координат)Насколько я понимаю ,нужно определить координаты локальными.Я исполь. функцию matrix Transform и установил координаты поворота в точках позиции камеры.Но ничего не помогло((
з.ы. я юзаю директ х
9
24 февраля 2010 года
Lerkin
3.0K / / 25.03.2003
Выдрал кусок из примера для OpenGL (для DX - совсем не проблема перевести). Вроде как - по урокам NeHe сделан (оттого и тупой). Я, правда, не вникал в подробности, но работать сможет. Обеспечивает полное вращение мышкой.

Код:
#define COEFF           0.05f
#define DEGTORAD(x)     ((x) * (M_PI / 180.f))

float _euler[2];

void update()
{
    POINT mShift;

    int cx = GetSystemMetrics(SM_CXSCREEN) / 2;
    int cy = GetSystemMetrics(SM_CYSCREEN) / 2;

    GetCursorPos( &mShift );
    SetCursorPos( cx, cy );
    mShift.x = cx - mShift.x;
    mShift.y = cy - mShift.y;

    if (mShift.y)
    {
    _euler[0] -= (float)mShift.y * COEFF;

    if (_euler[0] >= 360.f)
        _euler[0] -= 360.f;
    else if (_euler[0] < 0.f)
        _euler[0] += 360.f;
    }

    if (mShift.x)
    {
    _euler[1] -= (float)mShift.x * COEFF;

    if (_euler[1] >= 360.f)
        _euler[1] -= 360.f;
    else if (_euler[1] < 0.f)
        _euler[1] += 360.f;
    }

    float fPitch = DEGTORAD( _euler[0] );
    float fYaw = DEGTORAD( _euler[1] );

    // тут вращаем (Rotate) единичную модельно-видовую матрицу по X (на fPitch), потом по Y (на fYaw).
    ...
}


Конечно, это только как пример для разбора вращения на углах Эйлера.

[COLOR="Gray"]upd: Упростил до простого вращения, без перемещения.[/COLOR]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог