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

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

1.下载FingerGestures 插件 下载地址 点击打开链接

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;

    /// <summary>
    /// 控制模式枚举
    /// </summary>
    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<Camera>();
        if (!mainCamera.enabled)
        {
            mainCamera = mainCamera.transform.parent.FindChild("CameraOne").GetComponent<Camera>();
        }
        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;
        }

    }

    /// <summary>
    /// 复位
    /// </summary>
    public void ResetValue()
    {
        if (moveTarget != null)
        {
            moveTarget.localPosition = moveTargetPos;
        }
        if (parentModel != null)
        {
            parentModel.localPosition = parentModelPos;
        }
        yaw = 0;
        pitch = 0;
        idealYaw = 0;
        idealPitch = 0;
    }

}
时间: 2024-10-25 02:53:22

Unity3d 简单实现物体旋转缩放移动的相关文章

OpenGL绘制简单场景,实现旋转缩放平移和灯光效果

本项目实现了用OpenGL绘制一个简单场景,包含正方体.球体和网格,实现了物体的旋转.缩放.平移和灯光效果.附有项目完整代码,有详细注释.适合初学者熟悉opengl使用. 开发情况 开发环境VS2012+OpenGL 开发平台 Intel core i5,Intel HD Graphics Family 本项目实现了绘制一个场景(包括立方体.球体.网格),对各物体实现平移.旋转.缩放功能,添加了光源并简单设置了物体材质. 本项目示例代码下载(里面有详细注释) 感谢nehe的框架! 场景介绍 初始

[WebGL入门]十七,递归处理和移动?旋转?缩放

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 模型坐标变换矩阵的好处 上次,通过操作模型坐标变换矩阵,绘制了多个模型.这次,继续在此基础上,给多个模型再添加上旋转和放大缩小等处理.看过上一篇文章的人应该知道,在3D渲染的世界里,利用VBO和一部分坐标变换矩阵,只需要少量修改,就可以绘制出大量的模型.当然,计算量也

讲解一下iOS图片单指旋转缩放实现方法

最近做一个项目,里边要做图片处理功能,其中就有图片单指旋转,缩放.由于之前还没做过这样的功能,于是乎找了下相关的资料,终于找到了一种好的实现方案.于是就仿照美图秀秀里边贴纸的功能做了一个demo...以下贴一些主要实现代码.... /*****头文件*********/ #import <UIKit/UIKit.h> @interface ImageEditView : UIView // 背景图片 @property (nonatomic, weak, readonly) UIImageVi

osg矩阵变换节点-----平移旋转缩放

osg矩阵变换节点-----平移旋转缩放 转自:http://www.cnblogs.com/ylwn817/articles/1973396.html 平移旋转缩放这个三个是osg矩阵操作中,最常见的操作,下面给出示例以及说明 首先先了解下osg空间方向: osg方向如左图所示,x轴表示屏幕水平方向,y轴表示和屏幕垂直方向即屏幕里面方向,z轴表示屏幕垂直方向,每个箭头指向表示正方向 下面来学习矩阵变换操作 首先平移: #include<osgDB/ReadFile> #include<

unity对象的简单平移与旋转

物体旋转问题,比如说自转,绕转,点击一物体,让其它物体绕该物体转,还有始终面向鼠标或者是player朝向等等,实际上都是一些简单的Rotate\RotateAround\LookAt等的属性,实现起来很简单,只需要获取场景里的物体,设置相对应的属性就可以. 1.场景中物体获取方法: [C#] 纯文本查看 复制代码 1 2 cube = GameObject.FindGameObjectWithTag(Tags.Cube).transform;                 cube1 = Ga

three.js中物体旋转实践之房门的打开与关闭

看这篇博客,默认你已经知道了3D模型实现三维空间内旋转的实现方式(矩阵.欧拉角.四元数). ok,下面正式切入主题,房门的打开和关闭,先上图: 正如你所看到的那样,这个“房门”已经被打开了. 一.three.js中物体的旋转 object.rotation.set(angleX,angleY,angleZ); 这是three.js为object3D类(基本上所有的物体都是继承自这个类的)提供的自旋转API: 为什么叫自旋转呢,就像地球自转和公转一样,自旋转表示绕物体自身中心点(局部坐标系)旋转:

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因: 多半是因为物体所属Layer与照相机的culling mask不一致导致的,或者超出照相机的可视范围. 如果游戏中有多个相机,每个相机都有自己的可视范围和culling mask,物体在移动的过程中,进入不同的相机,其可见性可能是变化的,取决与物体所属Layer与当前相机是否一致

iOS 开发----CGAffineTransform平移,旋转,缩放

在做平移,旋转,缩放的时候一定要记住三个步骤: 获取值(获取当前控件的 transform 属性值) 修改值(修改需要设置的 transform 属性值) 赋值   (将修改的 transform 属性的值赋给原来的值) /**   *  平移   *   *  @param transform 获取当前的形变 transform   *  @param tx        沿着 x 水平方向的平移   *  @param ty        沿着 y 垂直方向的平移   *   *  @ret

Android图片旋转,缩放,位移,倾斜,对称完整示例(二)——Bitmap.createBitmap()和Matrix

MainActivity如下: package cc.c; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.widget.ImageView; /** * Demo描述: * 利用B