Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ

FAQ Туториалы и часто задаваемые вопросы

Ответ
 
Опции темы
Старый 24.06.2012, 20:01   #1
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Счастье Правильное ограничение угла поворота камеры

Очень неприятно, когда перс может крутить башкой на все 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
Все! Теперь никаких бешеных телодвижений! Этот код не подвержен "проскакиваниям" - присущим некоторым другим реализациям
__________________

(Offline)
 
Ответить с цитированием
Старый 24.06.2012, 22:04   #2
Hartmann1
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, 22:26   #3
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: Правильное ограничение угла поворота камеры

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

(Offline)
 
Ответить с цитированием
Старый 24.06.2012, 23:12   #4
Hartmann1
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, 23:47   #5
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: Правильное ограничение угла поворота камеры

Спасибо, линал я знаю. Но я написал путь для чайников.
__________________

(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com