Unity 类似FingerGestures 的相机跟随功能

本文原创,转载请注明出处:http://www.cnblogs.com/AdvancePikachu/p/6555188.html

最近在做一款VR项目,有一个查看功能,分为自由查看和跟随查看。

自由查看:

第一人称自由控制查看。使用firstPersonControl即可。

跟随查看:

摄像机可自由旋转并跟随查看的物体移动(摄像机不可为子物体)。

刚开始使用固定坐标的方法,但摄像机无法自由旋转。后来换用rotatearound,可以自由旋转,可一旦物体移动,旋转半径会拉大。

最后,模仿手势插件写了一个方法,代码如下:

 1 public Transform target;
 2 
 3 
 4     public float minDistance = 1.5f;
 5     public float maxDistance = 10.0f;
 6 
 7     public float yawSensitivity =30f;
 8     public float pinchSensitivity = 5.0f;
 9 
10     public float smoothZoomSpeed = 30.0f;
11     public float smoothOrbitSpeed = 10.0f;
12 
13     float distance = 5.0f;
14     float yaw = 0;
15     float pitch = 0;
16 
17     float idealDistance = 0;
18 
19     bool rotate;
20 
21     public float IdealDistance
22     {
23         get { return idealDistance; }
24         set { idealDistance = Mathf.Clamp( value, minDistance, maxDistance ); }
25     }
26 
27     public float Yaw
28     {
29         get { return yaw; }
30     }
31 
32     void Start()
33     {
34         Vector3 angles = transform.eulerAngles;
35 
36         distance = IdealDistance = 5f;
37         yaw =  angles.y;
38         pitch = 25;
39 
40         UpdateCamera();
41     }
42 
43 
44     void Update()
45     {
46         if (Input.GetMouseButtonDown (1))
47             rotate = true;
48         if (Input.GetMouseButtonUp (1))
49             rotate = false;
50         
51         if( rotate )
52         {
53             yaw += Input.GetAxis ("Mouse X") * yawSensitivity;
54             pitch -=  Input.GetAxis ("Mouse Y") *pinchSensitivity;
55         }
56 
57         IdealDistance -= Mathf.Lerp (0, Input.GetAxis ("Mouse ScrollWheel") * smoothZoomSpeed, Time.deltaTime);
58         IdealDistance = Mathf.Clamp (IdealDistance, minDistance, maxDistance);
59     }
60 
61     void LateUpdate()
62     {
63         UpdateCamera ();
64     }
65 
66     void UpdateCamera()
67     {
68         distance = Mathf.Lerp (distance, IdealDistance, Time.deltaTime * smoothZoomSpeed);
69 
70         Vector3 lookAtPos = target.position;
71         Quaternion rotaetAngle = Quaternion.Euler (pitch, yaw, 0);
72 
73         Vector3 desiredPos = lookAtPos - rotaetAngle * new Vector3 (0, 0, distance);
74 
75         transform.position = desiredPos;
76         transform.rotation = rotaetAngle;
77 
78         transform.LookAt (target);
79     }
80 
81     static float ClampAngle( float angle, float min, float max )
82     {
83         if( angle < -360 )
84             angle += 360;
85 
86         if( angle > 360 )
87             angle -= 360;
88 
89         return Mathf.Clamp( angle, min, max );
90     }

 

以上,完美实现摄像机跟随,并可以右键旋转,滚轮拉近功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值