自由视角摄像机,实现旋转,缩放
2017-05-24 11:17
351 查看
借鉴前人代码,自己加了一些注释,帮助大家理解
操作方式:
using UnityEngine;
using System.Collections;
public class CameraControl : MonoBehaviour
{
//观察目标
public Transform Target;
//观察距离
public float Distance = 5F;
//旋转速度
private float SpeedX = 240;
private float SpeedY = 120;
//角度限制
private float MinLimitY = -20;
private float MaxLimitY = 80;
//旋转角度
private float mX = 0.0F;
private float mY = 0.0F;
//鼠标缩放距离最值
private float MaxDistance = 10;
private float MinDistance = 1.5F;
//鼠标缩放速率
private float ZoomSpeed = 2F;
//是否启用差值
public bool isNeedDamping = true;
//速度
public float Damping = 10F;
//存储角度的四元数
private Quaternion mRotation;
//定义鼠标按键枚举
private enum MouseButton
{
//鼠标左键
MouseButton_Left = 0,
//鼠标右键
MouseButton_Right = 1,
//鼠标中键
MouseButton_Midle = 2
}
//相机移动速度
private float MoveSpeed = 5.0F;
//屏幕坐标
private Vector3 mScreenPoint;
//坐标偏移
private Vector3 mOffset;
void Start ()
{
//初始化旋转角度
mX = transform.eulerAngles.x;
mY = transform.eulerAngles.y;
}
void LateUpdate ()
{
//鼠标右键旋转
if (Target != null && Input.GetMouseButton ((int)MouseButton.MouseButton_Right)) {
//获取鼠标输入
mX += Input.GetAxis ("Mouse X") * SpeedX * 0.02F;
mY -= Input.GetAxis ("Mouse Y") * SpeedY * 0.02F;
//范围限制
mY = ClampAngle (mY, MinLimitY, MaxLimitY);
//计算旋转(按照X,Y,Z轴进行旋转,分别旋转 mX,mY,0度)
mRotation = Quaternion.Euler (mY, mX, 0);
//根据是否插值采取不同的角度计算方式
if (isNeedDamping) {
transform.rotation = Quaternion.Lerp (transform.rotation, mRotation, Time.deltaTime * Damping);
} else {
transform.rotation = mRotation;
}
}
//鼠标中键平移
//鼠标滚轮缩放
Distance -= Input.GetAxis ("Mouse ScrollWheel") * ZoomSpeed;
Distance = Mathf.Clamp (Distance, MinDistance, MaxDistance);
//重新计算摄像机的位置 (Vector3 (0.0F, 0.0F, -8)为方向向量) 叉乘代表旋转后的相对坐标
/**
* detail:
* Quaternion quaternion = Quaternion.Euler(new Vector3(0, 90, 0)); --代表根据Y轴旋转90度
* vec = new Vector3(0, 1, 0);
* vec2 = quaternion * vec; --quaternion 左乘 vec, 返回 向量 vec 旋转 quaternion 后的向量
*
*/
Vector3 mPosition = mRotation * new Vector3 (0.0F, 0.0F, -Distance) + Target.position;
//设置相机的位置
if (isNeedDamping) {
transform.position = Vector3.Lerp (transform.position, mPosition, Time.deltaTime * Damping);
} else {
transform.position = mPosition;
}
}
//角度限制
private float ClampAngle (float angle, float min, float max)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
/**
* Clamp 作用:范围控制
* 如果angle<min ->angle=min 如果angle>max angle=max 如果 min<=angle<=max angle = angle
*/
return Mathf.Clamp (angle, min, max);
}
}
有什么问题欢迎大家来交流
操作方式:
1.新建一个脚本:CameraControl.cs
2.把脚本绑定到摄像机上
代码如下:(注释很详细)
using UnityEngine;using System.Collections;
public class CameraControl : MonoBehaviour
{
//观察目标
public Transform Target;
//观察距离
public float Distance = 5F;
//旋转速度
private float SpeedX = 240;
private float SpeedY = 120;
//角度限制
private float MinLimitY = -20;
private float MaxLimitY = 80;
//旋转角度
private float mX = 0.0F;
private float mY = 0.0F;
//鼠标缩放距离最值
private float MaxDistance = 10;
private float MinDistance = 1.5F;
//鼠标缩放速率
private float ZoomSpeed = 2F;
//是否启用差值
public bool isNeedDamping = true;
//速度
public float Damping = 10F;
//存储角度的四元数
private Quaternion mRotation;
//定义鼠标按键枚举
private enum MouseButton
{
//鼠标左键
MouseButton_Left = 0,
//鼠标右键
MouseButton_Right = 1,
//鼠标中键
MouseButton_Midle = 2
}
//相机移动速度
private float MoveSpeed = 5.0F;
//屏幕坐标
private Vector3 mScreenPoint;
//坐标偏移
private Vector3 mOffset;
void Start ()
{
//初始化旋转角度
mX = transform.eulerAngles.x;
mY = transform.eulerAngles.y;
}
void LateUpdate ()
{
//鼠标右键旋转
if (Target != null && Input.GetMouseButton ((int)MouseButton.MouseButton_Right)) {
//获取鼠标输入
mX += Input.GetAxis ("Mouse X") * SpeedX * 0.02F;
mY -= Input.GetAxis ("Mouse Y") * SpeedY * 0.02F;
//范围限制
mY = ClampAngle (mY, MinLimitY, MaxLimitY);
//计算旋转(按照X,Y,Z轴进行旋转,分别旋转 mX,mY,0度)
mRotation = Quaternion.Euler (mY, mX, 0);
//根据是否插值采取不同的角度计算方式
if (isNeedDamping) {
transform.rotation = Quaternion.Lerp (transform.rotation, mRotation, Time.deltaTime * Damping);
} else {
transform.rotation = mRotation;
}
}
//鼠标中键平移
//鼠标滚轮缩放
Distance -= Input.GetAxis ("Mouse ScrollWheel") * ZoomSpeed;
Distance = Mathf.Clamp (Distance, MinDistance, MaxDistance);
//重新计算摄像机的位置 (Vector3 (0.0F, 0.0F, -8)为方向向量) 叉乘代表旋转后的相对坐标
/**
* detail:
* Quaternion quaternion = Quaternion.Euler(new Vector3(0, 90, 0)); --代表根据Y轴旋转90度
* vec = new Vector3(0, 1, 0);
* vec2 = quaternion * vec; --quaternion 左乘 vec, 返回 向量 vec 旋转 quaternion 后的向量
*
*/
Vector3 mPosition = mRotation * new Vector3 (0.0F, 0.0F, -Distance) + Target.position;
//设置相机的位置
if (isNeedDamping) {
transform.position = Vector3.Lerp (transform.position, mPosition, Time.deltaTime * Damping);
} else {
transform.position = mPosition;
}
}
//角度限制
private float ClampAngle (float angle, float min, float max)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
/**
* Clamp 作用:范围控制
* 如果angle<min ->angle=min 如果angle>max angle=max 如果 min<=angle<=max angle = angle
*/
return Mathf.Clamp (angle, min, max);
}
}
有什么问题欢迎大家来交流
End
相关文章推荐
- 【Unity3D游戏开发学习笔记】(七)上帝之眼—第三人称摄像机的简单实现(跟随视角,自由视角)
- unity3d实现控制摄像机放大缩小视野加左右可旋转视角角度
- Unity通过鼠标实现相机视角旋转和缩放
- 【iphone游戏开发】iphone-Cocos2d游戏开发之四:精灵实现缩放,旋转,跳动,移动等动画
- 在Android中实现图片缩放和旋转
- OpenGL实现3D模型自由旋转——之代码解析
- 【转载】使用GDI+变换矩阵实现图形的平移、缩放及旋转
- Java中Image的水平翻转、缩放与自由旋转操作
- UIPinchGestureRecognizer 缩放,移动,旋转,UIImagePickerController 横屏,全屏 的实现
- OpenGL 实现的粒子系统、自由摄像机及Billboard
- 使用GDI+变换矩阵实现图形的平移、缩放及旋转
- OpenGL实现3DS文件中的模型自由旋转
- 使用GDI+变换矩阵实现图形的平移、缩放及旋转
- 摄像机、投影、3D旋转、缩放
- [Android]android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜
- PHP图片处理类实现缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色等功能
- Java中Image的水平翻转、缩放与自由旋转操作
- 在Delphi中实现图片的旋转、缩放
- OpenGL实现3D模型自由旋转——之代码解析
- EasyFRMS.Image C# 实现图片剪切、缩放、旋转、水印操作