Unity中的数学应用 之 插值函数处理角色朝向 (初中难度 +Matlab)

        CodeMonkey教程: https://www.youtube.com/watch?v=QDWlGOocKm8

        Siki学院汉化教程:如何使用Unity开发分手厨房(胡闹厨房)-Unity2023 - SiKi学院|SiKi学堂 - unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程

版本:Unity6

模板:3D核心(渲染管线:URP)

1.情景

        在3D之中,角色移动朝向处理起来非常简单,因为我们可以获取tranform.forward,也就是当前对象的朝向(在unity之中为左手坐标系,所以对象正朝向为(0,0,1))

        接上一节:Unity中的数学应用 之 角色移动中单位化向量的妙用 (小学难度)-CSDN博客 只需要如下代码即可更改朝向

   if(move!= Vector3.zero) {  
       transform.forward =move;
   }

        但是这样直接赋值给朝向向量会比较生硬

        我们要采用平滑曲线让其有个旋转的过程

2.Vector3.Lerp:线性插值函数

        但不是Mathf.Lerp,因为其是处理单个向量的

        我们需要的是让角色朝向 =>输入朝向(transform.forward =>move)

        unity中的Vector3就有封装好的Lerp   

 transform.forward = Vector3.Lerp(transform.forward, move,Time.deltaTime* roteSpeed);

瞅瞅其背后的公式:

  • ( a ) 是起始向量
  • ( b ) 是结束向量
  • ( t ) 是插值因子,范围在 [0, 1] 之间

还是不直观,我直接用用matlab去绘制一下

% 起始向量和结束向量
a = [0, 0, 0];
b = [10, 10, 10];

% 插值因子 t 的范围
t = linspace(0, 1, 100);

% 计算 Lerp 插值
lerp_x = a(1) + (b(1) - a(1)) * t;
lerp_y = a(2) + (b(2) - a(2)) * t;
lerp_z = a(3) + (b(3) - a(3)) * t;

% 绘制曲线
figure;
plot3(lerp_x, lerp_y, lerp_z, '-o');
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Vector3.Lerp 曲线');
grid on;

       result = start + t * (end - start),这么来看result的线性的

        但是,因为用的是start = start + t * (end - start),而start是复用的不是不变的值,所以就会出现如下的啸问题,我用另外一个例子去直观地描述:

        该脚本挂载在A对象,end代表B对象

    public Transform end;
    private void Update() {
        this.transform.position = Vector3.Lerp(this.transform.position,end.position,0.01f);
    }

        表现为先慢后快,所以在朝向问题上可以选择另外一种插值:球形插值

3.Vector3.SLerp:球形插值函数

        这个公式貌似有点复杂,实际上确实有点复杂

        

请看动画:“四元数的线性插值”与“球面线性插值”的动画理解_哔哩哔哩_bilibili

    其中的角度是向量 a 和 b 之间的角,借用matlab来看其曲线似乎能窥探之一二

% 定义两个初始向量(示例中为二维向量,可类比三维情况)
u = [1, 0]; % 可以理解为方向向量,比如Unity中的某个方向
v = [0, 1]; % 另一个方向向量

% 生成插值参数t的一系列值,这里取多个值来体现曲线变化
t = linspace(0, 1, 100); % 从0到1均匀取100个值用于插值

% 计算向量u和v的夹角的余弦值
cos_omega = dot(u, v) / (norm(u) * norm(v));
% 得到夹角(保证在[0, pi]区间)
omega = acos(cos_omega); 

% 进行Slerp插值
interpolated_vectors = zeros(length(t), 2); % 用于存储插值后的向量
for i = 1:length(t)
    st = sin((1 - t(i)) * omega) / sin(omega);
    tt = sin(t(i) * omega) / sin(omega);
    interpolated_vectors(i, :) = st * u + tt * v;
end

% 绘制曲线,展示插值过程中向量端点的轨迹
plot(interpolated_vectors(:, 1), interpolated_vectors(:, 2));
xlabel('X');
ylabel('Y');
title('Slerp Interpolation Curve');
grid on;

       要是究其根本来讲:四元数存在于四维空间中,Slerp 操作相当于在这个四维超球面上找到两个四元数对应的点,并沿着连接这两点的大圆弧进行插值

        这个大圆弧在四维空间中的性质类似于二维圆上的弧,具有某种意义上的 “均匀性”,确保了插值过程中旋转速度和方向的平稳变化

        要是简单来讲:因为图像中这个圆弧的曲率在各方向(点)上是一致的,当start点向end点移动,是按照这个曲线去“滑行”的,因此就十分平滑且均匀 

实现了以下效果:

 4.总结

        虽然这个问题初中生来了都能解决,但确实是u3d中不可忽视的细节,我将通过线性代数和微积分深挖unity之中一些背后的数学知识

最后,这个视频说不定可以帮助你理解:有关插值的一切_哔哩哔哩_bilibili

        

         

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/927210.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2-2-18-7 QNX 系统架构-动态链接

阅读前言 本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个…

PPT不能编辑,按钮都是灰色,怎么办?

PPT文件打开之后,发现无法编辑,再仔细查看发现工具栏中的功能按钮都是灰色的,无法使用,这是什么原因?该如何解决? 原因:无法编辑PPT文件,并且功能按钮都是灰色,这是因为…

PMP–一、二、三模、冲刺–分类–8.质量管理

文章目录 技巧五、质量管理 一模8.质量管理--质量管理计划--质量管理计划包括项目采用的质量标准,到底有没有满足质量需求,看质量标准即可。6、 [单选] 自项目开始以来,作为项目经理同事的职能经理一直公开反对该项目,在讨论项目里…

深度学习中的生成对抗网络(GAN)原理与应用

