Устанавливаешь пивот на уровне головы игрока
Камеру ставишь позади игрока и крепишь к пивоту
Сам алгоритм такой:
Вычисляешь углы поворота для пивота камеры:
;Накапливаем углы через скорость перемещения мыши
;Уменьшаем скорость мыши умножением на коэффициент меньше единицы
ПоворотПоY = ПоворотПоY + MouseXSpeed() * ЧувствительностьМыши
ПоворотПоX = ПоворотПоX + MouseYSpeed() * ЧувствительностьМыши
;Сдвигаем мышь в центр экрана для того чтобы указатель мыши не
;достиг края экрана, иначе мышь остановится и скорость измерятся
;не будет соотвественно :)
MoveMouse(ПоловинаШириныЭкрана, ПоловинаВысотыЭкрана)
;Ограничиваем "переполнение" переменных и заодно устанавливаем макс. обзор камеры.
If (ПоворотПоY > 360) Then ПоворотПоY = 0
If (ПоворотПоY < 0) Then ПоворотПоY = 360
If (ПоворотПоX > 55) Then ПоворотПоX = 55
If (ПоворотПоX < -35) Then ПоворотПоX = -35
;Поворачиваем пивот камеры по вычисленным углам
RotateEntity(ПивотКамеры, ПоворотПоX, ПоворотПоY, 0)
Макс. обзор (вверх\вниз) можно сделать другим, но этот по-моему наиболее соотвествует "ГТАшному"
Далее нужно сделать движение игрока
If MouseDown(2) Then
;Сдвигаем тело игрока вперед
MoveEntity(ТелоИгрока, 0, 0, СкоростьПеремещения)
;Узнаем координаты тела игрока
ТелоИгрокаX = EntityX(ТелоИгрока)
ТелоИгрокаY = EntityY(ТелоИгрока)
ТелоИгрокаZ = EntityZ(ТелоИгрока)
;Позиционируем пивот камеры на место тела игрока (точнее его головы)
;в данном случае высота игрока 2 метра :) поэтому сдвигаем пивот от
;центра тела игрока вверх на 2 единицы
PositionEntity(ПивотКамеры, ТелоИгрокаX, ТелоИгрокаY + 2, ТелоИгрокаZ)
;Проверяем разницу углов поворота тела игрока и пивота камеры
;Таким образом определяем скорость направления тела игрока
;на направление камеры - если игрок только начинает движение и
;камера направлена в сторону, то игрок будет направляться медленно,
;иначе - быстро
;Оператор Int нужен чтобы отбросить дробную часть полученого
;значения для "сглаживания" погрешности
If Int(EntityYaw(ТелоИгрока) - EntityYaw(ПивотКамеры)) = 0 Then
СкоростьНаправления = 1
EndIf
;Направляем тело игрока по вектору Игрок-Камера, т.е. по направлению
;камеры, с заданной скоростью
;Но т.к. камера находится сзади, то вектор вычисляем не от игрока к
;камере, а наоборот от камеры к игроку
AlignToVector(ТелоИгрока, ТелоИгрокаX - EntityX(Камера, 1), 0, ТелоИгрокаZ - EntityZ(Камера, 1), 3, СкоростьНаправления)
Else
;Если игрок не перемещается - ставим небольшую скорость
;направления, чтобы в начале перемещения игрок направлялся плавно
СкоростьНаправления = 0.1
EndIf
Вот собственно и все, надеюсь поймешь
Смотри аттач с исходником, но там комментариев нет.
ЗЫ
А чего у вас со смайликами?