unity 摄像机围绕物体转动(有万向锁)
2018-03-10 14:35
309 查看
public Transform target;//旋转目标
public float distance = 1.8f;//摄像机和目标之间的距离
private float speedX = 240f;//x轴转速
private float speedY = 120f;//y轴转速
private float mX = 0.0f;//摄像机的旋转角度x
private float mY = 0.0f;//摄像机的旋转角度y
private float maxDistance = 5f; //摄像机最远
private float minDistance = 1.2f;//摄像机最近
private float zoomSpeed = 0.2f;//摄像机的前进速度(放大)
public bool isNeedDamping = true;//是否平滑过渡
public float damping = 1f;//平滑过渡速度
// Use this for initialization
void Start()
{
//开始的时候获得角度
mX = transform.eulerAngles.x;
mY = transform.eulerAngles.y;
}
// Update is called once per frame
void Update()
{
if (target != null && Input.GetMouseButton(0))
{
//获得鼠标右键拖拽
mX += Input.GetAxis("Mouse X") * speedX * Time.deltaTime;
mY -= Input.GetAxis("Mouse Y") * speedY * Time.deltaTime;
}
//鼠标滚轮摄像机的距离
distance -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
//摄像机的距离范围--限制
distance = Mathf.Clamp(distance, minDistance, maxDistance);
//射线机的旋转(有万向锁问题)
Quaternion mRotation = Quaternion.Euler(mY, mX, 0);
Vector3 mPosition = mRotation * new Vector3(0, 0, -distance) + target.position;
////是否平滑过渡
//if (isNeedDamping)
//{
// //在from和to之间旋转-插值法
// transform.rotation = Quaternion.Lerp(transform.rotation, mRotation, Time.deltaTime * damping);
// transform.position = Vector3.Lerp(transform.position, mPosition, Time.deltaTime * damping);
//}
//else
//{
// transform.rotation = mRotation;
// transform.position = mPosition;
//}
//不平滑移动
transform.rotation = mRotation;
transform.position = mPosition;
}
//限制角度
private float ClampAngle(float angle, float min, float max)
{
if (angle < -360) angle += 360;
if (angle > 360) angle -= 360;
return Mathf.Clamp(angle, min, max);
}
public float distance = 1.8f;//摄像机和目标之间的距离
private float speedX = 240f;//x轴转速
private float speedY = 120f;//y轴转速
private float mX = 0.0f;//摄像机的旋转角度x
private float mY = 0.0f;//摄像机的旋转角度y
private float maxDistance = 5f; //摄像机最远
private float minDistance = 1.2f;//摄像机最近
private float zoomSpeed = 0.2f;//摄像机的前进速度(放大)
public bool isNeedDamping = true;//是否平滑过渡
public float damping = 1f;//平滑过渡速度
// Use this for initialization
void Start()
{
//开始的时候获得角度
mX = transform.eulerAngles.x;
mY = transform.eulerAngles.y;
}
// Update is called once per frame
void Update()
{
if (target != null && Input.GetMouseButton(0))
{
//获得鼠标右键拖拽
mX += Input.GetAxis("Mouse X") * speedX * Time.deltaTime;
mY -= Input.GetAxis("Mouse Y") * speedY * Time.deltaTime;
}
//鼠标滚轮摄像机的距离
distance -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
//摄像机的距离范围--限制
distance = Mathf.Clamp(distance, minDistance, maxDistance);
//射线机的旋转(有万向锁问题)
Quaternion mRotation = Quaternion.Euler(mY, mX, 0);
Vector3 mPosition = mRotation * new Vector3(0, 0, -distance) + target.position;
////是否平滑过渡
//if (isNeedDamping)
//{
// //在from和to之间旋转-插值法
// transform.rotation = Quaternion.Lerp(transform.rotation, mRotation, Time.deltaTime * damping);
// transform.position = Vector3.Lerp(transform.position, mPosition, Time.deltaTime * damping);
//}
//else
//{
// transform.rotation = mRotation;
// transform.position = mPosition;
//}
//不平滑移动
transform.rotation = mRotation;
transform.position = mPosition;
}
//限制角度
private float ClampAngle(float angle, float min, float max)
{
if (angle < -360) angle += 360;
if (angle > 360) angle -= 360;
return Mathf.Clamp(angle, min, max);
}
相关文章推荐
- unity 鼠标控制摄像机围绕物体旋转
- 物体围绕摄像机转动(virtools)
- 【Unity 3D学习】获取鼠标滑动方向(上下左右)-控制摄像机围绕物体旋转
- Unity实现摄像机围绕物体旋转
- [Unity][Camera]判断物体是否在摄像机的可视范围内
- Unity视角转动之摄像机环绕效果
- 使物体围绕中心点转动(可用于电风扇等的旋转)
- unity-实现摄像机跟随物体(Vector3.SmoothDamp)
- 摄像机围绕物体旋转观察
- Unity 3d 实现物体跟随摄像机视野运动
- unity中判断渲染物体是否在摄像机内渲染
- unity 物体转动一周前进一个单位
- unity 相机围绕某物体自动旋转
- Unity 控制摄像机跟随运动物体
- Unity 物体根据手指拖动而转动(可用于物体的360度展示)(手机端)
- 鼠标控制摄像机围绕物体旋转拍摄
- Unity教程之-让物体朝摄像机Camera观察方向移动(一)
- unity摄像机环绕物体旋转
- Unity 物体围绕圆周运动
- unity之RotateAround 一个物体围绕另外一个物体旋转