не тестил, но вроде так должно работать.
;переводим кнопки->направление и заранее начинаем двигать перса (что не совсем правильно, но... наверное прокатит)
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