摄像机跟随之第三人称视角(一)

2023-10-27

在我们开发游戏的时候,总避免不了对摄像机的设置,当然,这也因为每款游戏类型不一样,所以摄像机的跟随或者说放置位置不一样,这也要求我们写出合适的算法。本篇就主要是针对第三人称视角的摄像机,进行算法设计分析。
首先来分析第三人称摄像机的特性:
1.始终在角色后面
2.可以通过移动鼠标围绕主角
3,类似半上帝视角
Ok,有了上面的分析,我们就要进行算法设计。
在设计之前,我们来回顾一下高中数学中的一些知识:
这里写图片描述
由图可知,我们使用的便是高中的三角函数关系
这里写图片描述
本期,我们就是要通过使用三角函数关系,来设置摄像机与玩家的位置。
一.新建一个项目,随便找一个人物模型,我这里找的是unity商店名叫RainEntertainment的资源包,然后把人物模型改名为Player,调整摄像机与人物模型的位置。
如下图
这里写图片描述

我们来分析一下摄像机与主角的三角函数位置关系
首先是YZ平面
这里写图片描述
再简化图形,如下
这里写图片描述
这里应该很好理解了,distance这个值我们是事先知道的,通过知道一个角度,然后得到另外一条边的长度,这个应该不难理解。

下面是XZ平面
这里写图片描述
再进行简化;
这里写图片描述

通过上面的方式,我们便可以获得摄像机相对于角色的x,y,z三个方向的值,通过加上或者减去主角的x,y,z三个方向的值,就可以获得一个相对位置,下面进行脚本操作,新建一个脚本,名为CameraFollow,脚本如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour {

    public float rollAngle;//XZ平面的角度控制
    public float rotAngle;//YZ平面的角度控制

    public float distance=5;//摄像机与角色的距离

    public Transform target;//跟随角色
    private float roll;//XZ平面的弧度控制

    private float rot;//YZ平面的弧度控制



    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
    private void LateUpdate()
    {
        UpdatePosition();
    }
    private void UpdatePosition()
    {
      roll= rollAngle * Mathf.PI * 2 / 360;//把角度转化为弧度
        rot= rotAngle * Mathf.PI * 2 / 360;


        Vector3 targetPos = target.position;//目标位置
        Vector3 CameraPos;//定义一个三维向量用来存储摄像机的位置
        float height = distance * Mathf.Sin(rot);//获得摄像机的高度
        float d = distance * Mathf.Cos(rot);
        CameraPos.x = targetPos.x + d * Mathf.Cos(roll);
        CameraPos.y = targetPos.y + height;
        CameraPos.z = targetPos.z + d * Mathf.Sin(roll);

        transform.position = CameraPos;//更新位置
        transform.LookAt(target);//使摄像机对着角色

    }

脚本理解起来也不难,再unity里面运行,然后调整参数,调到合适角度即可,比如我的一个设置的参数
这里写图片描述

二.使用鼠标控制围绕主角旋转。其实通过上面的分析,我们就是控制两个变量,一个是rollAngle,一个是rotAngle,所以,这也就更好进行脚本操作了
脚本如下:

    public float RollSpeed = 5;
    public float RotSpeed = 4;

    public float MinRotAngle = 4;//仰视的最小角度
    public float MaxRotAngle = 100;//俯视的最大角度
    private void RollRotate()
    {
        float MouseX = Input.GetAxis("Mouse X")*RollSpeed;
        rollAngle -= MouseX;
    }
    private void RotRotate()
    {
        float MouseY = Input.GetAxis("Mouse Y") * RotSpeed;
        rotAngle -= MouseY;
        if (rotAngle >= MaxRotAngle)
        {
            rotAngle = MaxRotAngle;
        }
        if (rotAngle < MinRotAngle)
        {
            rotAngle = MinRotAngle;
        }

    }

把两个方法放入LateUpdate里面,运行,便可以围绕角色旋转了
三.然后便是滚轮缩放,也很简单,控制distance的大小就可以了

    public float MinScroll=0.5f;
    public float MaxScroll=10f;
    public float ScrollSpeed = 0.5f;
    private void ScrollViewControll()
    {
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            if(distance>MinScroll)
            distance -= ScrollSpeed;
        }
        if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            if (distance < MaxScroll)
            {
                print("缩小");
                distance += ScrollSpeed;
            }
        }
    }

以上就是第三人称的算法,当然这只是个简略算法,还有很多问题需要解决,基本的思路就在这,扩展就靠大家自己了。加油!!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

摄像机跟随之第三人称视角(一) 的相关文章

