Камера от третьего лица как во Freelancer

Программирование на Юнити.

Камера от третьего лица как во Freelancer

Сообщение MetosFate 05 янв 2010, 21:59

Делаю камеру как во Freelancer.
Камера вращается вокруг точки на оси истребителя (z)(Player в проекте). Угловая скорость вращения истребителя равна скорости вращения камеры и зависит напрямую от смещения курсора мыши от центра экрана(x,y). Истребитель(Ship) также ещё отклоняется на угол, который напрямую зависит от смещения мыши относительно центра экрана(dx,dy). (Чтобы не закрывать обзор при манёврах.)
Для этого я модифицировал OrbitCamera.js
Код: Выделить всё
function LateUpdate () {
    if (target) {
   
      x=(Input.mousePosition.x-Screen.width*0.5)*0.1;
      y=(Input.mousePosition.y-Screen.height*0.5)*0.1;
      
      dx=(x-xold)*0.6;
      dy=(y-yold)*0.6;
     
      
      transform.Rotate(dy*Vector3.right -dx*Vector3.up+(-y*Vector3.right+x*Vector3.up)* Time.deltaTime);
      
      xold=x;
      yold=y;
      
         var rotation = transform.rotation;
        var targetPos = target.position;// + targetOffset;
        var direction = rotation* -Vector3.forward;
      
        var targetDistance = AdjustLineOfSight(targetPos, direction);
      
      
      currentDistance = Mathf.SmoothDamp(currentDistance, targetDistance, distanceVelocity, closerSnapLag * .3);
       
       
        transform.position = targetPos + direction * currentDistance;
    }
}

и playerController.js здесь я вращаю сам корабль

Код: Выделить всё
function FixedUpdate() {
   
   if (isControllable) {   
      
      xx=(Input.mousePosition.x-Screen.width*0.5)*0.1;
      yy=(Input.mousePosition.y-Screen.height*0.5)*0.1;
      
      xxc=xx;
      yyc=yy;
      
      GameObject.Find("Ship").transform.Rotate(-yy*Vector3.right * Time.deltaTime);
      GameObject.Find("Ship").transform.Rotate(xx*Vector3.up * Time.deltaTime);
      transform.RotateAround(GameObject.Find("Ship").transform.position,GameObject.Find("Ship").transform.TransformDirection(Vector3.right),-yy*Time.deltaTime);
      transform.RotateAround(GameObject.Find("Ship").transform.position,GameObject.Find("Ship").transform.TransformDirection(Vector3.up),xx*Time.deltaTime);
      
   }
}

Это сработало, получилось как во freelancer.
Но возникла проблема. Когда я вращаю мышь вокруг центра экрана много раз, создаётся впечатление, у камеры появляется крен, а корабль уходит из поля зрения. Поиогите пожалуйста!! Постараюсь загрузить исходник на ftp.
Добавить masterofself в Skype
Стена это таже ступенька, просто надо вырасти, чтобы это увидеть...
Аватара пользователя
MetosFate
UNIт
 
Сообщения: 76
Зарегистрирован: 05 янв 2010, 21:14
Откуда: Нижний Новгород

Re: Камера от третьего лица как во Freelancer

Сообщение MetosFate 05 янв 2010, 23:04

На FTP чё-то не получилось залить. Вошёл как anonimus. SmartFTP пишет Could not get file size. Поэтому залил на deposit. http://depositfiles.com/files/5twp80fs4
Добавить masterofself в Skype
Стена это таже ступенька, просто надо вырасти, чтобы это увидеть...
Аватара пользователя
MetosFate
UNIт
 
Сообщения: 76
Зарегистрирован: 05 янв 2010, 21:14
Откуда: Нижний Новгород

Re: Камера от третьего лица как во Freelancer

Сообщение Kann 08 янв 2010, 19:43

странный код..... зачем в FixedUpdate каждый раз используете GameObject.Find ??? 8()
у вас скорей всего есть физика на том обьекте который пытаетесь вращять ? из за этого скорей всего и глюки....
да и вообще для управления аля фрилансер по моему лучше модифицировать скрипт самеры SmoothFollow и кораблик с физикой толкать и крутить через Rigidbody.AddForce,Rigidbody.AddTorque, или отключайте физику IsKinematic = true
демосцена которую залили за депозит кривая, собирать ее нет времени.... используйте пакеты юнити в следуюший раз...
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Камера от третьего лица как во Freelancer

Сообщение MetosFate 08 янв 2010, 21:23

Спасибо за ответ. Все материалы по юнити, что смог найти, изучил. Форум перечитал раза два. :-B Код написал максимально тупо, потому что уже отчаялся по-разному пробовать. X( Вроде всё просто, а не работает. Вариант с применением сил и моментов был изначальным. Именно из-за того что он не прокатил, переписал всё на кинематику. Также распарентил всё что мог и стал использовать RotateAround и присвоение напрямую. Даже составил лог. Проблема прояcнилась... Камера вращается вокруг z. Хотя в коде я использую только вращение вокруг x и y. Откуда берётся z ищу. Выложу выпрямленный код. :-?
Добавить masterofself в Skype
Стена это таже ступенька, просто надо вырасти, чтобы это увидеть...
Аватара пользователя
MetosFate
UNIт
 
Сообщения: 76
Зарегистрирован: 05 янв 2010, 21:14
Откуда: Нижний Новгород

Re: Камера от третьего лица как во Freelancer

Сообщение Kann 08 янв 2010, 21:46

хмм... странно что с физикой не вышло.... вот примерчик.. может поможет...

скрипт камеры... не помню откуда я его взял.. по моему с вики....

Код: Выделить всё
var target : Transform;
var distance = 3.0;
var height = 3.0;
var damping = 5.0;
private var moveDirection = Vector3.zero;
var smoothRotation = true;
var rotationDamping = 10.0;
function LateUpdate () {
   var wantedPosition = target.TransformPoint(-15,height,-distance);
      transform.localPosition = Vector3.Lerp (transform.position, wantedPosition, damping*Time.deltaTime);

   if (smoothRotation) {
      var wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up);
      transform.localRotation = Quaternion.Slerp (transform.rotation, wantedRotation,  rotationDamping* Time.deltaTime);
   }

   else transform.LookAt (target, target.up);
}


а так примерно толкаем и крутим наш кораблик с физикой....
Код: Выделить всё
if(Input.GetAxis("Vertical")){

moveDirection = new Vector3(speed*Time.deltaTime, 0, 0);
      moveDirection = transform.TransformDirection(moveDirection);
   //   moveDirection.z =0;
      moveDirection *= speed;
Player.rigidbody.AddForce(moveDirection);

...........................................................
X = Input.GetAxis("Mouse X") * 100;
Y = Input.GetAxis("Mouse Y") * 100;
Player.rigidbody.AddRelativeTorque(Vector3(0,X,Y) );
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Камера от третьего лица как во Freelancer

Сообщение MetosFate 08 янв 2010, 22:12

Проблема решилась!! :ymparty: Единственный скрипт, который я даже не подозревал это LookAt. А там нужно было просто добавить target.up, чтобы камера разумно выбирала оси вращения. Ваши скрипты ещё не пробовал, уважаемый Kann, но именно скрипт из wiki и навёл меня на мысль посмотреть LookAt. Спасибо! :-bd
Добавить masterofself в Skype
Стена это таже ступенька, просто надо вырасти, чтобы это увидеть...
Аватара пользователя
MetosFate
UNIт
 
Сообщения: 76
Зарегистрирован: 05 янв 2010, 21:14
Откуда: Нижний Новгород


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2