unity学习17:unity里的旋转学习,欧拉角,四元数等
目录
1 三维空间里的旋转与欧拉角,四元数
1.1 欧拉角比较符合直观
1.2 四元数
1.3 下面是欧拉角和四元数的一些参考文章
2 关于旋转的这些知识点
2.1 使用euler欧拉角旋转
2.2 使用quaternion四元数,w,x,y,z
2.3 使用quaternion四元数,类 Vector3.zero 这种固定坐标了,固定的旋转?
2.4 利用unity编辑器,在unity里通过看向一个物体而实现旋转
2.5 互转
2.5.1 使用Euler转化为quaternion四元数
2.5.2 使用quaternion四元数转化为Euler角
3 逐一测试旋转效果
3.1 直接使用Euler角Vector3(0,30,0)来旋转
3.2 直接使用quaternion四元数旋转
3.3 将quaternion四元数转化为Euler角后旋转
3.4 用欧拉角转成四元数后旋转
3.5 直接用Quaternion.AngleAxis *Quaternion.AngleAxis 实现同时绕着多轴旋转
3.6 直接用Quaternion.AngleAxis *Quaternion.AngleAxis 实现同时绕着多轴旋转
3.7 下面是完整的测试草稿代码
4 未解决的问题
4.1 不了解为啥上面有的时候可以持续旋转,有时候只能旋转1次
4.2 关于下面的匀速代码
5 另外一种匀速代码
1 三维空间里的旋转与欧拉角,四元数
- 欧拉角,四元数,都是用来表达三维空间里的旋转的
1.1 欧拉角比较符合直观
欧拉角与四元数-CSDN博客文章浏览阅读1.6w次,点赞29次,收藏127次。一、欧拉角静态的定义对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。如图所示。设定xyz-轴为参考系的参考轴。称xy-平面与XY-平面的相交为交点线,用英文字母(N)代表。zxz顺规的欧拉角可以静态地这样定义:α\alphaα 是 x-轴与交点线的夹角,β\betaβ 是z-..._欧拉角和四元数的区别https://blog.csdn.net/ViatorSun/article/details/102713679
unity里的E,旋转,很明显表示方式就是欧拉角的3种旋转轴
1.2 四元数
- 我们用复数(两个数字)可以表示二维上的旋转,那么是不是用三个数字(三元数)可以表示三维空间中的旋转呢?数学家告诉我们不是的,要表示三维空间中的旋转,我们得用四元数。
- unity 里不只支持欧拉角,也支持用 四元数,表达三维空间里的旋转
-
四元数的基本数学方程为 : q = cos (a/2) + i(x * sin(a/2)) + j(y * sin(a/2)) + k(z * sin(a/2)) 其中a表示旋转角度,(x,y,z)表示旋转轴。
-
四元数的定义:q = [w,x,y,z]其中w是实部,当然也有资料会把四元数写成q = [x,y,z,w]其中w是实部。这都是正确的
-
注意:四元数q,有q^2 = 1.
若想要某个物体(i,j,k)绕着a(x,y,z)轴旋转θ度。
这个旋转用四元数表示就是q = ((x,y,z)sinθ/2, cosθ/2)
该物体用四元数表示为p = ((j,j,k),0)。
那么旋转之后的物体的点为p′,
则:
通过某个公式能算出p′的值。
Quaternion.AngleAxis (30.0f, transform.right) 这个方法的意思是创建一个四元数表示饶transform.right轴旋转30度。
四元数可以用*操作符来进行多个旋转操作比如:
transform.rotation =
Quaternion.AngleAxis (30.0f, transform.right) * Quaternion.AngleAxis (30.0f,transform.up);
也可以用 Quaternion.Euler 欧拉旋转表示四元数旋转比如:
transform.rotation = Quaternion.Euler (new Vector3 (0.0f, 30.0f, 20.0f)) * Quaternion.AngleAxis (30.0f, transform.forward);
如果想对一个向量做旋转做法如下:
Vector3 someVector = new Vector3 (1.0f,1.0f,1.0f);
Vector3 newVector = Quaternion.AngleAxis(90, Vector3.up) * someVector;Quaternion.LookRotation(某个向量v) 使得物体的朝向和v一致
利用四元数做差值(Quaternion.Slerp)旋转:
transform.rotation = Quaternion.Slerp (transform.rotation,Quaternion.Euler (new Vector3 (0.0f, 30.0f, 0.0f)) * Quaternion.AngleAxis (30.0f, transform.forward),Time.deltaTime * 0.33f);
1.3 下面是欧拉角和四元数的一些参考文章
https://zhuanlan.zhihu.com/p/267359507https://zhuanlan.zhihu.com/p/267359507
https://zhuanlan.zhihu.com/p/513687673https://zhuanlan.zhihu.com/p/513687673
https://www.zhihu.com/question/23005815https://www.zhihu.com/question/23005815
https://zhuanlan.zhihu.com/p/27471300https://zhuanlan.zhihu.com/p/27471300
2 关于旋转的这些知识点
2.1 使用euler欧拉角旋转
- Vector3 rotate1 = new Vector3(0,30,0);
- 在unity里表示,绕着Y轴旋转30度
2.2 使用quaternion四元数,w,x,y,z
- 其中W是实数部分
- xyz是虚数部分
- Quaternion quaternion1 = new Quaternion(0,0,0,0);
Quaternion.AngleAxis (30.0f, transform.right)
2.3 使用quaternion四元数,类 Vector3.zero 这种固定坐标了,固定的旋转?
- Quaternion quaternion2 = Quaternion.identity;
2.4 利用unity编辑器,在unity里通过看向一个物体而实现旋转
- quaternion2 = Quaternion.LookRotation(new Vector3(0,0,0));
2.5 互转
2.5.1 使用Euler转化为quaternion四元数
- quaternion2 = Quaternion.Euler(rotate1);
2.5.2 使用quaternion四元数转化为Euler角
- rotate2 = quaternion2.eulerAngles;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//使用euler欧拉角旋转Vector3 rotate1 = new Vector3(0,30,0);//使用quaternion四元数,xyzw?Quaternion quaternion1 = new Quaternion(0,0,0,0);//使用quaternion四元数,类 Vector3.zero 这种固定坐标了,固定的旋转?Quaternion quaternion2 = Quaternion.identity;//利用unity编辑器,在unity里通过看向一个物体而实现旋转//重新给quaternion2赋值quaternion2 = Quaternion.LookRotation(new Vector3(0,0,0));///互转//使用Euler转化为quaternion四元数quaternion2 = Quaternion.Euler(rotate1);//使用quaternion四元数转化为Euler角//给rotate2赋值,需要先定义rotate2Vector3 rotate2 = new Vector3(0,0,0);rotate2 = quaternion2.eulerAngles;}// Update is called once per framevoid Update(){}
}
3 逐一测试旋转效果
3.1 直接使用Euler角Vector3(0,30,0)来旋转
Vector3 rotate1 = new Vector3(0,30,0);
this.transform.Rotate(rotate1);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//使用euler欧拉角旋转Vector3 rotate1 = new Vector3(0,30,0);this.transform.Rotate(rotate1); }
}
3.2 直接使用quaternion四元数旋转
- w,xyz ,其中w是实数部分,xyz都是*i的虚数部分
- 比如
- new Quaternion(0.866f,0,0,0.5f);
- new Quaternion(0,0,0,0);
- Quaternion.identity;
- //quaternion1不能持续旋转这个方法?this.transform.Rotate(quaternion1);
- //只能用this.transform.rotation 旋转到指定位置,而不能持续旋转
- this.transform.rotation = quaternion1;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//使用euler欧拉角旋转//Vector3 rotate1 = new Vector3(0,30,0);//使用quaternion四元数,w,xyz ,其中w是实数部分,xyz都是*i的虚数部分Quaternion quaternion1 = new Quaternion(0.866f,0,0,0.5f); //quaternion1不能持续旋转这个方法?this.transform.Rotate(quaternion1); //只能用this.transform.rotation 旋转到指定位置,而不能持续旋转this.transform.rotation = quaternion1;}
}
3.3 将quaternion四元数转化为Euler角后旋转
- quaternion1.eulerAngles 可以将quaternion四元数转化为Euler角
- rotate2 = quaternion1.eulerAngles;
Quaternion quaternion1 = new Quaternion(0.866f,0,0,0.5f);
Vector3 rotate2 = new Vector3(0,0,0);
rotate2 = quaternion1.eulerAngles;
this.transform.Rotate(rotate2);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){Quaternion quaternion1 = new Quaternion(0.866f,0,0,0.5f); Vector3 rotate2 = new Vector3(0,0,0);rotate2 = quaternion1.eulerAngles;this.transform.Rotate(rotate2); }
}
3.4 用欧拉角转成四元数后旋转
// 创建一个表示xx度旋转欧拉角,然后转换为的四元数,表示绕Y轴旋转
Quaternion rotate3 = Quaternion.Euler(0, 45, 0);
// 假设你有一个现有的四元数
Quaternion originalQuaternion = Quaternion.identity;
// 转换为30度旋转
Quaternion newQuaternion = rotate3 * originalQuaternion;
// 应用到游戏对象
this.transform.rotation = newQuaternion;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){// 创建一个表示xx度旋转欧拉角,然后转换为的四元数,表示绕Y轴旋转Quaternion rotate3 = Quaternion.Euler(0, 45, 0);// 假设你有一个现有的四元数Quaternion originalQuaternion = Quaternion.identity;// 转换为30度旋转Quaternion newQuaternion = rotate3 * originalQuaternion;// 应用到游戏对象this.transform.rotation = newQuaternion;}
}
3.5 直接用Quaternion.AngleAxis *Quaternion.AngleAxis 实现同时绕着多轴旋转
- this.transform.rotation = Quaternion.AngleAxis (90.0f, transform.right) * Quaternion.AngleAxis (30.0f, transform.up);
- Quaternion.AngleAxis (90.0f, transform.right) // 绕着right轴X轴旋转90
- Quaternion.AngleAxis (30.0f, transform.up) // 绕着up轴y轴旋转30
- this.transform.rotation 可以实现连续旋转,不知道为啥上面的只能转1次
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){this.transform.rotation = Quaternion.AngleAxis (90.0f, transform.right) * Quaternion.AngleAxis (30.0f, transform.up);}
}
3.6 直接用Quaternion.AngleAxis *Quaternion.AngleAxis 实现同时绕着多轴旋转
- 但是其中一个Quaternion 用欧拉角转化而来
- this.transform.rotation = Quaternion.Euler (new Vector3 (0.0f, 90.0f, 0.0f)) * Quaternion.AngleAxis (30.0f, transform.up);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){this.transform.rotation = Quaternion.Euler (new Vector3 (0.0f, 90.0f, 0.0f)) * Quaternion.AngleAxis (30.0f, transform.up);}
}
3.7 下面是完整的测试草稿代码
如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//使用euler欧拉角旋转//Vector3 rotate1 = new Vector3(0,30,0);//this.transform.Rotate(rotate1); //使用quaternion四元数,xyzw?//Quaternion quaternion1 = new Quaternion(0,0,0,0);//使用quaternion四元数,类 Vector3.zero 这种固定坐标了,固定的旋转?//Quaternion quaternion2 = Quaternion.identity;//利用unity编辑器,在unity里通过看向一个物体而实现旋转//重新给quaternion2赋值// quaternion2 = Quaternion.LookRotation(new Vector3(0,0,0));///互转//使用Euler转化为quaternion四元数//quaternion2 = Quaternion.Euler(rotate1);//使用quaternion四元数转化为Euler角//给rotate2赋值,需要先定义rotate2//Vector3 rotate2 = new Vector3(0,0,0);//rotate2 = quaternion2.eulerAngles;}// Update is called once per framevoid Update(){//使用euler欧拉角旋转//Vector3 rotate1 = new Vector3(0,30,0);//使用quaternion四元数,w,xyz ,其中w是实数部分,xyz都是*i的虚数部分//Quaternion quaternion1 = new Quaternion(0.866f,0,0,0.5f); //quaternion1不能持续旋转这个方法?this.transform.Rotate(quaternion1); //只能用this.transform.rotation 旋转到指定位置,而不能持续旋转//this.transform.rotation = quaternion1;//Quaternion quaternion1 = new Quaternion(0.866f,0,0,0.5f); //Vector3 rotate2 = new Vector3(0,0,0);//rotate2 = quaternion1.eulerAngles;//this.transform.Rotate(rotate2); // 创建一个表示xx度旋转欧拉角,然后转换为的四元数,表示绕Y轴旋转//Quaternion rotate3 = Quaternion.Euler(0, 45, 0);// 假设你有一个现有的四元数//Quaternion originalQuaternion = Quaternion.identity;// 转换为30度旋转//Quaternion newQuaternion = rotate3 * originalQuaternion;// 应用到游戏对象//this.transform.rotation = newQuaternion;// 多个四元数旋转操作相乘 *,然后转换为的四元数//其中四元数也可以被替换为 欧拉角this.transform.rotation = Quaternion.Euler (new Vector3 (0.0f, 90.0f, 0.0f)) * Quaternion.AngleAxis (30.0f, transform.up);}
}
4 未解决的问题
4.1 不了解为啥上面有的时候可以持续旋转,有时候只能旋转1次
4.2 关于下面的匀速代码
- 不理解下面的匀速代码
- 不理解匀速代码下,为啥改速度没效果?改轴也没效果?
5 另外一种匀速代码
using UnityEngine;public class RotateObject : MonoBehaviour
{// 旋转速度,度/秒public float speed = 30.0f; // 旋转轴public Vector3 axis = Vector3.right; void Update(){// 计算旋转量//Time.deltaTime 是上一帧的时间,可以实现不同机器的匀速播放效果float angle = speed * Time.deltaTime;// 绕axis轴旋转objecttransform.Rotate(axis, angle);}
}
相关文章:

