总结圣典中操作物体任意方向旋转的三种方法

方法一:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private  Transform hitTransfrom;
           
void  Update()
{
     if  (Input.GetMouseButtonDown(0))
     {
         RaycastHit hit;
         Ray mouseray = Camera.main.ScreenPointToRay(Input.mousePosition);
         if  (Physics.Raycast(mouseray,  out  hit))
         {
             hitTransfrom = hit.transform;
         }
     }
     else  if  (Input.GetMouseButtonUp(0))
     {
         hitTransfrom =  null ;
     }
     if  (hitTransfrom)
     {
         Matrix4x4 localmatrix = hitTransfrom.worldToLocalMatrix;
         Vector3 vUp = localmatrix.MultiplyVector( new  Vector3(0, 1, 0));
         Vector3 vRight = -localmatrix.MultiplyVector( new  Vector3(1, 0, 0));
         float  fMoveX = -Input.GetAxis( "Mouse X" ) * Time.deltaTime * 200.0f;
         Quaternion rotation = Quaternion.AngleAxis(fMoveX, vUp);
         hitTransfrom.localRotation *= rotation;
         float  fMoveY = -Input.GetAxis( "Mouse Y" ) * Time.deltaTime * 200.0f;
         Quaternion rotoy = Quaternion.AngleAxis(fMoveY, vRight);
         hitTransfrom.localRotation *= rotoy;
     }
}
方法二: 

复制代码
1
2
3
4
5
6
7
8
9
10
11
using  UnityEngine;
using  System.Collections;
         
public  class  DragRotate : MonoBehaviour
{
     void  OnMouseDrag ()
     {
         this .transform.Rotate( new  Vector3(Input.GetAxis( "Mouse Y" ),-Input.GetAxis( "Mouse X" ),0)*6f,Space.World);
     }
         
}



方法三(带惯性的拖拽): 



复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using  UnityEngine;
using  System.Collections;
     
public  class  DragRotate : MonoBehaviour
{
     private  bool  onDrag =  false ;
     public  float  speed = 6f;
     private  float  tempSpeed;
     private  float  axisX;
     private  float  axisY;
     void  OnMouseDrag ()
     {
         onDrag =  true ;
         axisX=-Input.GetAxis ( "Mouse X" );
         axisY=Input.GetAxis ( "Mouse Y" );
     }
         
     float  Rigid ()
     {
         if  (onDrag) {
             if  (tempSpeed < speed) {
                 tempSpeed += speed * Time.deltaTime*5;
             } else {
                 tempSpeed=speed;
             }
         else  {
             if (tempSpeed>0){
                 tempSpeed-=speed * Time.deltaTime;
             } else {
                 tempSpeed = 0;
             }
         }
         return  tempSpeed;
     }
         
     void  Update ()
     {
         this .transform.Rotate ( new  Vector3 (axisY, axisX, 0) * Rigid (), Space.World);
         if  (!Input.GetMouseButton (0)) {
             onDrag =  false ;
         }
     }
}

原文地址来源: http://game.ceeger.com/forum/read.php?tid=10004&fid=2  


另外加入了缩放的代码,缩放、自动旋转、拖拽物体的综合: 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using  UnityEngine;
using  System.Collections;
  
  
/**
   
  * @Function:使物体自动旋转,鼠标能够360°拖转物体,托转物体的时候,自动旋转停止,同时滚轮实现物体的缩放功能
  * @Ahthor:黄杰
  * @Date:2013-04-24
   
  */
public  class  ZoomAndDrag : MonoBehaviour {
  
  
     public  Camera MainCamera;
     public  float  ZoomMin;       //滚轮的最小值
     public   float  ZoomMax;       //滚轮的最大值
     private  float  normalDistance;    //设置摄像机的景深值
     private  float  MouseWheelSencitivity = 10.0f;     //鼠标灵敏度,就是缩放的速度的快慢
  
     private  float  axisX;
     private  float  axisY;
     public  float  speed = 6f;
     private  float  tempSpeed;
  
     private  bool  RoationOnly;
  
     void  Start ()
     {
         normalDistance = 50.0f;
         ZoomMin = 20.0f;
         ZoomMax = 100.0f;
         RoationOnly =  true ;
     }
      
      
     void  Update ()
     {
         Roation();
         Zoom();
         this .transform.Rotate( new  Vector3(axisY, axisX, 0) * Rigid(), Space.World);      //物体旋转的方法
     }
  
  
     //自动旋转物体的方法,放在Update中调用
     void  Roation()
     {
         if  (RoationOnly)
         {
             gameObject.transform.Rotate(Vector3.up * Time.deltaTime * 10);
         }
     }
  
     /****
     *鼠标滚轮缩放物体的方法
      *
      * **/
     void  Zoom()
     {
         if  (Input.GetAxis( "Mouse ScrollWheel" ) != 0)
         {
             if  (normalDistance >= ZoomMin && normalDistance <= ZoomMax)
             {
                 normalDistance -= Input.GetAxis( "Mouse ScrollWheel" ) * MouseWheelSencitivity;
             }
             if  (normalDistance < ZoomMin)
             {
                 normalDistance = ZoomMin;
             }
             if  (normalDistance > ZoomMax)
             {
                 normalDistance = ZoomMax;
             }
  
             MainCamera.fieldOfView = normalDistance;
         }
     }
   /***
    *
    * 鼠标左键控制物体360°旋转+惯性
    * **/
     float  Rigid()
     {
         if  (Input.GetMouseButton(0))
         {
             RoationOnly =  false ;     //当鼠标按下的时候,停止自动旋转
  
             axisX = Input.GetAxis( "Mouse X" );
             axisY = Input.GetAxis( "Mouse Y" );
             if  (tempSpeed < speed)
             {
                 tempSpeed += speed * Time.deltaTime * 5;
             }
             else
             {
                 tempSpeed = speed;
             }
         }
         else
         {
             RoationOnly =  true ;      //当鼠标没有按下的时候,恢复自动旋转
             if  (tempSpeed > 0)
             {
                 tempSpeed -= speed * Time.deltaTime;
             }
             else
             {
                 tempSpeed = 0;
             }
         }
         return  tempSpeed;
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值