forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Ограничение наклона камеры в FPS (http://forum.boolean.name/showthread.php?t=5282)

Maxxx.!!!. 13.12.2007 19:27

Ограничение наклона камеры в FPS
 
Как ограничить X-наклон камеры в FPS?

Пробовал так -

u#=80
If Abs(EntityPitch#(CAM))=>u# RotateEntity CAM,u#*Sgn(EntityPitch#(CAM)),0,0

Но камера часто уходит в недопустимый диапазон и все переворачивается вверх ногами.

И так пробовал - результат получше, но все-равно частенько не работет.

If EntityPitch#(Cam)>80 Then RotateEntity CAM,79.9,0,0
If EntityPitch#(Cam)<-80 Then RotateEntity CAM,-79.9,0,0


А есть ли какой-нибудь готовый алгоритм, который бы работал без сбоев?

Maxxx.!!!. 14.12.2007 00:33

Re: Ограничение наклона камеры в FPS
 
Что, никто не знает?

FrankH 14.12.2007 00:50

Re: Ограничение наклона камеры в FPS
 
ИМХО метод дубовый, но попробуй так:
Код:

TurnEntity player,0,Float(-MouseXSpeed()*camspeed),0,True
yspd#=Float(MouseYSpeed()*camspeed)
If yspd#>20 yspd#=20
If yspd#<-20 yspd#=-20
If (EntityPitch#(Cam)<80) And (yspd#>0) Then
    TurnEntity cam,yspd#,0,0
Else
    If (EntityPitch#(Cam)>-70) And (yspd#<0) Then TurnEntity cam,yspd#,0,0
EndIf

ограничение вверх проскакивает иногда, если поставить (EntityPitch#(Cam)>-80)

sSwSs 14.12.2007 01:15

Re: Ограничение наклона камеры в FPS
 
Тебе должно фатить этого...

TurnEntity Player,0,-MouseXSpeed()/2,0
TurnEntity cam,MouseYSpeed()/2,0,0
MoveMouse GraphicsWidth()*0.5,GraphicsHeight()*0.5
If Abs(EntityPitch#(cam))>80 RotateEntity cam,80*Sgn(EntityPitch#(cam)),0,0

У меня стоит так вроде....работает без глюков
Хотя может я и ошибаюсь...

Platon 14.12.2007 03:23

Re: Ограничение наклона камеры в FPS
 
ЖЖоте :)
Код:

CamYaw# = CamYaw + MouseXSpeed() * MouseXSens#
If (CamYaw >  359) Then CamYaw =  CamYaw - 360
If (CamYaw <    0) Then CamYaw = CamYaw + 360
CamPitch# = CamPitch - MouseYSpeed() * MouseYSens#
If (CamPitch >  CamMaxPitch) Then CamPitch =  CamMaxPitch
If (CamPitch < -CamMaxPitch) Then CamPitch = -CamMaxPitch
RotateEntity(Camera, CamPitch, CamYaw, 0)

Где
CamMaxPitch - максимальный угол поворота камеры по X
MouseYSens# - чувствительность мыши по Y, от 0 до 1
MouseXSens# - чувствительность мыши по X, от 0 до 1

moka 14.12.2007 15:31

Re: Ограничение наклона камеры в FPS
 
Угу, варриант Cyan'а имхо тут самый лучший, ни проскоков, контролируешь сенсивити и все прилогающиеся плюсы, только вот можно было избавиться от переменной CamYaw, хотя наверное с ней будет варриант чуток пошустрее.

А это:
Код:

If (CamPitch >  CamMaxPitch) Then CamPitch =  CamMaxPitch
If (CamPitch < -CamMaxPitch) Then CamPitch = -CamMaxPitch

Можно заменить так:
Код:

If abs(CamPitch)>CamMaxPitch CamPitch=CamMaxPitch*Sgn(CamPitch)

Maxxx.!!!. 14.12.2007 15:44

Re: Ограничение наклона камеры в FPS
 
Что-то не работают эти варианты. Может я туплю (наверно, точно туплю :"( ). Вот мой код для движения игрока:

CAM -камера, PL - игрок
u# - ограничение наклона

u#=80;
TurnEntity CAM,MouseYSpeed(),0,0
TurnEntity PL,0,-MouseXSpeed(),0

If KeyDown(17) Then MoveEntity Pl,0,0,0.2
If KeyDown(31) Then MoveEntity Pl,0,0,-0.2
If KeyDown(30) Then MoveEntity Pl,-0.2,0,0
If KeyDown(32) Then MoveEntity Pl,0.2,0,0

MoveMouse 1024/2,768/2
mx=MouseXSpeed ()*0.5
my=MouseYSpeed ()*0.5

MoveMouse GraphicsWidth()*0.5,GraphicsHeight()*0.5
If Abs(EntityPitch#(CAM))=>u# RotateEntity CAM,u#*Sgn(EntityPitch#(CAM)),0,0
If EntityPitch#(Cam)>80 Then RotateEntity CAM,79.9,0,0
If EntityPitch#(Cam)<-80 Then RotateEntity CAM,-79.9,0,0


Как бы сюда это вставить, чтобы работало. А то я подставлял, и он вообще по оси X не крутился.

moka 14.12.2007 15:49

Re: Ограничение наклона камеры в FPS
 
Не мудри, почитай и поймёшь принцип, а дальше сам под своё закодишь.

Maxxx.!!!. 14.12.2007 15:59

Re: Ограничение наклона камеры в FPS
 
Цитата:

Сообщение от MoKa
Не мудри, почитай и поймёшь принцип, а дальше сам под своё закодишь.

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

newman 14.12.2007 16:02

Re: Ограничение наклона камеры в FPS
 
У меня вот так.Просто вставь это в цикл.

u#=70
my#=MouseYSpeed()
mx#=MouseXSpeed()
TurnEntity cam,my/8,0,0
TurnEntity player,0,-mx/8,0
MoveMouse GraphicsWidth()*0.1,GraphicsHeight()*0.1
If Abs(EntityPitch#(cam))>u# RotateEntity cam,u#*Sgn(EntityPitch#(cam)),0,0

moka 14.12.2007 16:58

Re: Ограничение наклона камеры в FPS
 
Maxxx.!!!., потому что у тебя юзаеться сразу достование градуса, а при применении граздуса на него применяеться Angle Mod 360, поэтому. А переменная это объодит, т.к. мы сперва проверяем переменную.

johnk 14.12.2007 17:08

Re: Ограничение наклона камеры в FPS
 
Жжоте чуваки. Смотрите пятый пост - http://www.boolean.name/showpost.php...11&postcount=5 и не позорьтесь более.

FrankH 15.12.2007 00:16

Re: Ограничение наклона камеры в FPS
 
Разница в кодах только во внешнем виде и использовании Turn'а, из-за него и "проскакивание", когда скорость мыши большая. Я ограничил скорость мыши, но логичнее наверное юзать RotateEntity для поворотов.
JohnK, не позорнее постить прямо из семплов?

johnk 15.12.2007 09:03

Re: Ограничение наклона камеры в FPS
 
Цитата:

JohnK, не позорнее постить прямо из семплов?
LOL?
Я про то, что уже был дан идеальный вариант в пятом посте. И о том, что не надо что-то еще придумывать, а то пошли уже трюки всякие. :-D

moka 15.12.2007 11:22

Re: Ограничение наклона камеры в FPS
 
JohnK, насчёт идеальности несоглашусь, к нему будет посложнее прикрутить сглаживание, чем к другому.

Maxxx.!!!. 15.12.2007 15:39

Re: Ограничение наклона камеры в FPS
 
CamYaw# = CamYaw + MouseXSpeed() * MouseXSens#
If (CamYaw > 359) Then CamYaw = CamYaw - 360
If (CamYaw < 0) Then CamYaw = CamYaw + 360
CamPitch# = CamPitch - MouseYSpeed() * MouseYSens#
If (CamPitch > CamMaxPitch) Then CamPitch = CamMaxPitch
If (CamPitch < -CamMaxPitch) Then CamPitch = -CamMaxPitch
RotateEntity(Camera, CamPitch, CamYaw, 0)


У меня этот вариант не работает. Совсем.

moka 15.12.2007 16:04

Re: Ограничение наклона камеры в FPS
 
Maxxx.!!!., действия производишь в функции? Заглобалил переменные?

johnk 16.12.2007 12:04

Re: Ограничение наклона камеры в FPS
 
Цитата:

У меня этот вариант не работает. Совсем.
Быть такого не может. Прочти туторы по основам программирования, те что в справке блица.

Maxxx.!!!. 16.12.2007 16:48

Re: Ограничение наклона камеры в FPS
 
Цитата:

Сообщение от MoKa
Maxxx.!!!., действия производишь в функции? Заглобалил переменные?

Да. Я все это сделал. Все равно не пашет. Наверное, где-то ступил. Придумал свой вариант, вроде работает. На этом и успокоился.

)DEM( 18.12.2007 22:39

Re: Ограничение наклона камеры в FPS
 
Коипируешь это в самый конец проги, аж после слова енд, ваще в самый самый конец :)
Цитата:

Function updateMouse()

mxs=MouseXSpeed()
mys=MouseYSpeed()

dest_cam_yaw#=dest_cam_yaw#-mxs
dest_cam_pitch#=dest_cam_pitch#+mys
cam_yaw=cam_yaw+((dest_cam_yaw-cam_yaw)/5)
cam_pitch=cam_pitch+((dest_cam_pitch-cam_pitch)/5)

If cam_pitch>450 cam_pitch=450
If cam_pitch<-450 cam_pitch=-450


RotateEntity camera,cam_pitch#/8,cam_yaw#/8,0
MoveMouse (GraphicsWidth() Shr 1),(GraphicsHeight() Shr 1)

End Function



В цыкле програмы напиши

Цитата:

updatemouse()

Вот эта самая лучшая, и всегда работает как надо :) без единого глюка
Плавно, а главное камера управляется как раз так как надо для фпс :)
ток не забудь все переменые обьявить) а то скажешь не пашет)))
Забыл добавить ,может ты не знаешь, все переменые что сдесь в функции есть в том числе и камеру обьяви как глобальные.
Ум... ладно :)
вставь еще вот это в начале проги, (не в цыкле)
Цитата:

