Unity基础-数学向量
Unity基础-数学向量
二、向量相关用法
概述
向量在Unity游戏开发中扮演着重要角色,用于表示位置、方向、速度等。Unity提供了Vector2、Vector3等结构体来处理向量运算。
1. 向量基础操作
1.1 向量创建和访问
// 创建向量
Vector3 position = new Vector3(1, 2, 3);
Vector2 position2D = new Vector2(1, 2);// 访问向量分量
float x = position.x;
float y = position.y;
float z = position.z;
1.2 向量运算
// 向量加减
Vector3 v1 = new Vector3(1, 2, 3);
Vector3 v2 = new Vector3(4, 5, 6);
Vector3 sum = v1 + v2; // 结果:(5, 7, 9)
Vector3 diff = v2 - v1; // 结果:(3, 3, 3)// 向量数乘
Vector3 scaled = v1 * 2; // 结果:(2, 4, 6)
2. 向量重要方法
2.1 向量点乘(Dot Product)
// 点乘用于计算两个向量的夹角
float dot = Vector3.Dot(v1, v2);// 实际应用:判断物体相对位置
// 如果点乘结果 > 0,表示物体在前方
// 如果点乘结果 < 0,表示物体在后方
if(Vector3.Dot(transform.forward, target.position - transform.position) > 0)
{print("目标在前方");
}
2.2 向量叉乘(Cross Product)
// 叉乘用于获取垂直于两个向量的向量
Vector3 cross = Vector3.Cross(v1, v2);// 实际应用:判断左右方向
// 如果叉乘结果的y分量 > 0,表示在右侧
// 如果叉乘结果的y分量 < 0,表示在左侧
if(Vector3.Cross(transform.forward, target.position - transform.position).y > 0)
{print("目标在右侧");
}
2.3 向量夹角计算
// 方法1:使用点乘和反三角函数
float dot = Vector3.Dot(v1.normalized, v2.normalized);
float angle = Mathf.Acos(dot) * Mathf.Rad2Deg;// 方法2:直接使用Vector3.Angle
float angle = Vector3.Angle(v1, v2);
3. 向量插值
3.1 线性插值(Lerp)
// 在两个向量之间进行线性插值
Vector3 result = Vector3.Lerp(start, end, t); // t的范围是[0,1]
3.2 球形插值(Slerp)
// 在两个向量之间进行球形插值,保持匀速旋转
Vector3 result = Vector3.Slerp(start, end, t);
4. 向量常用属性
Vector3 v = new Vector3(3, 4, 0);// 向量长度
float magnitude = v.magnitude; // 结果:5// 向量平方长度(性能更好)
float sqrMagnitude = v.sqrMagnitude; // 结果:25// 单位向量
Vector3 normalized = v.normalized; // 结果:(0.6, 0.8, 0)// 零向量
Vector3 zero = Vector3.zero; // 结果:(0, 0, 0)// 单位向量
Vector3 one = Vector3.one; // 结果:(1, 1, 1)
5. 实际应用示例
5.1 物体跟随
// 使用Vector3.Lerp实现平滑跟随
transform.position = Vector3.Lerp(transform.position, target.position, Time.deltaTime * speed);
5.2 方向检测
// 检测目标是否在视野范围内
Vector3 directionToTarget = target.position - transform.position;
float angle = Vector3.Angle(transform.forward, directionToTarget);
if(angle < viewAngle && directionToTarget.magnitude < viewDistance)
{print("目标在视野范围内");
}
5.3 巡逻检测
// 检测目标是否在特定区域内
if(Vector3.Dot(transform.forward, target.position - transform.position) > 0)
{if(Vector3.Cross(transform.forward, target.position - transform.position).y > 0){if(Vector3.Angle(transform.forward, target.position - transform.position) < 30 &&Vector3.Distance(transform.position, target.position) < 5){print("发现目标");}}
}
6. 调试工具
// 绘制线段
Debug.DrawLine(start, end, Color.red);// 绘制射线
Debug.DrawRay(origin, direction, Color.blue);
7. 使用建议
-
性能优化:
- 优先使用sqrMagnitude代替magnitude
- 避免频繁创建新的Vector3实例
- 合理使用向量缓存
-
精度控制:
- 使用Mathf.Approximately比较浮点数
- 注意向量运算的精度损失
-
常见陷阱:
- 注意向量归一化时的零向量情况
- 注意叉乘的方向性
- 注意角度计算的范围限制
相关文章:
Unity基础-数学向量
Unity基础-数学向量 二、向量相关用法 概述 向量在Unity游戏开发中扮演着重要角色,用于表示位置、方向、速度等。Unity提供了Vector2、Vector3等结构体来处理向量运算。 1. 向量基础操作 1.1 向量创建和访问 // 创建向量 Vector3 position new Vector3(1, 2,…...
【华为云Astro-服务编排】服务编排中图元的使用与配置
目录 子服务编排图元 子服务编排图元的作用 如何使用子服务编排图元 脚本图元 脚本图元的作用 如何使用脚本图元 记录创建图元 记录创建图元的作用 如何使用记录创建图元 记录删除图元 记录删除图元的作用 如何使用记录删除图元 记录查询图元 记录查询图元的作用…...

