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,一经查实,立即删除!

相关文章

专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 ubuntu 机器人

专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 在使用 ROS(Robot Operating System)进行开发时,通常会涉及多个 Catkin 工作空间(Catkin Workspace)。这些工作空间包含不同的 ROS 包和节点,可能相互…

第三方Cookie的消亡与Google服务器端标记的崛起

随着互联网用户对隐私保护的关注日益增强,各大浏览器正在逐步淘汰第三方Cookie。这一变革深刻影响了广告商和数字营销人员的用户跟踪和数据分析方式。然而,Google推出的服务器端标记技术为这一挑战提供了新的解决方案。 什么是第三方Cookie? …

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…

Qt5语法的connect指定多个重载信号槽函数中的具体某一个

Qt5新语法的connect函数,使用起来更加简洁明了,但如果信号槽有同名的多个重载函数,只用类名和函数名就无法绑定,这时,可以使用qOverload来指定参数类型,例如: connect(ui->comboBox, qOverlo…

如何在Spark中使用gbdt模型分布式预测

这目录 1 训练gbdt模型2 第三方包python环境打包3 Spark中使用gbdt模型3.1 spark配置文件3.2 主函数main.py 4 spark任务提交 1 训练gbdt模型 我们可以基于lightgbm快速的训练一个gbdt模型,训练相对比较简单,只要把训练样本处理好,几行代码可…

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、卷…

HTML5系列(7)-- Web Storage 实战指南

前端技术探索系列:HTML5 Web Storage 实战指南 🗄️ 致读者:本地存储的新纪元 👋 前端开发者们, 今天我们将深入探讨 HTML5 中的 Web Storage 技术,这是一个强大的本地存储解决方案,让我们能…

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、后…

打造高质量技术文档的关键要素(结合MATLAB)

在技术的浩瀚海洋中,一份优秀的技术文档宛如精准的航海图。它不仅是知识传承的载体,也是团队协作的桥梁,更是产品成功的幕后英雄。打造出色的技术文档并非易事,以下将从多个方向探讨如何做到这一点。 文章目录 方向一:…

《C++与人工智能:照亮能源可持续发展之路》

在全球对能源需求持续攀升以及对可持续发展日益重视的当下,如何有效解决能源领域的复杂问题成为了亟待攻克的关键挑战。而 C与人工智能技术的融合,正犹如一盏明灯,为能源管理、可再生能源预测等方面开辟出全新的路径,有力地推动着…

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

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

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

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

android user版本默认usb模式为充电模式

android插入usb时会切换至默认设置的模式,debug版本为adb,user版本为mtp protected long getChargingFunctions() {// if ADB is enabled, reset functions to ADB// else enable MTP as usual.if (isAdbEnabled()) {return UsbManager.FUNCTION_ADB;} e…

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

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

CF Round988 题解报告

/***实力还是要努力 D 赛时我过了&#xff0c;就不讲了&#xff0c;毕竟我过的也大概是简单题&#xff1b; 代码&#xff1a; #include<iostream> #include<queue> using namespace std; #define int long long int t; int n,m,l; struct hurdle{int l,r,len; …

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

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