Games101学习 - 线性代数综述

news2024/9/25 3:19:19

1. 叉积矩阵形式

叉乘矩阵形式通常在物理模拟中有运用,处理四元数旋转也类似这样的形式。

// 定义两个向量 A 和 B
FVector A(1.0f, 2.0f, 3.0f);
FVector B(4.0f, 5.0f, 6.0f);

// 计算叉积
FVector CrossProduct = FVector::CrossProduct(A, B);

if (GEngine)
{
	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("Cross Product: X=%f, Y=%f, Z=%f"), CrossProduct.X, CrossProduct.Y, CrossProduct.Z));
}

// 创建叉积矩阵 (A × B 的每个分量作为矩阵的列向量)
FMatrix CrossProductMatrix(
	FPlane(0, A.Z, -A.Y, 0),   // 第一列 (X方向,符号调整)
	FPlane(-A.Z, 0, A.X, 0),   // 第二列 (Y方向,符号调整)
	FPlane(A.Y, -A.X, 0, 0),   // 第三列 (Z方向,符号调整)
	FPlane(0, 0, 0, 1)         // 第四列 (恒为单位向量)
);

// 用叉积矩阵与B做矩阵乘法
FVector ResultFromMatrixMultiplication = CrossProductMatrix.TransformVector(B);

// 打印矩阵乘法结果
if (GEngine)
{
	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, FString::Printf(TEXT("Matrix Multiplication Result: X=%f, Y=%f, Z=%f"), ResultFromMatrixMultiplication.X, ResultFromMatrixMultiplication.Y, ResultFromMatrixMultiplication.Z));
}

// 验证结果是否与叉积结果一致
bool bIsCorrect = ResultFromMatrixMultiplication.Equals(CrossProduct, 0.001f);  // 允许小范围误差

if (GEngine)
{
	GEngine->AddOnScreenDebugMessage(-1, 5.f, bIsCorrect ? FColor::Blue : FColor::Red, FString::Printf(TEXT("Cross Product Result is %s"), bIsCorrect ? TEXT("Correct") : TEXT("Incorrect")));
}

在这里插入图片描述

2.用方阵的转置矩阵代替逆矩阵

有时乘以转置矩阵提升性能,此外转置矩阵还有许多性质。

// 定义一个旋转矩阵 (例如,绕Z轴旋转45度)
FRotator Rotation = FRotator(0, 45, 0); // 旋转45度
FMatrix RotationMatrix = FRotationMatrix(Rotation);

// 打印旋转矩阵
if (GEngine)
{
	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("Rotation Matrix:\n%f %f %f\n%f %f %f\n%f %f %f"),
		RotationMatrix.M[0][0], RotationMatrix.M[0][1], RotationMatrix.M[0][2],
		RotationMatrix.M[1][0], RotationMatrix.M[1][1], RotationMatrix.M[1][2],
		RotationMatrix.M[2][0], RotationMatrix.M[2][1], RotationMatrix.M[2][2]));
}

// 创建一个向量
FVector v(1.0f, 0.0f, 0.0f);

// 用旋转矩阵旋转向量 v
FVector RotatedVector = RotationMatrix.TransformVector(v);

// 打印旋转后的向量
if (GEngine)
{
	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, FString::Printf(TEXT("Rotated Vector: X=%f, Y=%f, Z=%f"), RotatedVector.X, RotatedVector.Y, RotatedVector.Z));
}

// 计算旋转矩阵的转置矩阵 (对于旋转矩阵,转置等于逆)
FMatrix TransposedMatrix = RotationMatrix.GetTransposed();

// 用转置矩阵将向量旋转回原来的方向
FVector ReversedVector = TransposedMatrix.TransformVector(RotatedVector);

// 打印恢复后的向量
if (GEngine)
{
	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, FString::Printf(TEXT("Reversed Vector (Using Transpose): X=%f, Y=%f, Z=%f"), ReversedVector.X, ReversedVector.Y, ReversedVector.Z));
}

在这里插入图片描述

3.叉积计算三角形包含关系

可以用叉积通过三角形顺序的正负判断一点是否在三角形内还是三角形外。
在这里插入图片描述
可以给UE5第三人称小白人增加Tick函数,并绘制线段以调试:
.h:

virtual void Tick(float DeltaTime) override;

.cpp:

