forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Правильное ограничение угла поворота камеры (http://forum.boolean.name/showthread.php?t=16959)

mr.DIMAS 24.06.2012 20:01

Правильное ограничение угла поворота камеры
 
Очень неприятно, когда перс может крутить башкой на все 360 градусов по вертикали.

Камера привязана к телу. ( camera = bbCreateCamera( entity ))

Вот так обычно выглядит код, отвечающий за обзор

Код:

mxs# = MouseXSpeed() * mouse_sens ;mouse_sens - чувствительность мыши
mys# = MouseYSpeed() * mouse_sens

TurnEntity entity, 0, -mxs, 0
TurnEntity camera, mys, 0, 0

Этот код не ограничивает угол поворота камеры по вертикали.
А этот ограничивает - и очень неплохо!
Код:

mxs# = MouseXSpeed() * mouse_sens ;mouse_sens - чувствительность мыши
mys# = MouseYSpeed() * mouse_sens

if( EntityPitch( camera, 1 ) + mys > max_pitch ) ;max_pitch - максимальный угол наклона камеры, например 89 градусов
  mys = 0
end if

if( EntityPitch( camera, 1 ) + mys < -max_pitch )
  mys = 0
end if

TurnEntity entity, 0, -mxs, 0
TurnEntity camera, mys, 0, 0

Все! Теперь никаких бешеных телодвижений! Этот код не подвержен "проскакиваниям" - присущим некоторым другим реализациям

Hartmann1 24.06.2012 22:04

Ответ: Правильное ограничение угла поворота камеры
 
Зачем привязывать камеру к телу?

Код:

Const MaxPlayerPitch# = 85.0
Const MinPlayerPitch# = -75.0

...

Global ScreenCenterX% = GraphicsWidth() / 2
Global ScreenCenterY% = GraphicsHeight() / 2

Global MouseDeltaRatio# = 0.25

...

Local PlayerPitch# = 0
Local PlayerYaw# = 0

...

Local MouseDeltaX# = MouseXSpeed() * MouseDeltaRatio
Local MouseDeltaY# = MouseYSpeed() * MouseDeltaRatio

MoveMouse( ScreenCenterX, ScreenCenterY )

PlayerPitch = PlayerPitch + MouseDeltaY
If ( PlayerPitch > MaxPlayerPitch ) Then
    PlayerPitch = MaxPlayerPitch
Else If ( PlayerPitch < MinPlayerPitch ) Then
    PlayerPitch = MinPlayerPitch
End If

PlayerYaw = PlayerYaw - MouseDeltaX

RotateEntity( PlayerCamera, PlayerPitch, PlayerYaw, 0 )


mr.DIMAS 24.06.2012 22:26

Ответ: Правильное ограничение угла поворота камеры
 
Затем чтобы идти вперед, а не лететь туда куда смотришь

Hartmann1 24.06.2012 23:12

Ответ: Правильное ограничение угла поворота камеры
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 231296)
Затем чтобы идти вперед, а не лететь туда куда смотришь

Ну так возьми вектор направления камеры ( после поворота, с помощью GetMatElement ) и двигайся как требуется :)
т.е.
клавишами вперед\назад двигай по этому вектору исключая ось Y
клавишами стрейфа двигай по перпендикуляру к этому вектору, тоже исключая ось Y
как-то так:
Код:

Local DirectionX# = GetMatElement( Camera, 2, 0 )
Local DirectionZ# = GetMatElement( Camera, 2, 2 )

Local MovingX# = 0
Local MovingZ# = 0

; вперед
If KeyDown( 17 ) Then
    MovingX = MovingX + DirectionX
    MovingZ = MovingZ + DirectionZ
End If

; назад
If KeyDown( 31 ) Then
    MovingX = MovingX - DirectionX
    MovingZ = MovingZ - DirectionZ
End If

; влево
If KeyDown( 30 ) Then
    MovingX = MovingX - DirectionZ
    MovingZ = MovingZ + DirectionX
End If

; вправо
If KeyDown( 32 ) Then
    MovingX = MovingX + DirectionZ
    MovingZ = MovingZ - DirectionX
End If

; нормализуем
Local MovingLength# = MovingX * MovingX + MovingZ * MovingZ
If ( MovingLength > 1.0 ) Then
    Local  MovingInverseLength# = 1.0 / Sqr( MovingLength )
    MovingX = MovingX * MovingInverseLength
    MovingZ = MovingZ * MovingInverseLength
End If

;двигаем
TranslateEntity( Camera, MovingX, 0, MovingZ )

Ну и тут уже недалеко до нормального FPS перемещения - Moving используем для ускорения, аккумулируем скорость по ускорению, скорость ограничиваем, применяем трение, а по оси Y двигаем гравитацией + прыжок ( причем все это одним TranslateEntity ) :)

mr.DIMAS 24.06.2012 23:47

Ответ: Правильное ограничение угла поворота камеры
 
Спасибо, линал я знаю. Но я написал путь для чайников.


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

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