引言 生成对抗网络(Generative Adversarial Network,简称GAN)是由Ian Goodfellow等人在2014年提出的一种深度学习模型,它通过对抗训练的方式生成与真实数据分布相似的假数据。GAN的出现极大地推动了深度学习和生成模型的研究&…

【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 ✔️ 10.2.1 容器的类型 ✔️10.2.2 容器的名称 ✔️10.2.3 容器与模块化 CSS ✔️ 10.3…

macOS无法打开未验证安装包的解决方案:无法打开‘XXX.pkg’,因为无法验证其是否包含可能危害Mac安全或泄漏隐私的恶意软件

macOS无法打开未验证安装包的解决方案:无法打开‘XXX.pkg’,因为无法验证其是否包含可能危害Mac安全或泄漏隐私的恶意软件 在macOS Ventura及以上版本中,系统安全性进一步加强,默认情况下不允许运行未验证或未签名的应用程序。当…

Springboot项目搭建(8)-用户登出与个人中心修改

1.提要信息 1.1 catch和then方法 then和catch是JavaScript中Promise对象的两个方法,用于处理异步操作的成功(成功回调)和失败(失败回调)情况。这两个方法通常与async/await语法一起使用,但也可以单独使用…

Android Studio 使用插件Database Navigation 连接 sqlite数据库

文章目录 Database Navigation 简介一,Database Navigation 下载二,将sqlite数据库文件存放到本地三,连接sqlite数据库四,使用SQL语句查看数据 Database Navigation 简介 Database Navigation 是一款在 Android Studio 开发环境中…

springboot kafka在kafka server AUTH变动后consumer自动销毁

前言 笔者使用了kafka用来传输数据,笔者在今年10月写了文章,怎么使用配置化实现kafka的装载:springboot kafka多数据源,通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中,kafka broker是加密的&#xff0c…

ansible使用说明

将安装包拷贝到主控端主机 在主控端主机安装ansible,sh setup.sh 确认安装成功后,编辑hosts文件(按步骤逐个添加主机组,不要一开始全部配置好) [site-init]下的主机列表为被控制的主机(按照当前ai建模方案…

5G学习笔记之PRACH

即使是阴天,也要记得出门晒太阳哦 目录 1. 概述 2. PRACH Preamble 3. PRACH Preamble 类型 3.1 长前导码 3.2 短前导码 3.3 前导码格式与小区覆盖 4. PRACH时频资源 4.1 小区所有可用PRACH资源 4.2 SSB和RACH的关系 4.3 PRACH时频资源配置 1. 概述 随机接入…

单点登录深入详解之技术方案总结

技术方案之CAS认证 概述 CAS 是耶鲁大学的开源项目,宗旨是为 web 应用系统提供一种可靠的单点登录解决方案。 CAS 从安全性角度来考虑设计,用户在 CAS 输入用户名和密码之后通过ticket进行认证,能够有效防止密码泄露。 CAS 广泛使用于传统应…

不开流也可以知道文件大小(File类)file.length():long

但是文件的toString是这个东西,所以当你把一个文件对象转json,大概率只有paXXXXX” 这一个key,想要自动转成输出其他的文件大小或者文件名什么的,就自己封装file类,封装fiel的方法

数据结构 (16)特殊矩阵的压缩存储

前言 特殊矩阵的压缩存储是数据结构中的一个重要概念,它旨在通过找出特殊矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布的、值相同的多个矩阵元素压缩存储到一个存储空间中,从而节省存储空间。 一、特殊矩阵的定义 特殊矩阵是指具有…

试题转excel;试题整理工具;试卷转excel;word转excel

一、问题描述 我父亲是一名教师,偶尔会需要将试卷转excel,方便管理处理一些特别重要的题目 于是,就抽空写一个专门将试题转excel的工具,便于各位教师从业者和教育行业的朋友更好的整理试题,减少一点重复枯燥的工作 …

CSP/信奥赛C++语法基础刷题训练(36):洛谷P11229:[CSP-J 2024] 小木棍

CSP/信奥赛C语法基础刷题训练(36):洛谷P11229:[CSP-J 2024] 小木棍 题目描述 小 S 喜欢收集小木棍。在收集了 n n n 根长度相等的小木棍之后,他闲来无事,便用它们拼起了数字。用小木棍拼每种数字的方法如…

【NLP 4、数学基础】

此去经年,应是良辰美景虚设 —— 24.11.28 一、线性代数 1.标量和向量 ① 标量 Scalar 一个标量就是一个单独的数 ② 向量 Vector 一个向量是一列数 可以把向量看作空间中的点,每个元素是不同坐标轴上的坐标 向量中有几个数,就叫作几维…

IOC控制反转DI依赖注入(Java EE 学习笔记06)

1 IoC 控制反转 控制反转(Inversion of Control,缩写为IoC)是面向对象编程中的一个设计原则,用来降低程序代码之间的耦合度。在传统面向对象编程中,获取对象的方式是用new关键字主动创建一个对象,也就是说…

68 mysql 的 临键锁

前言 我们这里来说的就是 我们在 mysql 这边常见的 一种锁, 行临键锁 虽然 在平时我们用到的不是很多, 我们这里 主要是 讲一下 它的主要的触发的场景 行临键锁 等价于 行锁 间隙锁, 行间隙锁是一个 左开右开的区间, 行临键锁 是一个左开右闭的区间 但是 它 和 行锁的差异…

(数据结构与算法)如何提高学习算法的效率?面试算法重点有哪些?面试需要哪些能力?

面试官眼中的求职者 通过对你算法的考察!!!! 缩进太多!!一般不要超过三层!!!缩进越少,bug越少;逻辑比较复杂,把这些包装成为函数&…