void AMyProject5Character::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	UWorld* World = GetWorld();
	FVector playerLocation = GetActorLocation();

	auto p0 = FVector(1217.096f, 798.187f, 92.013f);
	auto p1 = FVector(754.616f, 802.829f, 92.013f);
	auto p2 = FVector(766.306f, 1407.715f, 92.013f);

	FVector v0 = p1 - p0;
	FVector v1 = p2 - p1;
	FVector v2 = p0 - p2;

	FVector c0 = FVector::CrossProduct(v0, playerLocation - p0);
	FVector c1 = FVector::CrossProduct(v1, playerLocation - p1);
	FVector c2 = FVector::CrossProduct(v2, playerLocation - p2);

	// 检查叉积是否在同一方向
	bool bIsInside = (c0.Z > 0 && c1.Z > 0 && c2.Z > 0) || (c0.Z < 0 && c1.Z < 0 && c2.Z < 0);

	// 根据是否在三角形内绘制调试线颜色
	FColor LineColor = bIsInside ? FColor::Red : FColor::Green;

	DrawDebugLine(World, p0, p1, LineColor, false, 0.1f, 0, 2.f);
	DrawDebugLine(World, p1, p2, LineColor, false, 0.1f, 0, 2.f);
	DrawDebugLine(World, p2, p0, LineColor, false, 0.1f, 0, 2.f);
}

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

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

相关文章

CVPR2024满分论文:基于可变形三维高斯的高质量单目动态重建方法

一、摘要 隐式神经表征为动态场景的重建和渲染开辟了新的途径。然而&#xff0c;尖端的动态神经渲染方法严重依赖这些隐式表征&#xff0c;它们常常难以捕捉场景中物体的复杂细节。此外&#xff0c;隐式方法通常难以实现动态场景的实时渲染&#xff0c;限制了它们在多种任务中的…

Excel公式与图表自动化:在Python中操作Excel公式并自动化生成图表

目录 一、Python操作Excel公式 1.1 读取Excel文件 1.2 识别和处理公式 1.3 批量处理公式 二、自动化生成图表 2.1 使用pandas和matplotlib生成图表 2.2 使用xlwings在Excel中直接生成图表 2.3 自定义图表样式 2.4 自动化生成复杂图表 三、总结 在数据分析和自动化办公…

VMware Workstation Pro for Personal Use (For Windows) 17.0.0

VMware Workstation Pro for Personal Use (For Windows) 17.0.0 弄了半天终于找到下载地址了 现在VMware被博通&#xff08;broadcom&#xff09;收购且宣布了17.5版本的VMware Workstation Pro对个人用户免费许可使用。由于现在官网的下载方式有改变&#xff0c;故贴出来一…

【数学分析笔记】第2章第4节收敛准则(4)

2.数列极限 2.4 收敛准则 上节课举了一个例子 a N 1 1 2 p 1 3 p . . . 1 n p a_{N}1\frac{1}{2^{p}}\frac{1}{3^{p}}...\frac{1}{n^{p}} aN​12p1​3p1​...np1​ p > 1 p>1 p>1&#xff0c; { a n } \{a_{n}\} {an​}收敛 0 < p ≤ 1 0<p\le 1 0<p≤…

OpenStack——keystone认证服务

1、作用 认证授权 服务目录 2、组件 keystone-server keystone-DB 3、架构 ①组成 用户认证流程&#xff1a; 1.Horizon为用户提供界面; 2.用户输入用户名密码&#xff0c;有Horizon转发至Keystone做认证授权 ; 3.如果认证鉴权成功&#xff0c;会给用户发放一个临时的unscope…

AIGC:Flux.1 NF4 使用 diffusers 推理

背景介绍 Flux 参数量很大 (包括 ext encoder2, autoencoder, 以及 diffusion model) , 使用Diffusers推理,显存占用 30GB。 有大佬做了 NF4 版本,效果依旧能打。所以本文使用 diffusers 推理 NF4版本的 Flux.1 本文重点 1:flux.1-dev-nf4 国内镜像加速下载 2:依赖环境…

