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. 使用建议

  1. 性能优化

    • 优先使用sqrMagnitude代替magnitude
    • 避免频繁创建新的Vector3实例
    • 合理使用向量缓存
  2. 精度控制

    • 使用Mathf.Approximately比较浮点数
    • 注意向量运算的精度损失
  3. 常见陷阱

    • 注意向量归一化时的零向量情况
    • 注意叉乘的方向性
    • 注意角度计算的范围限制

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

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

相关文章

Neo4j 数据建模:原理、技术与实践指南

Neo4j 作为领先的图数据库,其核心优势在于利用图结构直观地表达和高效地查询复杂关系。其数据建模理念与传统关系型数据库截然不同,专注于实体(节点)及其连接(关系)。以下基于官方文档,系统阐述其建模原理、关键技术、实用技巧及最佳实践: 一、 核心原理:以关系为中心…

volka 25个短语动词

以下是分句分段后的内容&#xff1a; 3,000. Thats 95% of spoken English. And I am teaching you all of these words. First, Ill teach you todays words. And then youll hear them in real conversations. With my brother. Stick around until the end, because witho…

服务器中日志分析的作用都有哪些

服务器日志是用来检测和排查可疑行为的主要工具&#xff0c;运维团队可以通过分析和解读日志文件&#xff0c;发现服务器中潜在的网络安全威胁或异常活动&#xff0c;下面&#xff0c;就让小编和大家一起来了解一下服务器中日志分析的作用都有什么吧&#xff01; 对于服务器中的…

嵌入式硬件篇---龙芯2k1000串口

针对串口错误 “device reports readiness to read but returned no data (Device disconnected or multiple access on port?)” 的排查和解决方法 硬件方面 检查连接 确认串口设备(如串口线、连接的模块等)与龙芯设备之间的物理连接是否牢固,没有松动、脱落情况。尝试重新…

基于langchain的简单RAG的实现

闲来无事&#xff0c;想研究一下RAG的实现流程&#xff0c;看网上用langchain的比较多&#xff0c;我自己在下面也跑了跑&#xff0c;代码很简单&#xff0c;以次博客记录一下&#xff0c;方便回顾 langchain LangChain 是一个基于大型语言模型&#xff08;LLM&#xff09;开发…

视频监控平台建设方案

第三方视频监控平台是整合视频监控、门禁、报警等多业务的安防软件系统,具备兼容性、开放性、多业务整合和多级联网能力。其核心价值在于兼容友商编解码设备(如 IPC、DVR)、整合第三方子系统(如报警联动)、支持多级多域架构(适应平安城市等大规模场景)及提供集中存储方案…

天机学堂(学习计划和进度)

经过前面的努力&#xff0c;我们已经完成了《我的课程表》相关的功能的基础部分&#xff0c;不过还有功能实现的并不完善。还记得昨天给大家的练习题吗&#xff1f;《查询我正在学习的课程》&#xff0c;在原型图中有这样的一个需求&#xff1a; 我们需要在查询结果中返回已学习…

软件项目管理(3) 软件项目任务分解

一、相关概念 1.任务分解的方法和步骤 &#xff08;1&#xff09;方法 模板参照方法&#xff1a;参照有标准或半标准的任分解结构图类比方法&#xff1a;任务分解结构图经常被重复使用&#xff0c;具有相似性自顶向下方法&#xff1a;一般->特殊&#xff0c;演绎推理从大…

Vite 双引擎架构 —— Esbuild 概念篇

Vite 底层采用 双引擎架构&#xff0c;核心构建引擎是 Esbuild 和 Rollup&#xff0c;二者在开发和生产环境中分工协作&#xff0c;共同实现高性能构建。不可否认&#xff0c;作为 Vite 的双引擎之一&#xff0c;Esbuild 在很多关键的构建阶段(如依赖预编译、TS 语法转译、代码…

leetcode hot100 链表(二)

书接上回&#xff1a; leetcode hot100 链表&#xff08;一&#xff09;-CSDN博客 8.删除链表的倒数第N个结点 class Solution { public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* currhead;int len0;while(curr){currcurr->next;len;}int poslen-n…

Compose Multiplatform 实现自定义的系统托盘,解决托盘乱码问题

Compose Multiplatform是 JetBrains 开发的声明式 UI 框架&#xff0c;可让您为 Android、iOS、桌面和 Web 开发共享 UI。将 Compose Multiplatform 集成到您的 Kotlin Multiplatform 项目中&#xff0c;即可更快地交付您的应用和功能&#xff0c;而无需维护多个 UI 实现。 在…

C++11 Move Constructors and Move Assignment Operators 从入门到精通

文章目录 一、引言二、基本概念2.1 右值引用&#xff08;Rvalue References&#xff09;2.2 移动语义&#xff08;Move Semantics&#xff09; 三、移动构造函数&#xff08;Move Constructors&#xff09;3.1 定义和语法3.2 示例代码3.3 使用场景 四、移动赋值运算符&#xff…

Linux配置yum 时间同步服务 关闭防火墙 关闭ESlinux

1、配置yum 1.1、Could not resolve host: mirrorlist.centos.org; 未知的错误 https://blog.csdn.net/fansfi/article/details/146369946?fromshareblogdetail&sharetypeblogdetail&sharerId146369946&sharereferPC&sharesourceRockandrollman&sharefr…

使用 uv 工具快速部署并管理 vLLM 推理环境

uv&#xff1a;现代 Python 项目管理的高效助手 uv&#xff1a;Rust 驱动的 Python 包管理新时代 在部署大语言模型&#xff08;LLM&#xff09;推理服务时&#xff0c;vLLM 是一个备受关注的方案&#xff0c;具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…

基于sqlite的任务锁(支持多进程/多线程)

前言 介绍 任务锁,在多进程服务间控制耗时任务的锁,确保相同id的耗时任务同时只有一个在执行 依赖 SqliteOp,参考这篇文章 https://blog.csdn.net/weixin_43721000/article/details/137019125 实现方式 utils/taskLock.py import timefrom utils.SqliteOp import Sqli…

html表格转换为markdown

文章目录 工具功能亮点1.核心实现解析1. 剪贴板交互2. HTML检测与提取3. 转换规则设计 2. 完整代码 在日常工作中&#xff0c;我们经常遇到需要将网页表格快速转换为Markdown格式的场景。无论是文档编写、知识整理还是数据迁移&#xff0c;手动转换既耗时又容易出错。本文将介绍…

IDEA 中 Undo Commit,Revert Commit,Drop Commit区别

一、Undo Commit 适用情况&#xff1a;代码修改完了&#xff0c;已经Commit了&#xff0c;但是还未push&#xff0c;然后发现还有地方需要修改&#xff0c;但是又不想增加一个新的Commit记录。这时可以进行Undo Commit&#xff0c;修改后再重新Commit。如果已经进行了Push&…

【Linux】Linux 进程间通讯-管道

参考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/125864580 一、进程间通讯介绍 1.1 进程间通讯的概念 进程通信&#xff08;Interprocess communication&#xff09;&#xff0c;简称&#xff1a;IPC 本来进程之间是相互独立的。但是由于不同的进程…

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…

第34次CCF-CSP认证真题解析(目标300分做法)

第34次CCF-CSP认证 矩阵重塑&#xff08;其一&#xff09;AC代码及解析矩阵重塑&#xff08;其二&#xff09;AC代码及解析货物调度AC代码及解析 矩阵重塑&#xff08;其一&#xff09; 输入输出及样例&#xff1a; AC代码及解析 1.线性化原矩阵 &#xff1a;由于cin的特性我们…