unity学习17:unity里的旋转学习,欧拉角,四元数等
目录 1 三维空间里的旋转与欧拉角,四元数 1.1 欧拉角比较符合直观 1.2 四元数 1.3 下面是欧拉角和四元数的一些参考文章 2 关于旋转的这些知识点 2.1 使用euler欧拉角旋转 2.2 使用quaternion四元数,w,x,y,z 2.3 使用quaternion四元数,类 Vector3.zero 这种…...

走出实验室的人形机器人,将复刻ChatGPT之路?
1月7日,在2025年CES电子展现场,黄仁勋不仅展示了他全新的皮衣和采用Blackwell架构的RTX 50系列显卡,更进一步展现了他对于机器人技术领域,特别是人形机器人和通用机器人技术的笃信。黄仁勋认为机器人即将迎来ChatGPT般的突破&…...

如何使用wireshark 解密TLS-SSL报文
目录 前言 原理 操作 前言 现在网站都是https 或者 很多站点都支持 http2。这些站点为了保证数据的安全都通过TLS/SSL 加密过,用wireshark 并不能很好的去解析报文,我们就需要用wireshark去解密这些报文。我主要讲解下mac 在 chrome 怎么配置的&…...

电脑有两张网卡,如何实现同时访问外网和内网?
要是想让一台电脑用两张网卡,既能访问外网又能访问内网,那可以通过设置网络路由还有网卡的 IP 地址来达成。 检查一下网卡的连接 得保证电脑的两张网卡分别连到外网和内网的网络设备上,像路由器或者交换机啥的。 给网卡配上不一样的 IP 地…...

