问题简述

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

解决思路

图1

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

图2

图3

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

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

图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),就有以下结论:

如果摄像机是按照图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;float d1;float d2;Vector3 lookAtPos;Vector3 mPos;float mAngle;void Start(){lookAtPos = lookAtObject.position;mPos = transform.position;}void FixedUpdate(){Move();AngleUpdate();Rotation();}//摄像机移动void Move(){transform.Translate(moveSpeed * Time.fixedDeltaTime, 0, 0);}//角度更新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;}//摄像机旋转void Rotation(){transform.localRotation = Quaternion.Euler(0, -mAngle, 0);}
}

代码解说

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

效果演示

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

如果这篇文章对你有帮助,请给作者点个赞吧!

Unity摄像机对象锁定旋转运镜模拟相关推荐

  1. unity摄像机环绕物体旋转

    实现原理: 把摄像机作为一个空物体的子对象,空物体自旋,摄像机也会旋转,并且视角一直注释着物体 具体实现: 要环视的物体 新建一个空对象 在空对象下新建一个相机 旋转空对象即可

  2. unity摄像机跟随鼠标旋转

    第一种 float vertical = Input.GetAxis("Mouse X") float horizontal = Input.GetAxis("Mouse ...

  3. Unity 摄像机绕物体旋转(带阻尼)

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveCame ...

  4. 【个人笔记】Unity插件“Cinemachine”——实现尼尔机械纪元运镜设计

    这篇文章参考的是unity官方的视频教程,主要是做一个记录,如有侵权则删,其实unity官方挺多视频都挺皮的,也是个看教程的地方23333 参考链接: 1.<Unity实现尼尔机械纪元运镜设计& ...

  5. Unity鼠标控制摄像机 围绕物体旋转

    Unity鼠标控制摄像机 围绕物体旋转 角度范围判定 // An highlighted block using UnityEngine;public class CameraCtrl : MonoB ...

  6. Unity中摄像机围绕物体旋转的功能

    当然啦其实围绕旋转的功能本身并不难:         // 拖动摄像机围绕物体旋转         if (Input.GetMouseButton(1))         {             ...

  7. 国仁网络资讯:短视频拍摄如何上热门;掌握这8大拍摄运镜手法即可。

    抖音视频拍摄基本分为两种:一种是随手拍,记录生活精彩时刻:一种是情景拍摄,一般整个视频都是设计好的. 随手一拍很轻松,但未免没有那么多偶然的精彩瞬间,此时就需要我们自己去编排了,编排出一条精彩视频,拍 ...

  8. 抖音短视频如何运镜拍摄,教你手机也能拍大片!丨国仁网络资讯

    为什么都是用手机拍的抖音,别人就能做出炫酷特效?而你苦思冥想半天,短视频还是平平无奇?其实,一切创意皆有套路, 抖音.快手上很多粉丝百万.千万的头部IP账号,绝大部分也是用手机拍摄的.手机拍摄短视频方 ...

  9. 视频拍摄常用运镜方式

    所谓运镜 Camera Movement,就是在一个镜头中通过移动摄像机机位,或者改变镜头光轴,或者变化镜头焦距所进行的拍摄. 常规的运镜方式可归纳为八个字: 推.拉.摇.移 跟.升.降.甩 几乎所有 ...

最新文章

  1. 解析:GE工业互联网平台Predix
  2. 【CV】深度了解自监督学习,就看这篇解读 !SimMIM:掩码图像建模的简单框架...
  3. 如何在SAP云平台上启用SAP Intelligent Robotic Process Automation - IRPA
  4. SharePoint2007 配置MOSS基于AD的Forms验证
  5. 相对于通过木马传播方式获得的C++用户数据
  6. MPI程序例子 test_8_1_2.c -- 对等模式的MPI程序,Jacobi迭代 (MPI_Send、MPI_Recv)
  7. poj 1325 Machine Schedule 匈牙利二分匹配 基础
  8. 华为ENSP配置VLAN间路由
  9. 计算机word如何计算年龄,Excel 如何自动计算年龄
  10. 大连发展中韩跨境电子商务势在必行
  11. 软件测试周刊(第47期):要爱具体的人,不要爱抽象的人;要爱生活,不要爱生活的意义。
  12. 计算机毕业设计Java优乐帮育儿系统(系统+程序+mysql数据库+Lw文档)
  13. Eclipse 查看类继承和实现关系(包括子类)
  14. 「镁客·请讲」小小牛曹翔:Creative AR让孩子们成为21世纪的“神笔马良”
  15. 利用评论信息的推荐综述
  16. 蓝屏代码: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bootsafe64.sys
  17. APIO2018 新家
  18. 数据让生活更幸福!三分钟带你了解智慧城市,交通大数据应用!
  19. 国科大学习资料--模式识别与机器学习-2016期末考试题
  20. 一、Git介绍、以及原理

热门文章

  1. 2017.11.3作业
  2. 打造个性QQ,适合网吧做自己安全的QQ
  3. 可位寻址与不可位寻址
  4. 最新域名防红V1.19版本+已经去授权
  5. 【JZOJ 杂题选讲】【UER #8】打雪仗
  6. 运动控制专题——PPU
  7. pix2pixHD: High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs
  8. 目前最好的折叠屏手机也“翻车”了
  9. 录屏状态监听之防录屏 - iOS
  10. 新浪微博 ios/android 你所访问的站点在新浪微博的认证失败 解决方法