Unity中摄像机的重要性毋庸置疑,关于摄像机的操作也有很多,比如第一人称跟随,第二人称跟随,摄像机的拉近拉远等等,下面就暂时实现摄像机的拉近拉远和旋转:

创建新的场景,场景中添加一个cube,然后给cube添加新的脚本,脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using UnityEngine;
using System.Collections;
public class TestCube : MonoBehaviour {
    private GameObject rotateObj;
    private GameObject camera;
    public float speed = 3f;
    private bool rotate = false;
    public float maxView = 90;
    public float minView = 10;
    void Start()
    {
        rotateObj = GameObject.Find("Rotate");
        camera = GameObject.Find("Main Camera");
    }
    void Update () {
        //滑动鼠标滑轮控制视角的大小
        float offsetView = Input.GetAxis("Mouse ScrollWheel") * speed;
        float tmpView = offsetView + Camera.main.fieldOfView;
        tmpView = Mathf.Clamp(tmpView, minView, maxView);
        Camera.main.fieldOfView = tmpView;
        //绕主角旋转摄像机
        if(rotate)
        {
            camera.transform.RotateAround(transform.position, Vector3.up, speed * Input.GetAxis("Mouse X"));
        }
        if(Input.GetMouseButtonDown(0))
        {
            rotate = true;
        }
        if(Input.GetMouseButtonUp(0))
        {
            rotate = false;
        }
    }
}

当然啦其实围绕旋转的功能本身并不难:

// 拖动摄像机围绕物体旋转
        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中摄像机围绕物体旋转的功能

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

  2. Unity 相机的移动旋转以及拉近拉远的原理

    不管是在游戏(如超级玛丽游戏)中,还是在工艺仿真中,还是在手机app开发中,相机都是必不可少的模块,本篇文章重点讲解一下相机背后的原理 下面这幅图引入两个角色,第一就是我们需要控制的相机,第二就是相机 ...

  3. unity实现吃鸡摄像头,自动拉近拉远视距,不被遮挡物遮盖人物效果

    实现类似摄像头,遇到遮挡物自动拉近拉远视距,不被遮挡物遮盖人物的效果 效果图 一.简介 二.基本层级 三.核心脚本 四.寒暄 效果图 传入的时gif图,帧率有所降低,不过能看清楚 这是旋转时的效果 这 ...

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

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

  5. AVfoundation中焦距的设置(slider实现拉近拉远镜头)

    首先设置一个slider UISlider focusSlider = [[UISlideralloc]initWithFrame:CGRectMake(60,_bottomView.frame.or ...

  6. Unity的摄像机拉近拉远和旋转脚本实现

    摄像机是Unity3d里面一定要用到的.所以熟悉摄像机的使用也是能掌握unity3d的基础. 这里详细介绍一个摄像机脚本,脚本的功能类似与魔兽争霸的鼠标滚轮拉近拉远以及按住右键移动鼠标旋转视野. 涉及 ...

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

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

  8. 相机漫游,绕物体旋转及缩放(Android及手机端通用)

    缩放有两种方式:一种改变相机的视距还有一种直接改变相机的位置们这里我们使用第二种方法: 旋转:绕自身旋转和绕物体旋转, 这里我们也是使用第二种: 其中的阀值需要自己控制. 有一些相机的角度位置离物体中 ...

  9. unity鼠标控制镜头旋转_unity3D鼠标滚轮来实现镜头拉近拉远及视角旋转

    镜头拉近拉远的代码(无限拉远拉近) 代码如下: if( Input.GetAxis("Mouse ScrollWheel") != 0 ) { this.gameObject.tr ...

  10. Unity3d实现鼠标控制相机绕物体旋转(带阻尼)

    Unity3d实现鼠标控制相机绕物体旋转(带阻尼) 本来想的是用四元数实现球性插值实现阻尼效果,但是不知道四元数怎么绕定点旋转.因此用速度衰减的方法进行实现. 1.实现鼠标控制相机带阻尼旋转 2.实现 ...

最新文章

  1. 你必须知道的.net学习总结
  2. winpcap的环境配置
  3. Service-policy 的出入(QOS)
  4. 蓝凌ekp开发_新华教育集团战略升级,携手蓝凌量身定制数字化办公平台
  5. python基础公式_一、Python基础(数据类型、基本函数、基本运算)
  6. VMware发布虚拟云网络创新技术,连接和保护分布式多云企业
  7. yii2不用composer使用redis
  8. 可用的免费公开的DNS
  9. 易买电商网站项目总结
  10. ICEM: 合并混合网格
  11. 银行电话营销数据分析
  12. c语言求出现次数最多的字符,保证你看懂
  13. 【2023年电工杯数学建模竞赛】选题分析+A题B题完整思路+代码分享
  14. JDK、JER、JVM是什么
  15. 《吃透 MQ 系列》之扒开 Kafka 的神秘面纱
  16. 为什么采用实时操作系统?
  17. 腾讯AI Lab刷新人脸识别与检测两大测评国际记录,技术日调用超六亿
  18. 书画小说--创意电子书制作软件
  19. 第一课时(下):破解基础之常见加壳程序特征
  20. vue数学公式编辑器_将Vue包装器用于MathLive数学编辑器的示例

热门文章

  1. 2021年暑期训练阶段三Day3
  2. 智能电视机顶盒开发记录
  3. 便捷式计算机无线功能按钮,便携式wlan热点是什么 如何设置【图解】
  4. 文本搜索引擎lucene
  5. 在Unity中接入Xbox360手柄
  6. PhotoShop导入webp格式图片
  7. 科技爱好者周刊(第 167 期):广告拦截器太过分了
  8. 《程序员》5月刊精彩内容预告
  9. C语言pow()函数的运用(x的y次幂)
  10. 21个终身受用的顶级思维