首页 > 解决方案 > UNITY - 摄像机轨道,将摄像机移动到一些固定位置

问题描述

我有一个场景,其中我有一个围绕 180° 半球中的枢轴旋转的相机。一切都按预期工作,但现在我想将相机指向半球的一些固定坐标(可能以平滑的方式)。有人可以给我一些提示吗?我将发布我现在正在使用的代码。

 public class CameraOrbitTouch : MonoBehaviour {


 protected Transform _XForm_Camera;
 protected Transform _XForm_Parent;

 protected Vector3 _LocalRotation;
 protected float _CameraDistance = 10f;

 // The rate of change of the field of view in perspective mode.
 public float perspectiveZoomSpeed = 0.2f;    

 public float OrbitDampening = 30f;
 public float ScrollDampening = 18f;

 public bool CameraDisabled = false;
 public bool moving = false;


 // Use this for initialization
 void Start() {
     this._XForm_Camera = this.transform;
     this._XForm_Parent = this.transform.parent;
 }


 void LateUpdate() {
     if (Input.GetKeyDown(KeyCode.LeftShift))
         CameraDisabled = !CameraDisabled;

     if (!CameraDisabled)
     {
         //Rotation of the Camera based on Mouse Coordinates
         if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
         {
             moving = true;
             _LocalRotation.x += Input.touches[0].deltaPosition.x ;
             _LocalRotation.y += Input.touches[0].deltaPosition.y;

             //Clamp the y Rotation to horizon and not flipping over at the top
             if (_LocalRotation.y < 0f)
                 _LocalRotation.y = 0f;
             else if (_LocalRotation.y > 90f)
                 _LocalRotation.y = 90f;


         }

         //Zooming Input from our Mouse Scroll Wheel
         if ((Input.touchCount == 2)&& (Input.GetTouch(0).phase == TouchPhase.Moved) && (Input.GetTouch(1).phase == TouchPhase.Moved))
         {
             moving = true;
             // Store both touches.
             Touch touchZero = Input.GetTouch(0);
             Touch touchOne = Input.GetTouch(1);

             // Find the position in the previous frame of each touch.
             Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
             Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition;

             // Find the magnitude of the vector (the distance) between the touches in each frame.
             float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
             float touchDeltaMag = (touchZero.position - touchOne.position).magnitude;

             // Find the difference in the distances between each frame.
             float deltaMagnitudeDiff = (prevTouchDeltaMag - touchDeltaMag);

             //this._CameraDistance += deltaMagnitudeDiff * -1f;
             this._CameraDistance += deltaMagnitudeDiff * perspectiveZoomSpeed;
             this._CameraDistance = Mathf.Clamp(this._CameraDistance, 1.5f, 100f);
         }
     }

     if (moving)
     {
         //Actual Camera Rig Transformations
         Quaternion QT = Quaternion.Euler(_LocalRotation.y, _LocalRotation.x, 0);
         this._XForm_Parent.rotation = Quaternion.Lerp(this._XForm_Parent.rotation, QT, Time.deltaTime * OrbitDampening);

         if (this._XForm_Camera.localPosition.z != this._CameraDistance * -1f)
         {
             this._XForm_Camera.localPosition = new Vector3(0f, 0f,Mathf.Lerp(this._XForm_Camera.localPosition.z, this._CameraDistance * -1f, Time.deltaTime * ScrollDampening));
         }
         moving = false;
     }
 }

}

我觉得我可以用这样的东西

 string selectedObj = "CameraPivot";
 camera = GameObject.Find(selectedObj);
 camera.transform.rotation = Quaternion.Euler(90.0f, 0.0f, 100.0f);

但我认为不是让它发挥作用的正确方法......

标签: c#unity3d

解决方案


推荐阅读