ksacvet777.moy.su
Главная » Статьи » IT

Функция дрожания камеры

Во многих играх мы можем наблюдать тряску камеры когда происходит какое-нибудь
значительное игровое событие. Типа что-то бабахнуло рядом.
Всё сотрясается  и камера тоже (собственно и игрок), что придаёт дополнительную игровую атмосферу.

Тряску камеры можно сделать в постпроцессе, сдвигая экран вверх вниз,
но есть способ попроще.
Данный способ основан на "тряске" вектора точки взгляда камеры.

Принцип очень прост:
Вычисляются вектора двух направлений, по которым точка взгляда будет "скакать"
и шум по которому точка скачет.


Время (параметр time) следует передавать значительно ускоренное (в примере передано GetTime() * 100.0f ),
иначе камера будет двигаться туда сюда, а не дрожать.

Можно так же "трясти" направление. В этом случае реализацию необходимо несколько изменить.

 



#include <d3dx9.h>


void VibrateCamera( D3DXVECTOR3& eyeat, 
                 const D3DXVECTOR3& eyepos, 
                 const D3DXVECTOR3& eyeup, 
                 const float time, 
                 const float amplitude )
{
    D3DXVECTOR3 dir = eyeat - eyepos;
    D3DXVec3Normalize( &dir , &dir );
    D3DXVECTOR3 n_horiz;
    D3DXVec3Cross( &n_horiz, &dir, &eyeup );
    D3DXVECTOR3 n_vertic;
    D3DXVec3Cross(&n_vertic, &dir, &n_horiz);
    D3DXVec3Normalize( &n_vertic , &n_vertic );

    float noise_1 = amplitude * (sin( time ) + sin( 3.78f - time * 1.254f ) + sin( 1.6f + time * 0.854f ));
    float noise_2 = amplitude * (sin( time * 1.78f ) + sin( 2.78f - time * 1.254f ) + sin( 0.6f + time * 1.854f ));

    eyeat += n_horiz * noise_1;
    eyeat += n_vertic * noise_2;

}



Демо прилагается
Демка для посдказки "Дрожание камеры"
Нажимаем на пробел для тряски



Категория: IT | Добавил: ksacvet777 (23.01.2014)
Просмотров: 362 | Теги: Эффект, Function, tremblind, дрожание, камеры, Camera | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: