当然啦其实围绕旋转的功能本身并不难:
        // 拖动摄像机围绕物体旋转
        if (Input.GetMouseButton(1))
        {
            x += Input.GetAxis("Mouse X") * speed * Time.deltaTime;
            y += Input.GetAxis("Mouse Y") * speed * Time.deltaTime;
            Quaternion q = Quaternion.Euler(y, x, 0);
            Vector3 direction = q * Vector3.forward;
            this.transform.position = center - direction * distance;
            this.transform.LookAt(center);
        }

用代码把摄像机移动到指定位置也不难:

public void MoveTo(Vector3 vecCenter, Vector3 vecPosition, float time)
    {
        // 设置缺省中心点
        center = vecCenter;
        defaultCenter = vecCenter;
        defaultPositon = vecPosition;
        distance = Vector3.Distance(defaultCenter, defaultPositon);

// 移动位置(用了DOTween做平滑)
        Sequence seq = DOTween.Sequence();
        seq.Append(this.transform.DOMove(vecPosition, time).SetEase(Ease.Linear));
        seq.Play().OnUpdate(delegate
        {
            this.transform.LookAt(vecCenter);
        });
    }

困难的是,用代码移动之后,用户再用鼠标控制摄像机时,会出现视角跳跃的现象。
这个问题的核心在于,MoveTo() 的时候没有设置适当的 x 与 y 值,所以解决方案本来很简单,只要把这两个值设置一下就行了。
但是!
四元数的乘法是没有逆运算的!
也就是说,下面这一句求direction的代码不能逆运算:
Vector3 direction = q * Vector3.forward;
当然其实办法还是有的,就像这样:
Quaternion.FromToRotation(Vector3.forward, direction);
但算出来的 q 和原来的 q 长得不一样……
为什么说“长得不一样”呢?因为这两个四元数本质上是等价的(但不要问我为什么,我的数学是体育老师教的……
而且我还发现,q 和下面这个四元数对于【求direction的代码】也是等价的:
Quaternion.Euler(q.eulerAngles.x, q.eulerAngles.y, 0);
于是问题就这样解决了,在 MoveTo() 中给 x 和 y 这样赋值:

// 计算 x,y 的值
        distance = Vector3.Distance(vecCenter, vecPosition);
        Vector3 direction = (vecCenter - vecPosition) / distance;
        Quaternion q2 = Quaternion.FromToRotation(Vector3.forward, direction);
        x = q2.eulerAngles.y;
        y = q2.eulerAngles.x;

Unity中摄像机围绕物体旋转的功能相关推荐

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

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

  2. 【Unity】Unity实现鼠标控制摄像机围绕物体旋转镜头 滑轮控制远近

     在游戏和一些产品展示等项目中会有让摄像机围绕某个物体进行旋转这种需求  下面展示的代码是个删减版的  只保留了主要功能   限制的方面都删除了 在原有的代码中有  移动摄像机功能 围绕的点不做限制每 ...

  3. Unity里面实现Camera围绕物体旋转

    在Unity中,总是会用到让一个照相机围绕物体旋转观察,我刚开始实现的时候也是没能搞清楚欧拉角的旋转方式,其实实现这个功能还是很简单的,下面索性将一些小功能自己记录分享一下,方便后面的回顾学习. 第一 ...

  4. Unity Camera围绕物体旋转和缩放简单实现

    想实现Camera围绕物体旋转和缩放这个功能,我们第一时间想到的就是RotateAround()方法但是使用该方法就面临着一个问题,当你鼠标横着拖动屏幕使相机围绕物体旋转90度后,在竖着拖动时会发现相 ...

  5. Unity/c#鼠标右键控制相机围绕物体旋转/滚轮控制远近

    鼠标右键控制相机围绕物体旋转/滚轮控制远近 #c#代码` 鼠标右键控制相机围绕物体旋转/滚轮控制远近 using System.Collections; using System.Collection ...

  6. 【Unity编程】Unity中的欧拉旋转

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 欧拉角的定义 在写这篇博客之前,我搜索了网上很多关于欧拉角的定义,发现大部分引用自 ...

  7. 【Unity】OpenCV Plus Unity 获取Unity中摄像机并调用opencv使其灰度化实例

    前言 OpenCV Plus Unity 有关的教程实在是少之又少,Opencv的有很多,但是在Unity上应用的相关教程很少,比如付费的OpenCV For Unity ,就已经很少了,目前经济有限 ...

  8. Unity中获取一个物体下所有的子物体的方法

    Unity中获取一个物体下所有的子物体的方法 方法1(获取全部子物体,无论子物体SetActive是否为true): using System.Collections; using System.Co ...

  9. unity中控制游戏物体移动最基本的三种方法

    **unity**中控制游戏物体移动的最基本的三种方法 第一种移动方法-transform.Translate,游戏物体按照你给的方向和速度进行运动 代码如下: Public float speed; ...

最新文章

  1. tensorflow intel platform 优化
  2. 美国发布《评估和强化制造与国防工业基础及供应链弹性》报告
  3. Windows下使用gvim格式化xml文件
  4. Werkzeug Turorial
  5. Postgres invalid command \N数据恢复处理
  6. 谷歌开源 VR 应用
  7. jquer同时选择多个不同的id执行同意操作
  8. 【算法笔记】数论基础:康托展开(全排列和序号之间的映射)
  9. struts1:Struts的中央控制器
  10. Qcom平台添加 Camera 驱动(msm8953)
  11. Unity 两个UI(坐标)之间的连线(直线)。如连线题
  12. PDF是什么格式?如何编辑PDF文件?
  13. python处理xps文件,从XPS文档中提取文本
  14. 高通 msm8953 LCD 休眠/唤醒 流程
  15. java 不支持,不支持Java Sound格式
  16. 医学与计算机领域融合的发展前景,浅谈对超声医学的发展现状与前景之探究
  17. Supervised Contrastive Learning
  18. 当python遇上echarts (三)绘制3D图表
  19. 【免费资源必备】LingoDeer,扫描全能王直装版等五款APP让你享受上千个免费资源
  20. 真正的手机密码大全!

热门文章

  1. 2003-2020年中国对外直接投资流量(分191个国家地区) OFDI
  2. 实例 :手把手教你用PyTorch快速准确地建立神经网络(附4个学习用例)
  3. MeeGo handset 1.1开发环境[6]:封装*.src.rpm和*.rpm
  4. Cramér-Rao bound 克拉美罗界(转)
  5. Vuforia 系列讲解 – 02 环境搭建
  6. Hololens+Vuforia识别图像
  7. App 性能测试分享
  8. python 驱动级鼠标_颜值最高的鼠标垫 赛睿 Qck Prism Cloth游戏鼠标垫评测
  9. Flume采集日志到Kafka经典案例
  10. 微信小程序如何通过微信绑定的手机号进行快速登录