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

之前做的都是摄像机绕某个物体旋转。直接修改的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入门(五)：鼠标控制旋转、摄像机缩放

• zooen2011
• 2013年11月02日 08:10
• 39124

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

• merryken
• 2015年05月22日 14:08
• 1286

## Unity 摄像机按照中心点移动

• milk713785
• 2016年09月13日 22:49
• 406

## Unity 3D--摄像机平滑跟随（方法一）

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

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

• qq_27361571
• 2016年05月09日 17:51
• 3185

## unity旋转 缩放摄像机

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

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

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

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

• begonia__z
• 2016年04月20日 17:38
• 8103

## Unity3D 场景平移、缩放

• u012608885
• 2016年05月07日 11:17
• 3764

## Unity 移动摄像机到目标位置

• u012608885
• 2016年05月27日 15:54
• 3941

举报原因： 您举报文章：U3D中摄像机绕屏幕中心点旋转缩放平移 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)