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
繁體地址,請注明出處:http://hk.pswp.cn/news/908371.shtml
英文地址,請注明出處:http://en.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的特性我們…