error: undefined reference to `__imp__ZN11QSerialPortC1EP7QObject‘

问题 在qt console程序里使用QSerialPot, 在.pro文件里添加了serialport&#xff0c;在main.cpp里也包含了QtSerialPort/QSerialPort&#xff0c;但是编译报错如下&#xff1a; 原因 serialport模块加错了位置&#xff0c;应该添加到QT后面&#xff0c;而实际添加到CONFIG后…

mybatis-plus中Swagger 模式和Kotlin 模式是什么?

在 MyBatis-Plus 中&#xff0c;Swagger 模式和 Kotlin 模式是为了支持特定技术栈和开发需求的两种配置选项。它们分别针对 API 文档生成和 Kotlin 语言提供了更好的支持和集成。 Swagger 模式 Swagger 模式主要用于生成 API 文档。在 MyBatis-Plus 中启用 Swagger 模式后&am…

视频合并怎么弄?高效方法立即学

记得那次家庭聚会&#xff0c;我翻看着那些珍贵的录像带&#xff0c;突然萌生了一个想法&#xff1a;要是能把这些零散的记忆片段合并成一部完整的影片&#xff0c;那该多好啊&#xff01; 于是我开始了视频合并剪辑的探索之旅。从一开始的手足无措&#xff0c;到逐渐熟悉每一…

linux,ubuntu,使用ollama本地部署大模型llama3,模型通用,简易快速安装

文章目录 前言安装ollama启动ollama运行llama3模型查看ollama列表删除模型通过代码进行调用REST API 前言 在拥有了一条4090显卡后&#xff0c;那冗余的性能让你不得不去想着办法整花活&#xff0c;于是就想着部署个llama3&#xff0c;于是发现了ollama这个新大陆&#xff0c;…

【硬件操作入门】2--GPIO与门电路、二极管三极管、LED电路与操作

【硬件操作入门】2–GPIO与门电路&#xff08;二极管&三极管&#xff09;、LED电路与操作 文章目录 【硬件操作入门】2--GPIO与门电路&#xff08;二极管&三极管&#xff09;、LED电路与操作一、GPIO与门电路1.1、GPIO的应用1.2、GPIO引脚操作1.2.1 设置引脚为GPIO功能…

今日算法:蓝桥杯基础题之“切面条”

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注&#xff01;个人知乎 从今天开始&#xff0c;一起了解算法&#xff0c;每日一题&#xff0c;从 JavScript 的技术角度进行解答&#xff0c;如果你对算法也感兴趣&#xff0c;请多多关注哦。 问题描述 一…

网络维护~2003服务环境

一、2003服务环境 背景&#xff1a;学习测试需要在虚拟机进行实验&#xff0c;主机kali验证开源十大漏洞&#xff0c;部分需要2003服务环境。 博客声明:搭建网络是为了学习用途&#xff0c;请遵守《网络安全法》. 二、安装iis服务软件 &#xff08;一&#xff09;查看Internet…

重生奇迹MU 单挑团战全能的职业

若你正在寻找一款能够在重生奇迹MU单挑或团战中表现不怂的职业&#xff0c;那么恭喜你&#xff0c;你来到了正确的地方。在本文中&#xff0c;我们将为你介绍几个在重生奇迹MU中表现出色的职业&#xff0c;并分享一些有用的技巧和策略&#xff0c;帮助你在游戏中获得胜利。不用…

【Linux】进程池实例

这篇博客讲解了进程池的创建过程&#xff0c;并在最后附上了完整代码。 现在有一个父进程&#xff0c;然后提前创建出一批子进程&#xff0c;未来如果父进程master有一些任务要交给子进程去运行&#xff0c;而不用像shell&#xff0c;需要执行命令才回去创建进程&#xff0c;创…

气膜建筑与装配式建筑的对比分析—轻空间

在现代建筑中&#xff0c;气膜建筑和装配式建筑都作为新型建筑形式受到关注。然而&#xff0c;在很多应用场景中&#xff0c;气膜建筑展现出了比装配式建筑更为明显的优势。以下将着重对比气膜建筑相较于装配式建筑的独特优势。 气膜建筑的突出优势 1. 更快的施工速度 气膜建筑…

信号量笔记

1、信号量简介 信号量是一种实现任务间通信的机制&#xff0c;可以实现任务之间同步或临界资源的互斥访问&#xff0c;常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中&#xff0c;各任务之间需要同步或互斥实现临界资源的访问&#xff0c;信号量功能可以为用户提…

智能新时代:探索【人工智能】、【机器学习】与【深度学习】的前沿技术与应用

目录 1. 引言 1.1 人工智能的概念与历史 1.2 机器学习与深度学习的演进 1.3 计算机视觉的崛起与应用场景 2. 人工智能基础 2.1 什么是人工智能&#xff1f; 2.2 人工智能的分类 2.3 人工智能的现实应用 3. 机器学习 3.1 机器学习的定义与基本原理 3.2 机器学习的主要…

【可能是全网最丝滑的LangChain教程】二十二、LangChain进阶之Callbacks(完结篇)

这是LangChain进阶教程的最后一篇&#xff0c;Let’s get it!!! 01 Callback介绍 在LangChain中&#xff0c;Callback 是一种非常重要的机制&#xff0c;它允许用户监听和处理在执行链式任务 (Chain) 过程中的各种事件。这包括但不限于开始执行、结束执行、异常处理等。Callba…

数据结构(邓俊辉)学习笔记】串 03——KMP算法:记忆法

文章目录 1. 重复匹配的前缀2. 不变性3. 记忆力4. 预知力 1. 重复匹配的前缀 关于串匹配&#xff0c;包括蛮力算法在内&#xff0c;至少有30多种知名的算法&#xff0c;而接下来&#xff0c;就将介绍其中最为经典的 KMP 算法。这个算法之所以著名&#xff0c;不仅是由于它出自包…