U3D中摄像机绕屏幕中心点旋转缩放平移

原创 2015年07月10日 12:08:31

之前做的都是摄像机绕某个物体旋转。直接修改的Rotation属性
然后缩放用的是改摄像机FieldOfView的值
最后发觉效果不仅不尽如人意而且平移后会错位。在借鉴了一个别人的摄像机代码后修改成功
按住右键旋转,按住中键平移,滚轮缩放
脚本拖放到摄像机上即可
代码如下
using UnityEngine;
using System.Collections;

public class FreeCameraController : MonoBehaviour {
    //摄像机绕屏幕中心旋转缩放平移脚本

    public float thetaSpeed = 250.0f;
    public float phiSpeed = 120.0f;
    public float moveSpeed = 10.0f;
    public float zoomSpeed = 30.0f;

    public float phiBoundMin = -89f;
    public float phiBoundMax = 89f;
    public bool useMoveBounds = true;
    public float moveBounds = 100f;

    public float rotateSmoothing = 0.5f;
    public float moveSmoothing = 0.7f;

    public float distance = 2.0f;
    private Vector2 euler;

    private Quaternion targetRot;
    private Vector3 targetLookAt;
    private float targetDist;
    private Vector3 distanceVec = new Vector3(0, 0, 0);

    private Transform target;
    private Rect inputBounds;
    public Rect paramInputBounds = new Rect(0, 0, 1, 1);

    public Vector3 pivotPoint = new Vector3(0, 2, 0);

    public void Start()
    {
        Vector3 angles = transform.eulerAngles;
        euler.x = angles.y;
        euler.y = angles.x;
        //unity only returns positive euler angles but we need them in -90 to 90
        euler.y = Mathf.Repeat(euler.y + 180f, 360f) - 180f;

        GameObject go = new GameObject("_FreeCameraTarget");
        go.hideFlags = HideFlags.HideAndDontSave | HideFlags.HideInInspector;
        target = go.transform;

        
        target.position = pivotPoint;
        targetDist = (transform.position - target.position).magnitude;
        
        targetRot = transform.rotation;
        targetLookAt = target.position;
    }

    public void Update()
    {
        //NOTE: mouse coordinates have a bottom-left origin, camera top-left
        inputBounds.x = GetComponent<Camera>().pixelWidth * paramInputBounds.x;
        inputBounds.y = GetComponent<Camera>().pixelHeight * paramInputBounds.y;
        inputBounds.width = GetComponent<Camera>().pixelWidth * paramInputBounds.width;
        inputBounds.height = GetComponent<Camera>().pixelHeight * paramInputBounds.height;

        if (target && inputBounds.Contains(Input.mousePosition))
        {
            float dx = Input.GetAxis("Mouse X");
            float dy = Input.GetAxis("Mouse Y");

            bool click1 = Input.GetMouseButton(1);
            bool click2 = Input.GetMouseButton(2);


            if (click2)
            {
                dx = dx * moveSpeed * 0.005f * targetDist;
                dy = dy * moveSpeed * 0.005f * targetDist;
                targetLookAt -= transform.up * dy + transform.right * dx;
                if (useMoveBounds)
                {
                    targetLookAt.x = Mathf.Clamp(targetLookAt.x, -moveBounds, moveBounds);
                    targetLookAt.y = Mathf.Clamp(targetLookAt.y, -moveBounds, moveBounds);
                    targetLookAt.z = Mathf.Clamp(targetLookAt.z, -moveBounds, moveBounds);
                }
            }

            else if (click1)
            {
                dx = dx * thetaSpeed * 0.02f;
                dy = dy * phiSpeed * 0.02f;
                euler.x += dx;
                euler.y -= dy;
                euler.y = ClampAngle(euler.y, phiBoundMin, phiBoundMax);
                targetRot = Quaternion.Euler(euler.y, euler.x, 0);
            }

            targetDist -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed * 0.5f;
            targetDist = Mathf.Max(0.1f, targetDist);
        }
    }

