【unity】关于unity3D摄像机视角移动的几种方式详解

这篇具有很好参考价值的文章主要介绍了【unity】关于unity3D摄像机视角移动的几种方式详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、前言

二、Transform基础

1、几种坐标系

2、position和localPosition属性

3、rotation属性

三、摄像机的平移

1、键盘控制平移

2、鼠标控制平移

3、整合 

四、摄像机的旋转

1、绕自身旋转

2、绕目标物体旋转

3、整合 

五、优化功能

1、调整速率

2、切换目标物体

3、设置常用摄像机观察点


一、前言

        在做虚拟仿真或数字孪生等项目中,常常会遇到需要自由移动视角的场景。最近在用unity制作一个有关3D打印机的数字孪生项目时遇到了这种情况,本文将结合unity和blender的视角移动功能,介绍一个类似这两个软件的视角移动的方法。

二、Transform基础

        Unity3D中的Transform组件是每个GameObject对象都有的组件,它控制着对象的位置、旋转和缩放。 在介绍视角移动前,本文将先介绍transform的position、rotation两个属性和unity中的坐标系。

1、几种坐标系

        在unity中常见的有两种坐标系,分别是全局坐标(World Space)和局部坐标(Local Space),在unity场景窗口(Scene)中可以切换这两种坐标系,如图所示:

unity 动画器怎么移动相机,unity探索之路,unity,游戏引擎

        全局坐标:也称为世界坐标,表示物体在场景中的绝对位置和方向。全局坐标是相对于场景的原点(0,0,0)而言的。

        局部坐标:也称为相对坐标,表示物体相对于其父物体的位置和方向。局部坐标是相对于父物体的原点(0,0,0)而言的。

2、position和localPosition属性

        position和localPosition都是三维向量(Vector3),前者用于描述物体在场景中的绝对位置,即相对于世界原点的位置;后者描述物体相对于其父级对象的位置,以父物体为原点。

        在没有设置父物体时,Transform.position和Transform.localPosition的值相同,都等于物体的全局坐标。

        当物体P被设为物体Q的子物体时,物体P的Transform.localPosition表示与父物体Q的相对位置,当只改变父物体Q的Transform.position时,子物体P将跟随父物体Q移动,因此子物体P的Transform.position随物体Q改变,然而子物体P相对于父物体Q的相对位置不变,所以子物体P的Transform.localPosition保持不变。

        值得一提的是,在unity的检查器(Inspector)面板的Transform组件中,所显示的position为localPosition,对于无父物体的物体而言,其代表全局(世界)坐标,对于有父物体的物体而言,则表示两者的相对位置。

3、rotation属性

        和描述位置的属性一样,描述旋转的属性也分为rotation和localRotation。它是一个四元数(Quaternion)。rotation与localRotation的关系和position与localPosition一样,这里就不多做赘述。不过值得注意的一点是,在unity中文文档中提到:

        “请勿尝试编辑/修改 rotation。”

        “要旋转 Transform,请使用 Transform.Rotate,它将使用欧拉角。”

三、摄像机的平移

        在unity场景窗口中我们可以按住鼠标滚轮进行平移,而在blender中我们可以按住左Shift+鼠标滚轮平移视角,除此之外,在unity中也可以通过键盘上下左右键控制视角移动。而在项目中,我们将尝试控制摄像机平移模仿上述效果。

1、键盘控制平移

        键盘控制平移的代码非常简单,不过在此之前应该在unity的项目设置(Project Setting)中设置好输入管理器(Input Manager)。如下图所示:

unity 动画器怎么移动相机,unity探索之路,unity,游戏引擎

        在脚本分别调用Input.GetAxis("Vertical")和Input.GetAxis("Horizontal")将返回一个float值,由于类型设置为“Key or Mouse Button”,则返回-1、0、1三个值。

        当按下键盘W或者↑键时Input.GetAxis("Vertical")将返回1,按下S或者↓键时将返回-1,不按任何键将返回0;同理当按下D或→键时Input.GetAxis("Horizontal")将返回1,按下A或者←键时将返回-1,不按则返回0。

        根据这个属性可得到控制平移的代码:

float moveZ = Input.GetAxis("Vertical") * moveSpeedWithKeyBoard * Time.deltaTime;
float moveX = Input.GetAxis("Horizontal") * moveSpeedWithKeyBoard * Time.deltaTime;
transform.position += transform.forward *  moveZ + transform.right * moveX;
2、鼠标控制平移

        我将用按下滚轮拖动鼠标的方式控制摄像机上下左右平移,滚动滚轮控制前后平移。

        首先是前后移动,确保你的输入管理器(Input Manager)设置如图所示:

unity 动画器怎么移动相机,unity探索之路,unity,游戏引擎

        通过调用Input.GetAxis("Mouse ScrollWheel")获取前后移动的值,同样这个函数将返回一个float值,滚轮向前滚为正,向后为负。代码如下:

float MouseScroll = Input.GetAxis("Mouse ScrollWheel") * moveSpeedWithScroll * Time.deltaTime;
transform.position += transform.forward * MouseScroll;

       

        然后是上下左右移动 ,当鼠标滚轮按下时获取鼠标在xy轴移动的值:

