Дэвелопер
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений (для 2,706 пользователей)
|
Ответ: Камера от MMORPG
Хм... чтож вы меня не спросили, я как раз такую систему сделал в своей игре %) Если кому-то еще надо, набросал простенький пример

Graphics3D 1024,768,32,1
SeedRnd(MilliSecs())
;объявление необходимых переменных
Global mxs#,mys#,dest_xang#,dest_yang#,xang#,yang#,differ_yaw#,target_rot#
Global camera_target=CreatePivot()
Global dist_target=CreatePivot(camera_target)
Global move_navigator=CreatePivot(camera_target)
Global move_directional=CreatePivot()
;создание камеры
Global camera=CreateCamera()
CameraZoom camera,1.4
;создание сцены
Global light=CreateLight()
RotateEntity light,30,30,0
plane=CreatePlane()
EntityColor plane,100,150,255
EntityPickMode plane,2
For c=1 To 10
cube=CreateCube()
EntityColor cube,150,255,150
ScaleEntity cube,2,20,2
PositionEntity cube,Rand(-50,50),20,Rand(-50,50)
EntityPickMode cube,2
Next
;создание модели игрока
player=CreateCube()
EntityAlpha player,0.5
PositionEntity player,0,1,0
EntityColor player,255,0,0
While Not KeyHit(1)
MouseLook(player)
UpdateWorld()
RenderWorld()
Flip
Wend
End
;<<сама функция>>
;height - параметр указывает высоту над центром модели, куда "привязать" камеру. например если надо чтобы прицел был над головой игрока
;speed - скорость передвижения игрока
;rotate - скорость поворота модели игрока в сторону движения. желательно оставить 10
Function MouseLook(target,height=5,speed#=0.5,rotate#=10)
;ВНИМАНИЕ!!! нижеследующие 3 параметра можно менять, если хотите подредактировать "колизию" камеры с уровнем. но я не рекомендую их трогать - долго подбирал значения =)
;collision_radius - радиус луча, по которому проверяется наличие препятсвий между моделью игрока и камерой (команда LinePick)
;collision_distance - параметр смещает камеру (чем меньше значение, тем ближе будет приближаться камера) ближе к модели игрока в случае, если LinePick=true.
; помогает от "проваливания" камеры в стены
;camera_distance - расстояние от модели игрока до камеры в случае если LinePick=false
collision_radius#=0.5
collision_distance#=5
camera_distance=30
If target<>0 Then
PositionEntity move_navigator,0,0,0
If KeyDown(17) Then PositionEntity move_navigator,EntityX(move_navigator),0,0.1
If KeyDown(31) Then PositionEntity move_navigator,EntityX(move_navigator),0,-0.1
If KeyDown(30) Then PositionEntity move_navigator,-0.1,0,EntityZ(move_navigator)
If KeyDown(32) Then PositionEntity move_navigator,0.1,0,EntityZ(move_navigator)
PositionEntity move_directional,EntityX(target),EntityY(target)+height,EntityZ(target)
If EntityX(move_navigator)<>0 Or EntityZ(move_navigator)<>0 Then
PointEntity move_directional,move_navigator
If Abs(differ_yaw)<90 Then MoveEntity target,0,0,speed ;число 90 определяет угол между направлением движения и направлением модели, при котором модель начинает движение
EndIf
mxs=MouseX()-GraphicsWidth()/2
mys=MouseY()-GraphicsHeight()/2
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
mxs=mxs/5.5
mys=mys/5.5
If mxs>30 Then mxs=30
If mxs<-30 Then mxs=-30
If mys>30 Then mys=30
If mys<-30 Then mys=-30
dest_xang=dest_xang-mxs
dest_yang=dest_yang+mys
If dest_yang<-85 Then dest_yang=-85
If dest_yang>85 Then dest_yang=85
yang=(yang+(dest_yang-yang)/4)
xang=(xang+(dest_xang-xang)/4)
PositionEntity camera_target,EntityX(target),EntityY(target)+height,EntityZ(target)
RotateEntity camera_target,0,xang,0
PositionEntity dist_target,0,Sin(yang)*camera_distance,-Cos(yang)*camera_distance
vis_line_x#=EntityX(camera_target,1)
vis_line_y#=EntityY(camera_target,1)
vis_line_z#=EntityZ(camera_target,1)
vis_line_dx#=EntityX(dist_target,1)-EntityX(camera_target,1)
vis_line_dy#=EntityY(dist_target,1)-EntityY(camera_target,1)
vis_line_dz#=EntityZ(dist_target,1)-EntityZ(camera_target,1)
If LinePick(vis_line_x,vis_line_y,vis_line_z,vis_line_dx,vis_line_dy,vis_line_dz,collision_radius) Then
PositionEntity camera,PickedX#()-(PickedX#()-EntityX#(camera_target,1))/collision_distance,PickedY#()-(PickedY#()-EntityY#(camera_target,1))/collision_distance,PickedZ#()-(PickedZ#()-EntityZ#(camera_target,1))/collision_distance
Else
; PositionEntity camera,EntityX#(dist_target,1)-(EntityX#(dist_target,1)-EntityX#(camera_target,1))/collision_distance,EntityY#(dist_target,1)-(EntityY#(dist_target,1)-EntityY#(camera_target,1))/collision_distance,EntityZ#(dist_target,1)-(EntityZ#(dist_target,1)-EntityZ#(camera_target,1))/collision_distance
PositionEntity camera,EntityX#(dist_target,1),EntityY#(dist_target,1),EntityZ#(dist_target,1)
EndIf
PointEntity camera,camera_target
differ_yaw=EntityYaw(target)-EntityYaw(move_directional)
If differ_yaw>179.9999 Then differ_yaw=differ_yaw-359.9999
If differ_yaw<-179.9999 Then differ_yaw=359.9999+differ_yaw
If EntityX(move_navigator)<>0 Or EntityZ(move_navigator)<>0 Then
If differ_yaw>rotate Then
target_rot=target_rot-rotate
ElseIf differ_yaw<-rotate Then
target_rot=target_rot+rotate
ElseIf differ_yaw<rotate*3 And differ_yaw>-rotate*3 Then
target_rot=EntityYaw(move_directional,1)
EndIf
EndIf
RotateEntity target,0,target_rot,0
EndIf
End Function
|