您当前的位置:首页 VR开发 Unity 正文

Unity3d中简单实现物体旋转缩放移动

查看: 5612| 评论: 0 2016-12-21 05:09 PM| 发布者: PeckBang |来自: CSDN


由于项目运行在安卓上,运用到了插件,比较麻烦。你们可以在触发条件上进行修改,不用插件也可以。

1.下载FingerGestures 插件 下载地址:链接:http://pan.baidu.com/s/1hsLqpBe 密码:qwnl


2.导入插件,创建场景 将预设Finger Gestures Initializer 拖拽到 Hierarchy 视图中


3。添加脚本,拖拽到摄像机上。创建一个方块拖拽到脚本target 属性上。


[代码]:

using UnityEngine;  
using System.Collections;  
  
public class ObjectControl : MonoBehaviour  
{  
    public Transform target;  
    public float yawSensitivity = 80.0f;  
    public float pitchSensitivity = 160.0f;  
    public bool clampPitchAngle = true;  
    public float pinchZoomSensitivity = 0.5f;//缩放速度  
    public float smoothZoomSpeed = 10.0f;  
    public float smoothOrbitSpeed = 20.0f;  
    public float distance = 0;  
  
    float yaw = 0;  
    float pitch = 0;  
    float idealYaw = 0;  
    float idealPitch = 0;  
    float fChangeScale = 0;  
    float fChangeideal = 0;  
    public Transform[] movementP;  
  
    ///   
    /// 控制模式枚举  
    ///   
    public enum ControlModel  
    {  
        Zoom, Rotate, Translate  
    }  
  
    public ControlModel controlModel = ControlModel.Rotate;  
  
    //Vector3 position=new Vector3();  
    public bool bArrive = false;//鼠标是否到达零件箱边界区域  
    //平移方式是否根据鼠标拖动距离还是直接置为鼠标位置  
    public bool ifDragMove = false;  
    //平移方式为:根据鼠标拖动距离 时,评议的速度  
    public float moveSpeed = 1.0f;  
    //是够需要画出按钮(缩放、旋转、平移)  
    public bool ifDrawBtn = true;  
    //缩放方式改为:改变相机范围  
    public bool zoomCamera = false;  
    //zoomCamera = true ,相机的最小范围值  
    public float minZoom = 0f;  
    //zoomCamera = true ,相机的最大范围值  
    public float maxZoom = 179f;  
    //平移对象  
    public Transform moveTarget;  
    //平移对象的初始位置  
    Vector3 moveTargetPos;  
    //模型的直接父对象  
    public Transform parentModel;  
    Vector3 parentModelPos;  
  
    void Start()  
    {  
        zoomCamera = true;  
    }  
  
    void OnEnable()  
    {  
  
        FingerGestures.OnDragMove += FingerGestures_OnDragMove;  
        FingerGestures.OnPinchMove += FingerGestures_OnPinchMove;  
        FingerGestures.OnFingerDragEnd += OnFingerDragEnd;  
  
    }  
  
    void OnDisable()  
    {  
        FingerGestures.OnDragMove -= FingerGestures_OnDragMove;  
        FingerGestures.OnPinchMove -= FingerGestures_OnPinchMove;  
        FingerGestures.OnFingerDragEnd -= OnFingerDragEnd;  
    }  
  
    public void setRotation()  
    {  
        Vector3 angles = target.eulerAngles;  
        yaw = idealYaw = angles.y;  
        pitch = idealPitch = angles.x;  
    }  
  
    void FingerGestures_OnDragMove(Vector2 fingerPos, Vector2 delta)  
    {  
        onDrag = true;  
        try  
        {  
            Screen.showCursor = false;  
        }  
        catch  
        {  
            Screen.showCursor = false;  
        }  
        if (controlModel == ControlModel.Rotate && !bArrive)  
        {  
            idealYaw -= delta.x * yawSensitivity * 0.02f;  
            idealPitch += delta.y * pitchSensitivity * 0.02f;  
            len = delta;  
            if (target) target.transform.Rotate(new Vector3(delta.y, -delta.x, 0), Space.World);  
        }  
        if (controlModel == ControlModel.Translate && !bArrive)  
        {  
            if (ifDragMove)  
            {  
                if (moveTarget == null)  
                {  
                    target.position = new Vector3(target.position.x + delta.x * moveSpeed, target.position.y + delta.y * moveSpeed, target.localPosition.z);// GetWorldPos( fingerPos );  
                }  
                else  
                {  
                    moveTarget.position = new Vector3(moveTarget.position.x + delta.x * moveSpeed, moveTarget.position.y + delta.y * moveSpeed, moveTarget.localPosition.z);  
                }  
            }  
            else  
            {  
                if (moveTarget == null)  
                {  
                    target.position = GetWorldPos(fingerPos);  
                }  
                else  
                {  
                    moveTarget.position = GetWorldPos(fingerPos);  
                }  
            }  
        }  
  
    }  
  
