Unity摄像机对象锁定旋转运镜模拟

这篇具有很好参考价值的文章主要介绍了Unity摄像机对象锁定旋转运镜模拟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题简述

       在3D模式下如何模拟实现Unity摄像机对象锁定旋转运镜,可以分为两个部分,第一是实现对象锁定,第二是实现旋转运镜。对象锁定就是无论摄像机如何运动,始终保持对象位于摄像机成像区域的固定位置,旋转运镜就是使得摄像机围绕对象进行旋转运动。

解决思路

Unity摄像机对象锁定旋转运镜模拟
图1

       从图1我们可以把摄像机的运动定格到两个状态,status2可以看作status1一帧后摄像机的运动位置和状态,摄像机始终存在一个速度v并且要求这个速度始终沿着圆的切线方向,这样我们才能实现摄像机的旋转运镜,实际上我们只是给摄像机一个status1所示方向上的速度,之所以出现图1中status2的情景,是因为我们对摄像机进行了旋转,否则摄像机就会始终按照图2所示的方式运动。

Unity摄像机对象锁定旋转运镜模拟
图2
Unity摄像机对象锁定旋转运镜模拟
图3

       图3所示是模拟了摄像机的坐标系,这个正方体就代表摄像机,图中的坐标系是摄像机的Local坐标系,z轴指向的是摄影区域的中点,我们结合图1和图3,假设给摄像机施加了一个x轴方向的速度v,那么我们就需要以y轴为轴线对摄像机进行旋转,使得z轴始终指向我们要锁定的游戏对象。

       对于对象锁定,我们知道摄像机有一个摄像区域,位于这个区域内的物体才会显示到成像区域中,在Unity中这个区域可以是一个长方体也可以是一个四棱锥,我们将之投影到摄像机Local坐标系的x和y轴构成的二维平面上,在默认参数下则二者的成像区域都是一个长方形A(如图4),蓝色的圆就代表锁定的游戏对象。

Unity摄像机对象锁定旋转运镜模拟
图4

       对于摄像机的Local坐标系,无论我们怎么旋转摄像机,z轴都始终指向长方形A的中点,所以说到这里我想你应该想到了对象锁定的实现思路了,假设我们就让对象锁定在成像区域(即长方形A)的中点,那么我们就需要让摄像机进行旋转使得摄像机的Local坐标系的z轴指向我们要锁定的游戏对象。

       对于旋转运镜,具体我们要让摄像机旋转多少角度,这里进行了一个近似处理,因为我们是每一帧进行一次更新,图2展示的是在没有进行旋转的情况下摄像机的运动,此时status2是status1的下一帧摄像机的位置和状态,在一帧的情况下图2中的status2和status1非常接近,就好比“微分思想”一样,如此我们可以将图2转换为一个直角三角形。假设锁定的游戏对象的世界坐标为(x1,y1,z1),status1时摄像机的世界坐标为(x2,y2,z2),status2时摄像机的世界坐标为(x3,y3,z3),就有以下结论:

Unity摄像机对象锁定旋转运镜模拟

        如果摄像机是按照图1所示逆时针运动,那么摄像机从status1到status2针对Local坐标系所需要旋转的角度就是-θ,我们已知cosθ的值,就可以计算出θ。

