Показать сообщение отдельно
Старый 21.11.2010, 18:19   #10
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Камера от MMORPG

не тестил, но вроде так должно работать.

;переводим кнопки->направление и заранее начинаем двигать перса (что не совсем правильно, но... наверное прокатит)
if keydown(200) movex#=0:movey#=0:movez#=1:moveentity char,0,0,1
if keydown(20 movex#=0:movey#=0:movez#=-1:moveentity char,0,0,1
if keydown(203) movex#=-1:movey#=0:movez#=0:moveentity char,0,0,1
if keydown(205) movex#=1:movey#=0:movez#=0:moveentity char,0,0,1

positionEntity characterShouldFollowIt, entityx#(char),entityy#(char),entityz#(char),1 ; здесь char это перс, а characterShouldFollowIt это пивот, который мы в каждом кадре ставим в его позицию

TFormNormal movex,movey,movez, Camera, characterShouldFollowIt ;переводим направление движения от камеры к пивоту

AlignToVector TFormedX#(),TFormedY#(),TFormedZ#(),3 ;ставим пивот так, чтобы он смотрел в направлении движения относительно камеры

; берём угол вращения по Y этого пивота
roty# = EntityYaw#(characterShouldFollowIt)
; интерполируем текущий поворот чела на пивотовский супер-функцией от Моки
roty# = MergeAngles#(EntityYaw#(char),roty#,.1)
; применяем
RotateEntity(char,EntityPitch(char),roty#,EntityRo ll#(char))


Function MergeAngles#(Angle1#,Angle2#,Morph#=.5)
If Abs(Angle1-Angle2)>180
If Angle1<Angle2
Return Angle1-((360-Angle2)+Angle1)*(.5-(Morph-.5))
Else
Return Angle2-((360-Angle1)+Angle2)*(.5+(Morph-.5))
EndIf
Else
Return Angle1*(Morph)+Angle2*(1.0-Morph)
EndIf
End Function
(Offline)
 
Ответить с цитированием