Главная » Статьи » 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; } Демо прилагается Демка для посдказки "Дрожание камеры" Нажимаем на пробел для тряски | |
Просмотров: 362 | | |
Всего комментариев: 0 | |