    void FingerGestures_OnPinchMove(Vector2 fingerPos1, Vector2 fingerPos2, float delta)  
    {  
  
        if (controlModel == ControlModel.Zoom && !bArrive)  
        {  
            if (zoomCamera)  
            {  
                float fZoom = camera.fieldOfView - delta * pinchZoomSensitivity * 800 * Time.deltaTime;  
                fZoom = Mathf.Min(fZoom, maxZoom);  
                fZoom = Mathf.Max(fZoom, minZoom);  
                camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, fZoom, Time.deltaTime * smoothZoomSpeed);  
                // camera.transform.position = target.position - fZoom * camera.transform.forward;  
            }  
            else  
            {  
  
                fChangeScale = target.localScale.x + delta * pinchZoomSensitivity;  
  
                Vector3 vc = new Vector3(fChangeScale, fChangeScale, fChangeScale);  
            }  
        }  
    }  
    //滑动结束  
    void OnFingerDragEnd(int fingerIndex, Vector2 fingerPos)  
    {  
        Screen.showCursor = true;  
  
        onDrag = false;  
    }  
  
  
    //把Unity屏幕坐标换算成3D坐标  
    Vector3 GetWorldPos(Vector2 screenPos)  
    {  
        // Camera mainCamera = Camera.main;  
        Camera mainCamera = GameObject.FindGameObjectWithTag("MainCamera").GetComponent();  
        if (!mainCamera.enabled)  
        {  
            mainCamera = mainCamera.transform.parent.FindChild("CameraOne").GetComponent();  
        }  
        return mainCamera.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, Mathf.Abs(target.position.z - mainCamera.transform.position.z)));  
    }  
  
    void Apply()  
    {  
        if (controlModel == ControlModel.Rotate && !bArrive)  
        {  
            yaw = Mathf.Lerp(yaw, idealYaw, Time.deltaTime * smoothOrbitSpeed);  
            pitch = Mathf.Lerp(pitch, idealPitch, Time.deltaTime * smoothOrbitSpeed);  
        }  
    }  
    bool onDrag;  
    Vector2 len;  
  
    void LateUpdate()  
    {  
        if (Input.GetMouseButtonUp(1) || Input.GetMouseButtonUp(0))  
        {  
            Screen.showCursor = true;  
        }  
        Apply();  
    }  
  
    static float ClampAngle(float angle, float min, float max)  
    {  
        if (angle < -360)  
            angle += 360;  
  
        if (angle > 360)  
            angle -= 360;  
  
        return Mathf.Clamp(angle, min, max);  
    }  
  
    void Update()  
    {  
        ///自由切换  
  
        if (Input.GetMouseButtonDown(0))  
        {  
  
            controlModel = ControlModel.Translate;  
        }  
  
        if (Input.GetMouseButtonDown(1))  
        {  
  
            controlModel = ControlModel.Rotate;  
        }  
  
        if (Input.GetAxis("Mouse ScrollWheel") != 0)  
        {  
            controlModel = ControlModel.Zoom;  
        }  
  
    }  
  
    ///   
    /// 复位  
    ///   
    public void ResetValue()  
    {  
        if (moveTarget != null)  
        {  
            moveTarget.localPosition = moveTargetPos;  
        }  
        if (parentModel != null)  
        {  
            parentModel.localPosition = parentModelPos;  
        }  
        yaw = 0;  
        pitch = 0;  
        idealYaw = 0;  
        idealPitch = 0;  
    }  
  
}  

52VR.COM微信扫一扫
52vr公众号
专注于VR的学习、开发和人才交流

52VR开发交流

相关推荐

已有 0 人参与

发表评论

您需要登录才可以回帖 登录 | 立即注册

手机版|VR开发网 ( 津ICP备18009691号 ) 统计 网安备12019202000257

GMT+8, 2020-9-20 08:49 AM

返回顶部