    public void FixedUpdate()
    {
        distance = moveSmoothing * targetDist + (1 - moveSmoothing) * distance;

        transform.rotation = Quaternion.Slerp(transform.rotation, targetRot, rotateSmoothing);
        target.position = Vector3.Lerp(target.position, targetLookAt, moveSmoothing);
        distanceVec.z = distance;
        transform.position = target.position - transform.rotation * distanceVec;
    }

    static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360f) angle += 360f;
        if (angle > 360f) angle -= 360f;
        return Mathf.Clamp(angle, min, max);
    }
}



Unity3D入门(五):鼠标控制旋转、摄像机缩放

鼠标旋转被选中的物体 1.X轴在平面坐标是左右方向,这里得到的是左右移动距离 2.移动距离得到了,接下来要考虑以那个轴为中心作旋转 3.这里要实现固定摄像机位置的情况下旋转物体,就以Y轴为中心,所以R...
  • zooen2011
  • zooen2011
  • 2013年11月02日 08:10
  • 39124

Unity 移动摄像机的脚本(类似于魔兽争霸, LOL的摄像机移动方式)

类似LOL、魔兽争霸摄像机的移动,  当鼠标移动到窗口上下左右边界的时候, 移动摄像机。  将屏幕分为9份, 每一份一个标记, 标记划分参考计算机图形学 ...
  • merryken
  • merryken
  • 2015年05月22日 14:08
  • 1286

Unity 摄像机按照中心点移动

场景里需要两个摄像机,两个Sprite。其中一组作为正在使用的对象,另一组作为复位的默认位置。 通过鼠标或者最多两个手指的手势可以控制摄像机观察点的移动。 以下这段代码在Windows和Andro...
  • milk713785
  • milk713785
  • 2016年09月13日 22:49
  • 406

Unity 3D--摄像机平滑跟随(方法一)

using UnityEngine; using System.Collections; public class SmoothFollowerObj : MonoBehaviour { ...
  • tanmengwen
  • tanmengwen
  • 2012年09月19日 13:44
  • 27523

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

由于项目运行在安卓上,运用到了插件,比较麻烦。你们可以在触发条件上进行修改,不用插件也可以。 1.下载FingerGestures 插件 下载地址 点击打开链接 2.导入插件,创建场景 将预设Fi...
  • qq_27361571
  • qq_27361571
  • 2016年05月09日 17:51
  • 3185

unity旋转 缩放摄像机

 研究了摄像机旋转、缩放等问题,那么今天为大家分享的是一个在3D展示中比较常用的功能,即通过鼠标右键实现旋转、鼠标滚轮实现缩放、鼠标中键实现平移。本文采用的方法依然是在[Unity3D]Unit...
  • gaofd
  • gaofd
  • 2016年05月31日 14:42
  • 2451

Unity3d控制摄像机上下平移的代码

  • 2012年10月24日 09:51
  • 2KB
  • 下载

Unity3D学习日记(五)实现围绕物品旋转的的摄像机控制

这个是我在公司项目里面发现的一个写的很不错的一个简单的围绕物品选择的一个摄像机控制方法,这个方法比我之前写方法好用而且修复我之前遇到的一个Bug问题,这里我就对这两个方法进行介绍...
  • begonia__z
  • begonia__z
  • 2016年04月20日 17:38
  • 8103

Unity3D 场景平移、缩放

通过鼠标拖动左右平移场景,滚轮滑动实现场景缩放。using UnityEngine; using System.Collections; public class MouseMoveandS...
  • u012608885
  • u012608885
  • 2016年05月07日 11:17
  • 3764

Unity 移动摄像机到目标位置

今天实现了一个小功能,通过移动摄像机实现定位功能功能描述:一开始摄像机处于初始位置,通过点击鼠标选择目标物体将摄像机拉近到目标物体,实现定位功能, 还可以通过回归按钮使摄像机回归到初始状态。 us...
  • u012608885
  • u012608885
  • 2016年05月27日 15:54
  • 3941
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:U3D中摄像机绕屏幕中心点旋转缩放平移
举报原因:
原因补充:

(最多只允许输入30个字)