随机推荐

  • ES6 flat 与数组扁平化

    前言 flat 用于将多维数组拉平 扁平化 不影响原数组 返回新的数组 1 2 3 4 flat 1 2 3 4 仅有一个参数depth 用于指定拉平的深度 默认值为1 若depth指定为非正数 将返回原数组 指定为Infinity 无论多
  • 线程间发布和订阅

    include
  • 刷脸支付可以自动识别会员可以领券打折

    刷脸支付说白了就是用自己的脸 身份证明 来跟金融做的一个消费交易 大家对于信息这个事情是非常敏感的 因此就会存在一个安全风险问题 还有就是对商家泄露的信息太多 造成消费者的担心等情况 也是时有发生 靠脸吃饭之前只是一句调侃 如今却成为了现实
  • 01 Java NIO NIO和IO的区别

    Java NIO NIO和IO的区别 NIO和IO的区别 面向流与面向缓冲 阻塞与非阻塞IO 选择器 Selectors NIO和IO如何影响应用程序的设计 API调用 数据处理 设置处理线程数 Java IO流专栏中主要介绍了java i
  • vue3之toRefs

    把一个响应式对象转换成普通对象 该普通对象的每个属性都是一个ref reactive的响应式功能赋予给对象的 给对象结构或展开的时候 会让数据丢失响应式能力 使用toRefs可以保证该对象展开的每一个属性都是响应式的 案例一
  • 挖到过src吗?请描述一下过程

    挖到过src吗 请描述一下过程 SRC 安全漏洞奖励计划 是一种由企业或组织设立的计划 旨在鼓励独立的安全研究人员发现并报告其系统或应用程序中的漏洞 这些计划的推出是为了提高安全性 及时修复潜在的漏洞 并奖励那些贡献漏洞发现的研究人员 SR
  • 如何让网页变灰色

    在一些重大节日 如何快速使网站网页变成灰色 黑白色 在网页的标签内加入以下代码 如果想让单个网页变灰色 就写在单网页里面 如果写在继承的网页里面 是整体的变灰色 如果你不想改动CSS文件 你可以通过在网页头部中的标签内部加入内联CSS代码的
  • c语言数学追赶法编程,计算方法——C语言实现——追赶法求解非线性方程

    最近在上计算方法这门课 要求是用MATLAB做练习题 但是我觉得C语言也很棒棒啊 题目 一般三对角线性方程组的求解用这个方法 三对角线性方程组也称为带状矩阵 这方法基础上还是LU分解法 只是比LU分解法计算方法上简单一些 使用VS2017
  • [HCTF 2018]admin 1 弱口令和爆破解法

    HCTF 2018 admin 继续buu刷题 几天刷到一道比较有意思的题 HCTF 2018 admin 打开环境之后 右上角 点击login 既然题目名字都提示了admin 猜测就是弱口令 admin加123 试一下 直接就登录进去了
  • pytest自动化测试框架基础篇

    目录 前言 一 单元测试框架 二 pytest简介以及常用插件安装 三 pytest默认测试用例的规则以及基础应用 四 pytest跳过测试用例 五 pytest测试用例的前后置 固件 前言 pytest是一个基于Python语言的自动化测
  • C++ 11 新容器和新算法

    目录 新容器 forward list Abstract How Demo array Abstract Comparewith vector Compare with original array How Demo tuple Abstr
  • LFU的实现

    题目内容 实现一个 LFUCache 类 三个接口 LFUCache int capacity 创建一个大小为 capacity 的缓存 get int key 从缓存中获取键为 key 的键值对的 value put int key in
  • opensuse 在 Wayland 中启用输入法

    当我在选择了kde wayland 环境的时候 fcitx输入法不能够使用了 网上有很多教你怎么在登陆时启用输入法的 基本都是教你修改X的配置文件 然而wayland并不读取X的配置文件 wayland读取的是 etc environmen
  • 【学习笔记】栈(c语言)

    1 栈的概念 栈 一种特殊的线性表 其只允许再固定的一段进行插入和删除元素操作 进行数据插入和删除操作的一端称为栈顶 另一端成为栈底 栈中的数据元素遵循后进先出LIFO Last In First Out 的原则 压栈 push 栈的插入操
  • 2020美赛F奖论文(二):传球网络模型(PNM)的建立和影响因子分析

    上接 2020美赛F奖论文 一 摘要 绪论和模型准备 全文 2020美赛F奖论文 一 摘要 绪论和模型准备 2020美赛F奖论文 二 传球网络模型 PNM 的建立和影响因子分析 2020美赛F奖论文 三 足球团队指标和基于机器学习的球队表现
  • 最小二乘法计算一组数据的斜率(线性回归、趋势计算)

    def compute trend y 计算数据的趋势 线性回归求斜率 最小二乘法 https blog csdn net qq 45607873 article details 109425736 return x np arange l
  • python基础语法

    1 列表 定义的格式 列表名称 元素1 元素2 元素可以是数字 字符串 列表 列表的访问 整体访问 列表名称 单个访问 通过下标获取元素 切片技术来访问列表中某些元素 列表的操作 len 计算列表的长度 实现列表的加法 将两个列表合并成为一
  • 第十七章 MyBatis3.X整合Mysql数据库事务

    1 MyBatis3 x 的事务管理形式 使 JDBC的事务管理 使 java sql Connection对象完成对事务的提交 commit 回滚 rollback 关闭 close 使 MANAGED的事务管理 MyBatis 身不会去
  • 咖啡店小程序:吸引顾客的创新营销手段

    近日 酱香拿铁 的大火让大家再次把目标聚焦在年轻人都喜欢的咖啡上 现在咖啡已经成为年轻一代的社交硬通货 咖啡店也遍地开花 而随着移动互联网的快速发展 咖啡店小程序已经成为了各大咖啡店主的选择 因为它提供了便捷的方式来链接顾客和销售 那么咖啡
  • 摄像机跟随之第三人称视角(一)

    在我们开发游戏的时候 总避免不了对摄像机的设置 当然 这也因为每款游戏类型不一样 所以摄像机的跟随或者说放置位置不一样 这也要求我们写出合适的算法 本篇就主要是针对第三人称视角的摄像机 进行算法设计分析 首先来分析第三人称摄像机的特性 1