1panel面板中部署SpringBoot和Vue前后端分离系统 【图文教程】
1panel面板中部署SpringBoot和Vue前后端分离系统 一,1panel面板部署二,安装OpenResty三,安装MySQL,Redis等Spring boot 运行依赖环境四,SpringBoot 应用配置及打包部署配置打包部署 五 ,前端VUE应用配置打包…...
C++.OpenGL (7/64)摄像机(Camera)
摄像机(Camera) 摄像机系统核心组件 #mermaid-svg-lmysTXAyyzKytiOC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lmysTXAyyzKytiOC .error-icon{fill:#552222;}#mermaid-svg-lmysTXAyyzKytiOC .error-text{fi…...
使用xdocreport导出word
之前java总用freemaker进行导出,但是改xml实在是太繁琐了,这次找了另一个工具进行体验. 一、简单导出 pom引入 <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.core</arti…...
青少年编程与数学 01-011 系统软件简介 05 macOS操作系统
青少年编程与数学 01-011 系统软件简介 05 macOS操作系统 一、历史发展(一)经典 Mac OS(1984-2001)(二)Mac OS X(2001-2016)(三)macOS(2016-至今&…...
Python打卡训练营学习记录Day43
作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 从谷歌图片中拍摄的 10 种不同类别的动物图片 数据预处理 import os from torchvision import datasets, transforms from torch.utils…...

【Android基础回顾】二:handler消息机制
Android 的 Handler 机制 是 Android 应用中实现线程间通信、任务调度、消息分发的核心机制之一,它基于 消息队列(MessageQueue) 消息循环(Looper) 消息处理器(Handler) 组成。 1 handler的使用…...

每日Prompt:每天上班的状态
提示词 一个穿着清朝官服的僵尸脸上贴着符纸,在电脑面前办公,房间阴暗,电脑桌面很乱,烟灰缸里面满是烟头...
.net ORM框架dapper批量插入
.NET ORM 框架 Dapper 批量插入全解析 在 .NET 开发中,与数据库交互是常见需求。Dapper 作为轻量级的 ORM(对象关系映射)库,在简化数据库交互方面表现出色。今天我们就来深入探讨 Dapper 实现批量插入的几种方法。 为什么需要批…...

C++11 右值引用:从入门到精通
文章目录 一、引言二、左值和右值(一)概念(二)区别和判断方法 三、左值引用和右值引用(一)左值引用(二)右值引用 四、移动语义(一)概念和必要性(二…...

.net 使用MQTT订阅消息
在nuGet下载M2Mqtt V4.3.0版本。(支持.net framework) 订阅主题 public void LoadMQQCData() {string enpoint "xxx.xxx.x.x";//ip地址int port 1883;//端口string user "usrname";//用户名string pwd "pwd";//密码…...
Python实现快速排序的三种经典写法及算法解析
今天想熟悉一下python的基础写法,那就从最经典的快速排序来开始吧: 1、经典分治写法(原地排序) 时间复杂度:平均O(nlogn),最坏O(n) 空间复杂度:O(logn)递归栈空间 特点:通过左右指针…...

【递归、搜索与回溯】综合练习(四)
📝前言说明: 本专栏主要记录本人递归,搜索与回溯算法的学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码…...

强化学习入门:Gym实现CartPole随机智能体
前言 最近想开一个关于强化学习专栏,因为DeepSeek-R1很火,但本人对于LLM连门都没入。因此,只是记录一些类似的读书笔记,内容不深,大多数只是一些概念的东西,数学公式也不会太多,还望读者多多指教…...

STM32:CAN总线精髓:特性、电路、帧格式与波形分析详解
声明:此博客是我的学习笔记,所看课程是江协科技的CAN总线课程,知识点都大同小异,我仅进行总结并加上了我自己的理解,所引案例也都是课程中的案例,希望对你的理解有所帮助! 知识点1【CAN总线的概…...

贝叶斯深度学习!华科大《Nat. Commun.》发表BNN重大突破!
华科大提出基于贝叶斯深度学习的超分辨率成像,成功被Nat. Commun.收录。可以说,这是贝叶斯神经网络BNN近期最值得关注的成果之一了。另外还有AAAI 2025上的Bella新框架,计算成本降低了99.7%,也非常值得研读。 显然鉴于BNN“不确定…...

【大模型LLM学习】Flash-Attention的学习记录
【大模型LLM学习】Flash-Attention的学习记录 0. 前言1. flash-attention原理简述2. 从softmax到online softmax2.1 safe-softmax2.2 3-pass safe softmax2.3 Online softmax2.4 Flash-attention2.5 Flash-attention tiling 0. 前言 Flash Attention可以节约模型训练和推理时间…...
三、元器件的选型
前言:我们确立了题目的功能后,就可以开始元器件的选型,元器件的选型关乎到我们后面代码编写的一个难易。 一、主控的选择 主控的选择很大程度上决定我们后续使用的代码编译器,比如ESP32使用的是VScode,或者Arduino&a…...
精益数据分析(95/126):Socialight的定价转型启示——B2B商业模式的价格策略与利润优化
精益数据分析(95/126):Socialight的定价转型启示——B2B商业模式的价格策略与利润优化 在创业过程中,从B2C转向B2B不仅是商业模式的转变,更是定价策略与成本结构的全面重构。今天,我们将通过Socialight的实…...
stm32_DMA
DMA 1. 概念与基本原理 DMA,全称Direct Memory Access,即直接存储器访问。它是微控制器(MCU)、嵌入式处理器中的一个独立硬件模块,用于在无需CPU干预的情况下,在不同内存区域(包括外设寄存器和…...

物联网数据归档之数据存储方案选择分析
在上一篇文章中《物联网数据归档方案选择分析》中凯哥分析了归档设计的两种方案,并对两种方案进行了对比。这篇文章咱们就来分析分析,归档后数据应该存储在哪里?及存储方案对比。 这里就选择常用的mysql及taos数据库来存储归档后的数据吧。 你在处理设备归档表存储方案时对…...
【自动驾驶避障开发】如何让障碍物在 RViz 中‘显形’?呈现感知数据转 Polygon 全流程
【自动驾驶避障开发】如何让障碍物在 RViz 中"显形"?呈现感知数据转 Polygon 全流程 自动驾驶系统中的障碍物可视化是开发调试过程中至关重要的一环。本文将详细介绍如何将自动驾驶感知模块检测到的障碍物数据转换为RViz可显示的Polygon(多边形)形式,实现障碍物…...

【C语言】C语言经典小游戏:贪吃蛇(上)
文章目录 一、游戏背景及其功能二、Win32 API介绍1、Win32 API2、控制台程序3、定位坐标(COORD)4、获得句柄(GetStdHandle)5、获得光标属性(GetConsoleCursorInfo)1)描述光标属性(CO…...
usbutils工具的使用帮助
作为嵌入式系统开发中的常用工具,usbutils 是一套用于管理和调试USB设备的Linux命令行工具集。以下是其核心功能和使用方法的详细说明: 1. 工具组成 核心命令: lsusb:列出所有连接的USB设备及详细信息(默认安装&#…...

vue2中使用jspdf插件实现页面自定义块pdf下载
pdf下载 实现pdf下载的环境安装jspdf插件在项目中使用 实现pdf下载的环境 项目需求案例背景,点击【pdf下载】按钮,弹出pdf下载弹窗,显示需要下载四个模块的下载进度,下载完成后,关闭弹窗即可! 项目使用的是…...

如何防止服务器被用于僵尸网络(Botnet)攻击 ?
防止服务器被用于僵尸网络(Botnet)攻击是关键的网络安全措施之一。僵尸网络是黑客利用大量被感染的计算机、服务器或物联网设备来发起攻击的网络。以下是关于如何防止服务器被用于僵尸网络攻击的技术文章: 防止服务器被用于僵尸网络ÿ…...

基于cornerstone3D的dicom影像浏览器 第二十九章 自定义菜单组件
文章目录 前言一、程序结构1. 菜单数据结构2. XMenu.vue3. XSubMenu.vue4. XSubMenuSlot.vue5. XMenuItem.vue 二、调用流程总结 前言 菜单用于组织程序功能,为用户提供导航。是用户与程序交互非常重要的接口。 开源组件库像Element Plus和Ant Design中都提供了功能…...

【Block总结】DBlock,结合膨胀空间注意模块(Di-SpAM)和频域模块Gated-FFN|即插即用|CVPR2025
论文信息 标题: DarkIR: Robust Low-Light Image Restoration 作者: Daniel Feijoo, Juan C. Benito, Alvaro Garcia, Marcos Conde 论文链接:https://arxiv.org/pdf/2412.13443 GitHub链接:https://github.com/cidautai/DarkIR 创新点 DarkIR提出了…...
【学习笔记】单例类模板
【学习笔记】单例类模板 一、单例类模板 以下为一个通用的单例模式框架,这种设计允许其他类通过继承Singleton模板类来轻松实现单例模式,而无需为每个类重复编写单例实现代码。 // 命名空间(Namespace) 和 模板(Tem…...