Unity3D实现摄像机镜头移动并限制角度
作者:Studious_S 发布时间:2023-09-30 17:06:51
标签:Unity3D,摄像机,角度
本文实例为大家分享了Unity3D实现摄像机镜头移动并限制角度的具体代码,供大家参考,具体内容如下
摄像机镜头跟随鼠标移动,并限制上下左右的移动角度
public class ViewFromCream : MonoBehaviour
{
public int speed=5;
public Vector3 vect;
private float xcream;
private float ycream;
public void Update()
{
CreamView();
}
private void CreamView()
{
float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");
if (x!=0||y!=0)
{
LimitAngle(60);
LimitAngleUandD(60);
this.transform.Rotate(-y * speed, 0, 0);
this.transform.Rotate(0, x * speed, 0, Space.World);
}
}
/// <summary>
/// 限制相机左右视角的角度
/// </summary>
/// <param name="angle">角度</param>
private void LimitAngle(float angle)
{
vect = this.transform.eulerAngles;
//当前相机x轴旋转的角度(0~360)
xcream = IsPosNum(vect.x);
if (xcream > angle)
this.transform.rotation = Quaternion.Euler(angle,vect.y,0);
else if (xcream < -angle)
this.transform.rotation = Quaternion.Euler(-angle, vect.y, 0);
}
/// <summary>
/// 限制相机上下视角的角度
/// </summary>
/// <param name="angle"></param>
private void LimitAngleUandD(float angle)
{
vect = this.transform.eulerAngles;
//当前相机y轴旋转的角度(0~360)
ycream = IsPosNum(vect.y);
if (ycream > angle)
this.transform.rotation = Quaternion.Euler(vect.x, angle, 0);
else if (ycream < -angle)
this.transform.rotation = Quaternion.Euler(vect.x, -angle, 0);
}
/// <summary>
/// 将角度转换为-180~180的角度
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
private float IsPosNum(float x)
{
x -= 180;
if (x < 0)
return x + 180;
else return x - 180;
}
}
对IsPosNum方法进行说明
之所以要将获取的欧拉角转换为-180°-180°之间,是因为在获取eulerAngle中,x轴和y轴的值只有0-360,而没有负数,那么这将会复杂化我们角度的判断,如限制左右角度为-60-60之间,那么我们就要判断角度是否超过300度或是超过60度, 显然超过300度的角度必定超过60度,那么就需要另外加条件进行判断;因此对获取的值进行转化更为方便!
来源:https://blog.csdn.net/Studious_S/article/details/106100540


猜你喜欢
- 前 言App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式:使用SharedPrefe
- 本文实例汇总了C#路径,文件,目录及IO常见操作。分享给大家供大家参考。具体如下:问题1:如何判定一个给定的路径是否有效/合法;通过Path
- 本文实例讲述了C++实现的求解多元一次方程。分享给大家供大家参考,具体如下:注:这里计算的是n*n的等距矩阵,代码如下:#include&l
- Handler每个初学Android开发的都绕不开Handler这个“坎”,为什么说是个坎呢,首先这是Android架构的精髓之一,其次大部
- 在一个完整的项目中,如果每一个控制器的方法都返回不同的结果,那么对项目的维护和扩展都会很麻烦;并且现在主流的开发模式时前后端分离的模式,如果
- 本文实例讲述了Android实现整理PackageManager获取所有安装程序信息的方法。分享给大家供大家参考,具体如下:List<
- System.Web.Caching.Cache Insert和Add方法的区别Add()object Add(string key, ob
- 最近项目上要实现语音搜索功能,界面样式要模仿一下UC浏览器的样式,UC浏览器中有一个控件,会随着声音大小浮动,然后寻思偷个懒,百
- JVM默认物理内存JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
- 目录相关依赖配置文件application.yml在Zookeeper中创建配置节点和数据测试类自定义Zookeeper配置在上一篇文章中介
- 目前系统集成短信似乎是必不可少的部分,由于各种云平台都提供了不同的短信通道,这里我们增加多租户多通道的短信验证码,并增加配置项,使系统可以支
- 本文实例为大家分享了Android Scroller的使用方法,供大家参考,具体内容如下1、scrollTo和ScrollByView类定义
- 当使用spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet、Filter和Servlet规范的所有 * (
- 这里给一个样例树:代码:#include <stdio.h> #include <string.h>#include
- 字体池的应用,主要是为了解决字体不断创建导致句柄泄漏/内存泄漏的问题,这个问题在Android上也同样存在。经测试,C# WinForm原生
- 1.问题在MyBatisPlus中经常会用到如下所示的代码来构造查询条件:QueryWrapper<User> queryWra
- 废话不多说,直接上代码import java.text.SimpleDateFormat; import java.util.Date;/*
- 在app中经常会用到底部菜单的控件,每次都需要写好多代码,今天我们用到了前几篇博客里的控件来进一步封装底部菜单。先看效果图:主要包括以下功能
- java中实现多线程的方法有两种:继承Thread类和实现runnable接口。1.继承Thread类,重写父类run()方法 public
- 一、概述有不少人问我intellij idea的mybatis-plus自动生成插件使用出现各种各样的问题,所以我在这边博客的基础上添加一些