定义:除了Vue内置指令以外的其他 v-开头的指令(需要程序员自行扩展定义)作用:自己定义的指令, 可以封装一些 dom 操作, 扩展
1.自定义指令(directives) 1.用法 定义:除了Vue内置指令以外的其他 v-开头的指令(需要程序员自行扩展定义)作用:自己定义的指令, 可以封装一些 dom 操作, 扩展额外功能 语法: ① 局部注册 ●inserted:被绑…...

SpringBoot错误码国际化
先看测试效果: 文件结构 1.中文和英文的错误消息配置 package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/ Getter public enum ExceptionEnum {//# code命名规则:模…...
LeetCode 3066.超过阈值的最少操作数 II:模拟 - 原地建堆O(1)空间 / 优先队列O(n)空间
【LetMeFly】3066.超过阈值的最少操作数 II:模拟 - 原地建堆O(1)空间 / 优先队列O(n)空间 力扣题目链接:https://leetcode.cn/problems/minimum-operations-to-exceed-threshold-value-ii/ 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一次…...
深度学习中的模块复用原则(定义一次还是多次)
文章目录 1. 模块复用的核心原则(1)模块是否有**可学习参数**(2)模块是否有**内部状态**(3)模块的功能需求是否一致 2. 必须单独定义的模块(1)nn.Linear(全连接层&#x…...

Mac——Cpolar内网穿透实战
摘要 本文介绍了在Mac系统上实现内网穿透的方法,通过打开远程登录、局域网内测试SSH远程连接,以及利用cpolar工具实现公网SSH远程连接MacOS的步骤。包括安装配置homebrew、安装cpolar服务、获取SSH隧道公网地址及测试公网连接等关键环节。 1. MacOS打开…...
安全测评主要标准
大家读完觉得有帮助记得关注和点赞!!! 安全测评的主要标准包括多个国际和国内的标准,这些标准为信息系统和产品的安全评估提供了基础和指导。 一、安全测评的主要标准 1.1、国际标准 可信计算机系统评估准则(TC…...

qBittorent访问webui时提示unauthorized解决方法
现象描述 QNAP使用Container Station运行容器,使用Docker封装qBittorrent时,访问IP:PORT的方式后无法访问到webui,而是提示unauthorized,如图: 原因分析 此时通常是由于设备IP与qBittorrent的ip地址不在同一个网段导致…...
504 Gateway Timeout:网关超时解决方法
一、什么是 504Gateway Timeout? 1. 错误定义 504 Gateway Timeout 是 HTTP 状态码的一种,表示网关或代理服务器在等待上游服务器响应时超时。通俗来说,这是服务器之间“对话失败”导致的。 2. 常见触发场景 Nginx 超时:反向代…...
Vue 实现当前页面刷新的几种方法
以下是 Vue 中实现当前页面刷新的几种方法: 方法一:使用 $router.go(0) 方法 通过Vue Router进行重新导航,可以实现页面的局部刷新,而不丢失全局状态。具体实现方式有两种: 实现代码: <template&g…...
MCP Server开发的入门教程(python和pip)
使用python技术栈开发的简单mcp server 需要安装 MCP server的需要使用python-sdk,python需要 3.10,安装如下 pip install mcpPS: MCP官方使用的是uv包管理工具,我平时使用pip比较多,所以文中以pip为主。因为mcp的一些依赖包版本并不是最新的,所以最好弄一个干净的环境…...

手撕Transformer -- Day7 -- Decoder
手撕Transformer – Day7 – Decoder Transformer 网络结构图 目录 手撕Transformer -- Day7 -- DecoderTransformer 网络结构图Decoder 代码Part1 库函数Part2 实现一个解码器Decoder,作为一个类Part3 测试 参考 Transformer 网络结构 Decoder 代码 Part1 库函数…...
C#异步和多线程,Thread,Task和async/await关键字--12
目录 一.多线程和异步的区别 1.多线程 2.异步编程 多线程和异步的区别 二.Thread,Task和async/await关键字的区别 1.Thread 2.Task 3.async/await 三.Thread,Task和async/await关键字的详细对比 1.Thread和Task的详细对比 2.Task 与 async/await 的配合使用 3. asy…...
使用分割 Mask 和 K-means 聚类获取天空的颜色
引言 在计算机视觉领域,获取天空的颜色是一个常见任务,广泛应用于天气分析、环境感知和图像增强等场景。本篇博客将介绍如何通过已知的天空区域 Mask 提取天空像素,并使用 K-means 聚类分析天空颜色,最终根据颜色占比查表得到主导…...
145.《redis原生超详细使用》
文章目录 什么是redisredis 安装启动redis数据类型redis key操作key 的增key 的查key 的改key 的删key 是否存在key 查看所有key 「设置」过期时间key 「查看」过期时间key 「移除」过期时间key 「查看」数据类型key 「匹配」符合条件的keykey 「移动」到其他数据库 redis数据类…...

Pytorch基础教程:从零实现手写数字分类
文章目录 1.Pytorch简介2.理解tensor2.1 一维矩阵2.2 二维矩阵2.3 三维矩阵 3.创建tensor3.1 你可以直接从一个Python列表或NumPy数组创建一个tensor:3.2 创建特定形状的tensor3.3 创建三维tensor3.4 使用随机数填充tensor3.5 指定tensor的数据类型 4.tensor基本运算…...

【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统
文章目录 参考资料云盘资料软硬件环境手机解锁刷机驱动绑定账号和设备解锁手机 Mindows工具箱安装工具箱和修复下载下载安卓和woa资源包第三方Recovery 一键安装Windows准备工作创建分区安装系统 效果展示Windows和Android一键互换Win切换安卓安卓切换Win 删除分区 参考资料 解…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...