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

        

         

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL注入利用方式(实战Hack World 1)

一、布尔盲注利用 假如注入的网页能返回1或0的提示信息,我们可以写如下代码: select password from admin where username 1 or 11;#11是我们利用的逻辑点,我们能在此处进行一个判断,比如判断某个数据字段第几位上的字符是否为’ 1’&#…

nlp培训重点

SGD梯度下降公式: 当梯度大于0时,变小,往左边找梯度接近0的值。 当梯度小于0时,减去一个负数会变大,往右边找梯度接近0的值,此时梯度从负数到0上升 #coding:utf8import torch import torch.nn as nn impo…

38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机,采用L298N驱动连接P2.3和P2.4口进行电机驱动, 然后串口连接P3.0和P3.1模拟ESP8266, 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo)

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 目录 Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 一、简单介绍 二、PyTorch 三、CNN 1、神经网络 2、卷…

week 6 - SQL Select II

Overview 1. Joins 包括交叉连接(Cross)、内连接(Inner)、自然连接(Natural)、外连接(Outer) 2. ORDER BY to produce ordered output 3. 聚合函数(Aggregate Functio…

算法训练营day23(二叉树09:修建二叉搜索树,有序数组转化为平衡二叉搜索树,二叉搜索树转化为累加树,二叉树专题总结)

第六章 二叉树part09今日内容:● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇 详细布置 669. 修剪二叉搜索树 这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。题目…

C语言操作符深度解析

目录 一、操作符的分类 1、算术操作符 1、1、 和- 1、2、* 1、3、/ 1、4、% 2、赋值操作符:和复合赋值 2、1、连续赋值 2、2、复合赋值符 3、单⽬操作符:、--、、- 3、1、和-- 3、1、1、前置 3、1、2、后置 3、2、1、前置-- 3、2、2、后…

Python 深度学习框架之Keras库详解

文章目录 Python 深度学习框架之Keras库详解一、引言二、Keras的特点和优势1、用户友好2、多网络支持3、跨平台运行 三、Keras的安装和环境配置1、软硬件环境2、Python虚拟环境 四、使用示例1、MNIST手写数字识别 五、总结 Python 深度学习框架之Keras库详解 一、引言 Keras是…

【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑

【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑 目录 文章目录 【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑目录摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果(包含重要数据与结论)相关工作后续优化方向 后记 检索增强…

_C#_串口助手_字符串拼接缺失问题(未知原理)

最近使用WPF开发串口助手时,遇到一个很奇怪的问题,无论是主线程、异步还是多线程,当串口接收速度达到0.016s一次以上,就会发生字符串缺失问题并且很卡。而0.016s就一切如常,仿佛0.015s与0.016s是天堑之隔。 同一份代码…

基于Python的猎聘网招聘数据采集与可视化分析

1.1项目简介 在现代社会,招聘市场的竞争日趋激烈,企业和求职者都希望能够更有效地找到合适的机会与人才。猎聘网作为国内领先的人力资源服务平台,汇聚了大量的招聘信息和求职者数据,为研究招聘市场趋势提供了丰富的素材。基于Pyt…

基于Java Springboot高校社团微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…

springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)

目录 一、删除文章分类功能。 (1)接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 (2)实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…

【前端】特殊案例分析深入理解 JavaScript 中的词法作用域

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯案例代码💯词法作用域(Lexical Scope)与静态作用域什么是词法作用域?代码执行的详细分析 💯函数定义与调用的…

Node.js 实战: 爬取百度新闻并序列化 - 完整教程

很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候,大家会用到python ,因为实现起来很方便。但是其实Node.js 用来爬取网络内容,也是非常强大的。 今天我向大家介绍一下我自己写的一个百度新闻的爬虫,可…

三分钟快速掌握——Linux【vim】的使用及操作方法

一、vim的使用 vim是一个文本编辑器 非常小巧轻便 1.1如何进入vim编辑器 方法一: 首先使用touch 1.c 创建一个源文件 然后使用vim 1.c进入 方法二: 直接使用指令 vim 2.c 会直接创建一个2.c的源文件 退出时记得保存(使用wq或者x&am…

(简单5步实现)部署本地AI大语言模型聊天系统:Chatbox AI + grok2.0大模型

摘要: 本文将指导您如何部署一个本地AI大语言模型聊天系统,使用Chatbox AI客户端应用和grok-beta大模型,以实现高效、智能的聊天体验。 引言: 由马斯克X-AI发布的Grok 2大模型以其卓越的性能超越了GPT4.0。Grok模型支持超长文本…

docker安装hadoop环境

一、使用docker搭建基础镜像 1、拉取centos系统镜像 # 我这里使用centos7为例子 docker pull centos:7 2、创建一个dockerfiler文件,用来构建自定义一个有ssh功能的centos镜像 # 基础镜像 FROM centos:7 # 作者 #MAINTAINER hadoop ADD Centos-7.repo /etc/yum.re…

中国电信张宝玉:城市数据基础设施建设运营探索与实践

11月28日,2024新型智慧城市发展创新大会在山东青岛召开,中国电信数字政府研究院院长张宝玉在大会发表主旨演讲《城市数据基础设施运营探索与实践》。报告内容包括城市数据基础设施的概述、各地典型做法及发展趋势建议三个方面展开。 篇幅限制&#xff0…

Linux内核4.14版本——ccf时钟子系统(6)——DTS相关的API

目录 1. of_clk_add_provider 2. of_clk_get_from_provider 2.1 __of_clk_get_hw_from_provider 2.2 __clk_create_clk 3. of_clk_set_defaults 3.1 __set_clk_parents 3.2 __set_clk_rates 再回到第2章DTS相关的介绍,clock driver使用一个DTS node描述一个c…