代码示例(C#)

using UnityEngine;

public class CameraLookAt : MonoBehaviour
{
    [Header("必要组件")]
    [Tooltip("相机注视对象")] public Transform LookAtObject;
    [Header("必要属性")]
    [Tooltip("相机移动速度"), Range(1, 10), SerializeField] private float MoveSpeed;

    private float d1;
    private float d2;
    private Vector3 lookAtPos;
    private Vector3 mPos;
    private float mAngle;

    private void Start()
    {
        lookAtPos = LookAtObject.position;
        mPos = transform.position;
    }

    private void FixedUpdate()
    {
        Move();
        AngleUpdate();
        Rotation();
    }

    //摄像机移动
    private void Move()
    {
        transform.Translate(MoveSpeed * Time.fixedDeltaTime, 0, 0);
    }

    //角度更新
    private void AngleUpdate()
    {
        d1 = Mathf.Pow(mPos.x - lookAtPos.x, 2) + Mathf.Pow(mPos.y - lookAtPos.y, 2) + Mathf.Pow(mPos.z - lookAtPos.z, 2);
        mPos = transform.position;
        d2 = Mathf.Pow(mPos.x - lookAtPos.x, 2) + Mathf.Pow(mPos.y - lookAtPos.y, 2) + Mathf.Pow(mPos.z - lookAtPos.z, 2);
        mAngle += Mathf.Acos(Mathf.Sqrt(d1 / d2)) * 180 / Mathf.PI;
    }

    //摄像机旋转
    private void Rotation()
    {
        transform.localRotation = Quaternion.Euler(0, -mAngle, 0);
    }
}

代码解说

       我们发现要实现Unity摄像机对象锁定旋转运镜模拟的代码很简单,主要就是摄像机的移动Move、角度更新AngleUpdate、摄像机的旋转Rotation,针对我这里为什么没有把三个方法的调用放在Update中而是放在了FixedUpdate中,起初我确实是放在Update中执行的,但是出现了Unity编辑器出现了错误提示,我们这里涉及到cosθ的计算,但是经过我的检测发现期间cosθ的值居然出现了大于1的情况,这显然是不正确的,Update是按照固定的帧率执行的,这并不符合我们运行的物理设备的实际帧率,所以就需要执行FixedUpdate对我们的执行频率进行修正。

效果演示

Unity摄像机对象锁定旋转运镜模拟

如果这篇文章对你有帮助,请给作者点个赞吧!文章来源地址https://www.toymoban.com/news/detail-440160.html

到了这里,关于Unity摄像机对象锁定旋转运镜模拟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity摄像机跟随

    将摄像机直接拖拽到被跟随的目标下面即可,这样摄像机永远在目标的后面 缺点: 屏幕旋转太平滑了 目标物体在屏幕上的位置永远不变 目标物体被销毁时总不能把摄像机也销毁了吧 先相机坐标和物体坐标做差,求得偏移量,在之后的每一帧里,将偏移量加上物体的坐标。

    2024年02月21日
    浏览(54)
  • Unity 摄像机

    摄像机分为两种  (1)透视摄像机 (2) 正交摄像机  一般3D游戏使用的透视多一点,2D游戏使用正交多一点。 相机参数 清除标记: (1)天空盒 (2)仅深度,类似于权重,优先级,深度大的覆盖住深度小的视线 例如 主相机显示的却不是当先视线,而是新相机的视线 ,主

    2023年04月21日
    浏览(47)
  • unity摄像机平滑移动旋转

    Unity中使用Vector3.SmoothDamp(平滑阻尼)方法进行跟随移动,可以使跟随看起来很平滑,而不显得突兀,最典型的示例就是相机平滑跟随角色移动。 SmoothDamp (current : Vector3, target : Vector3, ref currentVelocity : Vector3, smoothTime )  

    2024年02月11日
    浏览(52)
  • unity Camera(摄像机)介绍

    目录 一.摄像机类型 1.Perspective (透视摄像机) 2.Orthographic(正交摄像机) 二.摄像机属性 1.Clear Flags 2.Background 背景色 3.Culling Mask 剔除遮罩 4.Projection 投影 5.Field Of View   视野范围 6.Size 大小 7.Clipping Planes 裁剪屏幕 8.Viewport Rect 标准视图矩形 9.Depth 深度 10.Rendering Path 渲染路径

    2024年02月01日
    浏览(44)
  • unity摄像机跟随鼠标旋转

     float vertical = Input.GetAxis(\\\"Mouse X\\\") float horizontal = Input.GetAxis(\\\"Mouse Y\\\") 第二种 通过 计算坐标时只需要通过 Quaternion.Euler 来取得旋转四元数,以玩家为原点衍生一条(0,0,-1)的向量并乘上四元数以旋转至 Player 指向摄像机的方向,最后乘上 Distance ,即可得到摄像机相对玩家的偏移

    2024年02月11日
    浏览(68)
  • Unity丨移动相机朝向目标并确定目标在摄像机可视范围内丨摄像机注释模型丨摄像机移动丨不同尺寸模型优化丨

    本文提供的功能是摄像机朝向目标移动,并确定整个目标出现在摄像机视角内,针对不同尺寸的模型优化。 提示:这里可以添加技术名词解释 直接上代码 后期可扩展功能:类似点击目标完成视角移动等。

    2024年02月07日
    浏览(58)
  • 【Unity入门】Audio和摄像机

        大家好,我是Lampard~~     欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢     要说一款游戏最重要的是什么,那无疑是它的视听系统了。画面精美,音乐音效好听才能吸引住玩家,那么今天就来学习了解 最重要的组件Audio和摄像机组件 ,之后我们就会正式

    2023年04月08日
    浏览(38)
  • Unity物体始终朝向摄像机方向

    在上面的代码中,首先定义了一个cameraTransform变量,用于存储摄像机的Transform组件。 使用 Camera.main 方法来获取场景中的主摄像机,然后获取其Transform组件并将其赋值给 cameraTransform 变量。 然后,在Update方法中,我们计算出摄像机位置和物体位置之间的向量差,并将其存储在

    2024年02月15日
    浏览(51)
  • Unity三种摄像机旋转方式

    1.按下鼠标右键可以实现摄像机上下左右旋转 2.按下鼠标右键可以实现摄像机围绕某个物体上下左右旋转 3.摄像头始终跟随在某个物体的正后方

    2024年02月13日
    浏览(44)
  • Unity摄像机旋转与移动脚本实现

            最近做项目经常用到需要控制摄像机的地方,查阅了网上的方法后,以自己的需要写了一个这样的功能。希望对码友有所帮助        (本脚本放在摄像机上)         摄像机脚本功能:           1、通过键盘的WASD键控制摄像机的前后左右移动           2、通过

    2024年02月13日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包