if (Input.GetMouseButton(2))
{
    float moveX = -Input.GetAxis("Mouse X") * moveSpeedWithMouse * Time.deltaTime;
    float moveY = -Input.GetAxis("Mouse Y") * moveSpeedWithMouse * Time.deltaTime;

    transform.position += transform.right * moveX + transform.up * moveY;
}
3、整合 

        综合上述,不难发现这几段代码的相似之处:接收来自鼠标或键盘的输入并算出摄像机在forward、right、up三个方向上的移动值,再乘以对应的方向向量并加到相机的位置上,因此可以整合成以下函数:

/// <summary>
/// 相机移动
/// </summary>
public void Move()
{

    float moveX = 0;
    float moveY = 0;
    float moveZ = 0;

    // 接收键盘输入
    moveZ = Input.GetAxis("Vertical") * moveSpeedWithKeyBoard * Time.deltaTime;
    moveX = Input.GetAxis("Horizontal") * moveSpeedWithKeyBoard * Time.deltaTime;

    // 接收滚轮输入
    moveZ = Input.GetAxis("Mouse ScrollWheel") * moveSpeedWithScroll * Time.deltaTime;

    // 接收鼠标输入
    if (Input.GetMouseButton(2))
    {
        moveX = -Input.GetAxis("Mouse X") * moveSpeedWithMouse * Time.deltaTime;
        moveY = -Input.GetAxis("Mouse Y") * moveSpeedWithMouse * Time.deltaTime;
    }

    // 控制移动
    transform.position += transform.forward * moveZ + transform.right * moveX + transform.up * moveY;

}

四、摄像机的旋转

         常见的摄像机旋转有两种,即摄像机自身旋转和摄像机绕目标物体旋转。在unity的场景窗口中按住鼠标滚轮为绕自身旋转,按住左Alt+鼠标左键时绕选中物体旋转。下面我们将尝试做出上述效果。

1、绕自身旋转

        绕自身旋转的思路很简单,只需要获取鼠标输入并更改摄像机自身的旋转。代码如下:

if (Input.GetMouseButton(0))
{
    float rotateX = Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime;
    float rotateY = Input.GetAxis("Mouse Y") * rotateSpeed * Time.deltaTime;

    Vector3 eulerAngles = transform.eulerAngles;

    eulerAngles.y += rotateX;
    eulerAngles.x -= rotateY;

    transform.eulerAngles = eulerAngles;
}
2、绕目标物体旋转

        绕目标物体转动较为复杂,需要同时改变position和rotation的值。首先确定目标物体,再改变position值,这个过程和上文的鼠标控制平移一样,接下来需要改变rotation的值确保摄像机始终面向目标物体,只需调用transform.LookAt()函数即可。

        当然使用上述方法可以粗略实现围绕旋转,但是依旧有个小问题,就是摄像机会在旋转的过程中逐渐远离目标物体,原因是我们每次改变position的值都将增加一点二者之间的距离(根据三角形的斜边大于直角边的原理),而后面的步骤没有抵消掉这个距离变化。

        所有在以上步骤之后还应矫正一下距离,将摄像机的位置在目标物体的方向上移动至距离不变的位置,最终的代码如下:

if (Input.GetMouseButton(1))
{
    float rotateX = Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime;
    float rotateY = Input.GetAxis("Mouse Y") * rotateSpeed * Time.deltaTime;

    float distance = Vector3.Distance(target.transform.position, transform.position);

    transform.position += transform.right * -rotateX + transform.up * -rotateY;

    transform.LookAt(target.transform);

    transform.position = target.transform.position + -transform.forward * distance;
}
3、整合 

        同样的,我们将以上两段代码整合封装成函数,可以得到以下代码:

/// <summary>
/// 相机旋转
/// </summary>
public void Rotate()
{
    //接收输入
    float rotateX = Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime;
    float rotateY = Input.GetAxis("Mouse Y") * rotateSpeed * Time.deltaTime;

    // 绕自身旋转
    if (Input.GetMouseButton(0))
    {
        Vector3 eulerAngles = transform.eulerAngles;

        eulerAngles.y += rotateX;
        eulerAngles.x -= rotateY;

        transform.eulerAngles = eulerAngles;
    }


    // 绕喷头旋转
    if (Input.GetMouseButton(1))
    {
        float distance = Vector3.Distance(target.transform.position, transform.position);

        transform.position += transform.right * -rotateX + transform.up * -rotateY;

        transform.LookAt(target.transform);

        transform.position = target.transform.position + -transform.forward * distance;
    }
}

五、优化功能

1、调整速率

        上述方法中,移动的速率是不变的,这样可能会导致当摄像机离物体很远时会显得移动很慢,离物体很近时会显得太快,可以写一个函数,根据距离目标物体的远近自动调整速率或许可以获得更好的手感。 

2、切换目标物体

        上述方法中没有提到目标物体的切换与选择,可以添加一个功能,通过鼠标点击选中游戏中的对象作为目标物体围绕旋转,切换目标只需选择其他对象即可。

