Unity 摄像机绕物体旋转(带阻尼)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveCameraByMouse : MonoBehaviour
{
// 围绕旋转的目标物体
public Transform target;
// 设置旋转角度
public float x = 0f, y = 0f, z = 0f;
public bool xFlag = false, yFlag = false;
// 旋转速度值
public float xSpeed = 10f, ySpeed = 10f, mSpeed = 5f;
// y轴角度限制,设置成一样则该轴不旋转
public float yMinLimit = -50, yMaxLimit = 80;
// x轴角度限制,同上
public float leftMax = -365, rightMax = 365;
// 距离限制,同上
public float distance = 3f, minDistance = 0.5f, maxDistance = 6f;
// 阻尼设置
public bool needDamping = true;
public float damping = 3f;
public float initX;
public float initY;
// 改变中心目标物体
public void SetTarget(GameObject go)
{
target = go.transform;
}
void Start()
{
Vector3 angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
//pers();
}
void LateUpdate()
{
if (target)
{
if (Input.GetMouseButton(1))
{
// 判断是否需要反向旋转
if ((y > 90f && y < 270f) || (y < -90 && y > -270f))
{
x -= Input.GetAxis("Mouse X") * xSpeed * 0.02f;
}
else
{
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
}
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
x = ClampAngle(x, leftMax, rightMax);
y = ClampAngle(y, yMinLimit, yMaxLimit);
}
distance -= Input.GetAxis("Mouse ScrollWheel") * mSpeed;
distance = Mathf.Clamp(distance, minDistance, maxDistance);
Quaternion rotation = Quaternion.Euler(y, x, z);
Vector3 disVector = new Vector3(0.0f, 0.0f, -distance);
Vector3 position = rotation * disVector + target.position;
// 阻尼感
if (needDamping)
{
transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping);
transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping);
}
else
{
transform.rotation = rotation;
transform.position = position;
}
}
}
// 对数值进行限制;
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);
}
// 初始
public void pers()
{
this.x = initX;
this.y = initY;
}
// 正视图
public void front()
{
this.x = 0f;
this.y = 0f;
}
// 后视图
public void back()
{
this.x = 180f;
this.y = 0f;
}
// 左视图
public void left()
{
this.x = 90f;
this.y = 0f;
}
// 右视图
public void right()
{
this.x = 270f;
this.y = 0f;
}
// 俯视图
public void top()
{
this.x = 0f;
this.y = 90f;
}
// 仰视图
public void bottom()
{
this.x = 0f;
this.y = -90f;
}
}
Unity 摄像机绕物体旋转(带阻尼)相关推荐
- unity摄像机环绕物体旋转
实现原理: 把摄像机作为一个空物体的子对象,空物体自旋,摄像机也会旋转,并且视角一直注释着物体 具体实现: 要环视的物体 新建一个空对象 在空对象下新建一个相机 旋转空对象即可
- Unity3d实现鼠标控制相机绕物体旋转(带阻尼)
Unity3d实现鼠标控制相机绕物体旋转(带阻尼) 本来想的是用四元数实现球性插值实现阻尼效果,但是不知道四元数怎么绕定点旋转.因此用速度衰减的方法进行实现. 1.实现鼠标控制相机带阻尼旋转 2.实现 ...
- Unity鼠标控制摄像机 围绕物体旋转
Unity鼠标控制摄像机 围绕物体旋转 角度范围判定 // An highlighted block using UnityEngine;public class CameraCtrl : MonoB ...
- Unity中摄像机围绕物体旋转的功能
当然啦其实围绕旋转的功能本身并不难: // 拖动摄像机围绕物体旋转 if (Input.GetMouseButton(1)) { ...
- Unity摄像机对象锁定旋转运镜模拟
问题简述 在3D模式下如何模拟实现Unity摄像机对象锁定旋转运镜,可以分为两个部分,第一是实现对象锁定,第二是实现旋转运镜.对象锁定就是无论摄像机如何运动,始终保持对象位于摄像机成像区域的固定位置, ...
- 相机漫游,绕物体旋转及缩放(Android及手机端通用)
缩放有两种方式:一种改变相机的视距还有一种直接改变相机的位置们这里我们使用第二种方法: 旋转:绕自身旋转和绕物体旋转, 这里我们也是使用第二种: 其中的阀值需要自己控制. 有一些相机的角度位置离物体中 ...
- Unity Camera围绕物体旋转和缩放简单实现
想实现Camera围绕物体旋转和缩放这个功能,我们第一时间想到的就是RotateAround()方法但是使用该方法就面临着一个问题,当你鼠标横着拖动屏幕使相机围绕物体旋转90度后,在竖着拖动时会发现相 ...
- unity3D 鼠标控制物体旋转带阻尼效果
最近做了一个鼠标拖拽360°旋转查看物体的功能,很基础的一个功能,代码不多写的很快 但是最后出来的效果不是很满意,感觉没有灵魂,很死板僵硬,所以做了一点小修改,在鼠标拖拽结束时计算最后鼠标的加速度,让 ...
- 【Unity】Unity实现鼠标控制摄像机围绕物体旋转镜头 滑轮控制远近
在游戏和一些产品展示等项目中会有让摄像机围绕某个物体进行旋转这种需求 下面展示的代码是个删减版的 只保留了主要功能 限制的方面都删除了 在原有的代码中有 移动摄像机功能 围绕的点不做限制每 ...
最新文章
- 为什么会出现__pycache__文件夹?
- Eclipse中svn插件:Subclipse插件安装
- Python学习---Django的request扩展[获取用户设备信息]
- VMware VIC
- python函数示例_带Python示例的float()函数
- 虚拟专题:联邦学习 | 联邦学习算法综述
- Wi-Fi 6 「破茧成蝶」,高通全面布局端到端最佳解决方案
- python计算召回率代码_序列标注的准确率和召回率计算
- 服务器上域名打不开网站,域名打不开网站
- 编程时遇到问题的解决方向
- VMware——VMware Tools的介绍及安装方法
- SEO当下的力量,你应该关注的4个属性
- JS - 解决鼠标单击、双击事件冲突问题(同时实现两种事件响应)
- Java实现比较APP版本号大小
- 前阿里P8甩我一份内部SpringCloud笔记手册,真香
- 用Python爬取购物节当天热门商品销量数据,看看大家喜欢什么
- 数据规整:连接、联合与重塑(数据分析)
- 艾科dell服务器系统安装教程,武汉swarm部署
- 浅谈Web安全技术----RBI
- js监听元素尺寸变化