Показать сообщение отдельно
Старый 28.12.2010, 10:45   #17
Amatsu
Дэвелопер
 
Аватар для Amatsu
 
Регистрация: 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
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Amatsu за это полезное сообщение:
Arton (03.05.2019), Randomize (29.12.2010), St_AnGer (29.12.2010)