3、设置常用摄像机观察点

        在实际项目中,可设置几个常用的摄像机机位,用户可通过快捷键快速切换到该位置观察。例如在3D打印机的仿真中,可以在打印机窗口前设置一个观察点来模拟实际中用户观察3D打印机的视角。文章来源地址https://www.toymoban.com/news/detail-760859.html

到了这里,关于【unity】关于unity3D摄像机视角移动的几种方式详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity3D】正交视图与透视视图 ( 正交视图概念 | 透视视图概念 | 观察点 | 正交视图作用 | 摄像机广角设定 | 透视畸变效果 )

    透视视图 ( Perspective View ) : 近大远小 , 符合正常人眼观察 3D 世界的规律 ; 近大 : 物体 距离 观察点 ( 视点 ) 比较近时 , 显示效果比较大 ; 远小 : 物体 距离 观察点 ( 视点 ) 比较远时 , 显示效果比较小 ; 下图就是利用了 透视视图 原理 , 照像机离鸟很近 , 离人很远 ; 在 Unity 编辑

    2024年01月16日
    浏览(31)
  • unity控制摄像机几种视角实现方式

    目录 1、按下鼠标右键可以实现摄像机上下左右旋转 2、自由视角 3、摄像头跟随视角 4、跟随自由视角 5、第一人称跟随视角 python学习汇总连接: 1、按下鼠标右键可以实现摄像机上下左右旋转 这段代码定义了一个名为CameraRotate的脚本,用于控制摄像机根据鼠标右键(中键)

    2024年03月12日
    浏览(30)
  • 摄像机视角的切换_unity基础开发教程

    我们在游戏中经常可以看到游戏视角的切换,今天我们就做一个视角切换的小demo,学会之后可以将其融入到自己的游戏制作当中。 话不多说,我们现在开始! 首先要有一个场景,先创建四个正方体,组成图中的样子。 这里教大家一个小工具: 当选中物体要进行移动的时候

    2024年04月29日
    浏览(19)
  • unity-第三人称摄像机简单脚本(包括跟随、视角旋转、滚轮缩放)

    本菜鸟为了实现第三人称视角摄像机的主要功能,踩了很多意料之外的坑,终于搞出一份自觉完美的脚本,分享一下。 功能:摄像机跟随、鼠标滚轮缩放视野、长按鼠标右键左右旋转视野、长按鼠标中键上下旋转视野。 此脚本挂接在摄像机上,有详细注释,可直接运行。

    2024年02月08日
    浏览(36)
  • Unity 3D 人物移动朝向跟随摄像机(第一人称)

    以人物身体旋转控制镜头左右滑动 以摄像机旋转控制镜头上下滑动 首先我们要知道 摄像机是作为人物的子物体的(充当眼睛) 所以当人物旋转时 摄像机会跟随它朝相同的方向旋转相同的角度 从而达到 眼睛(摄像机)注视的方向一定是人物的正前方 那么这样做有什么好处

    2024年02月21日
    浏览(39)
  • 关于unity场景上多个摄像机叠加显示不同层级的问题

     首先确定哪一个摄像机的渲染深度更高 深度数值更大的相机后渲染 也就是下图的depth选项 深度更高的相机在clear flags中选择depth only也就是只渲染选择了的层级的物体 深度更高的相机在下面 culling mask选择需要 后渲染 的层级 低深度相机就不选择这一层级来达到多个相机渲染

    2024年02月16日
    浏览(24)
  • UE-摄像机视角的切换

    可参考:第四篇:UE4视角切换节点,Possess和Set View Target With Blend的区别_是灿灿呀1的博客-CSDN博客_possess ue4 UE4 使用蓝图或C++切换摄像机视角 - Lymind - 爱码网  UE4场景中多个固定摄像机间切换视角_冬眠兔116的博客-CSDN博客_ue4 视角过渡  先添加摄像机组件,并将摄像机放置在场

    2024年02月11日
    浏览(28)
  • UE4 限制玩家摄像机视角旋转角度

    功能 :玩家可以用鼠标旋转视角观察角色,但限制旋转的角度 网上找了很多没找到,于是自己实现了一种方式 先在弹簧臂组件里勾上使用pawn控制旋转,这样相机的旋转就跟玩家控制器绑定了,所以重点在于如何对玩家控制器进行限制 如果不加旋转限制的话是这样子 可以发

    2024年02月12日
    浏览(32)
  • Unity3D 进行任意角度调节视角

    有很多小伙伴一定在初学Unity3D时遇到不小心将窗口视角打乱的情形, 例如不小心点击右上角的XYZ轴导致视角不同, 图1: 图2 如何恢复至初始角度呢?比较纠结。其实不用恢复至初始角度,你点击的那个坐标按钮,表示你想从不同的角度去看这个terrain(地形),所以可以按

    2024年02月11日
    浏览(24)
  • UE4场景中多个固定摄像机间切换视角

    在场景中提前摆放好摄像机 调整好摄像机角度,并且将摄像机更名为transform1 在蓝图中设置 蓝图解释 通过类获取所有摄像机 通过名称来获取到切换的摄像机 blend time 是相机切换的过渡时间,不会让画面切换的很生硬 new view target 是要切换到的相机

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包