Страница 1 из 1

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

СообщениеДобавлено: 05 янв 2010, 21:59
MetosFate
Делаю камеру как во 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.

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

СообщениеДобавлено: 05 янв 2010, 23:04
MetosFate
На FTP чё-то не получилось залить. Вошёл как anonimus. SmartFTP пишет Could not get file size. Поэтому залил на deposit. http://depositfiles.com/files/5twp80fs4

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

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

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

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

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

СообщениеДобавлено: 08 янв 2010, 21:46
Kann
хмм... странно что с физикой не вышло.... вот примерчик.. может поможет...

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

Код: Выделить всё
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) );

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

СообщениеДобавлено: 08 янв 2010, 22:12
MetosFate
Проблема решилась!! :ymparty: Единственный скрипт, который я даже не подозревал это LookAt. А там нужно было просто добавить target.up, чтобы камера разумно выбирала оси вращения. Ваши скрипты ещё не пробовал, уважаемый Kann, но именно скрипт из wiki и навёл меня на мысль посмотреть LookAt. Спасибо! :-bd