Global camera=CreateCamera()
Global cam_x#,cam_z#,cam_pitch#,cam_yaw#
Global dest_cam_x#,dest_cam_z#,dest_cam_pitch#
Global dest_cam_yaw#

butcher 28.12.2007 00:58

Re: Ограничение наклона камеры в FPS
 
Недавно шутир писал! У меня вот такая функция получилась:
Цитата:

Function AngleCameraView( Bnumb#, Nnumb#, Mnumb#)
If ( Nnumb# > 0 )Or( Nnumb# = 0 )
MNnumb# = Mnumb# - Nnumb#
If Bnumb# > 0
If Bnumb# < MNnumb# Return Bnumb#
If Bnumb# > MNnumb# Return MNnumb#
EndIf
If Bnumb# < 0 Return Bnumb#
EndIf
If Nnumb# < 0
MNnumb# = -Mnumb# + Nnumb#*-1
If Bnumb# < 0
If Bnumb# > MNnumb# Return Bnumb#
If Bnumb# < MNnumb# Return MNnumb#
EndIf
If Bnumb# > 0 Return Bnumb#
EndIf
End Function
Использовать так:
Цитата:

перм.Pitch# = перм.Pitch#+AngleCameraView(MouseYSpeed(),дейст.уг л(перм.Pitch#),верт.макс.угол)
P.S : только для Pitch!!!

butcher 28.12.2007 01:01

Re: Ограничение наклона камеры в FPS
 
Если непонятно, то вот отрывок из игры:
Цитата:

PLCPitch# =
PLCPitch# + AngleCameraView(MouseYSpeed()*Sensitivity#,PLCPitc h#,80.0)
PLCYaw# = PLCYaw# + MouseXSpeed()*Sensitivity#
If (PLCYaw# < 0) Then PLCYaw# = 360
If (PLCYaw# > 360)Then PLCYaw# = 0
RotateEntity(PLCamera,PLCPitch#,-PLCYaw#,0,0)
RotateEntity(PLCModel,0,-PLCYaw#,0)


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

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