 |
FAQ Туториалы и часто задаваемые вопросы |
24.06.2012, 16:01
|
#1
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,564
Написано 541 полезных сообщений (для 1,514 пользователей)
|
Правильное ограничение угла поворота камеры
Очень неприятно, когда перс может крутить башкой на все 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
Все! Теперь никаких бешеных телодвижений! Этот код не подвержен "проскакиваниям" - присущим некоторым другим реализациям
__________________
Junior Tools Programmer at Larian Studios
ПеКа: AMD Ryzen 1700X 8@3.4 ГГц, 16 Гб ОЗУ,
NVIDIA GTX 960 4 Гб, SSD Samsung 960 EVO 500 Гб
|
(Offline)
|
|
24.06.2012, 18:04
|
#2
|
AnyKey`щик
Регистрация: 24.06.2012
Сообщений: 16
Написано 5 полезных сообщений (для 6 пользователей)
|
Ответ: Правильное ограничение угла поворота камеры
Зачем привязывать камеру к телу?
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 )
|
(Offline)
|
|
24.06.2012, 18:26
|
#3
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,564
Написано 541 полезных сообщений (для 1,514 пользователей)
|
Ответ: Правильное ограничение угла поворота камеры
Затем чтобы идти вперед, а не лететь туда куда смотришь
__________________
Junior Tools Programmer at Larian Studios
ПеКа: AMD Ryzen 1700X 8@3.4 ГГц, 16 Гб ОЗУ,
NVIDIA GTX 960 4 Гб, SSD Samsung 960 EVO 500 Гб
|
(Offline)
|
|
24.06.2012, 19:12
|
#4
|
AnyKey`щик
Регистрация: 24.06.2012
Сообщений: 16
Написано 5 полезных сообщений (для 6 пользователей)
|
Ответ: Правильное ограничение угла поворота камеры
Сообщение от mr.DIMAS
Затем чтобы идти вперед, а не лететь туда куда смотришь
|
Ну так возьми вектор направления камеры ( после поворота, с помощью 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 ) 
|
(Offline)
|
|
24.06.2012, 19:47
|
#5
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,564
Написано 541 полезных сообщений (для 1,514 пользователей)
|
Ответ: Правильное ограничение угла поворота камеры
Спасибо, линал я знаю. Но я написал путь для чайников.
__________________
Junior Tools Programmer at Larian Studios
ПеКа: AMD Ryzen 1700X 8@3.4 ГГц, 16 Гб ОЗУ,
NVIDIA GTX 960 4 Гб, SSD Samsung 960 EVO 500 Гб
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +1, время: 22:23.
|