Quat 四元數庫使用教程:應用場景概述

基礎概念

四元數是一個包含四個元素的數組 [x, y, z, w],其中 x,y,z表示虛部,w 表示實部。單位四元數常用于表示3D空間中的旋轉。

1. 創建和初始化函數

create() - 創建單位四元數

應用場景:初始化一個新的四元數對象,通常作為其他操作的基礎。

import { create } from 'quat';// 創建一個新的單位四元數 [0, 0, 0, 1]
const quaternion = create();
console.log(quaternion); // [0, 0, 0, 1]

identity(out) - 設置為單位四元數

應用場景:重置四元數為無旋轉狀態,常用于對象的初始化或重置。

import { create, identity } from 'quat';const q = create();
// 對q進行一些操作...
// 重置為單位四元數(無旋轉狀態)
identity(q);

setAxisAngle(out, axis, rad) - 從軸角創建四元數

應用場景:根據旋轉軸和角度創建四元數,常用于繞特定軸旋轉對象。

import { create, setAxisAngle } from 'quat';// 繞Y軸旋轉90度(π/2弧度)
const q = create();
const yAxis = [0, 1, 0];
setAxisAngle(q, yAxis, Math.PI / 2);

fromEuler(out, x, y, z, order) - 從歐拉角創建四元數

應用場景:將歐拉角(如萬向節)轉換為四元數,常用于從用戶輸入或已有數據創建旋轉。

import { create, fromEuler } from 'quat';// 創建一個繞X軸旋轉45度,繞Y軸旋轉90度的四元數
const q = create();
fromEuler(q, 45, 90, 0, 'xyz'); // 角度單位為度

fromMat3(out, m) - 從旋轉矩陣創建四元數

應用場景:從3x3旋轉矩陣轉換為四元數,常用于與其他數學庫或引擎的數據轉換。

import { create, fromMat3 } from 'quat';// 從旋轉矩陣創建四元數
const q = create();
const rotationMatrix = [1, 0, 0,0, 1, 0,0, 0, 1
];
fromMat3(q, rotationMatrix);

2. 查詢和獲取函數

getAxisAngle(out_axis, q) - 獲取旋轉軸和角度

應用場景:提取四元數的旋轉軸和角度信息,用于UI顯示或調試。

import { create, setAxisAngle, getAxisAngle } from 'quat';const q = create();
const axis = [0, 1, 0];
setAxisAngle(q, axis, Math.PI / 4);const resultAxis = [0, 0, 0];
const angle = getAxisAngle(resultAxis, q);
console.log('旋轉軸:', resultAxis); // [0, 1, 0]
console.log('旋轉角度:', angle);    // 0.785 (π/4)

getAngle(a, b) - 獲取兩個四元數之間的角度

應用場景:計算兩個旋轉狀態之間的差異,用于動畫插值或差異檢測。

import { create, setAxisAngle, getAngle } from 'quat';const q1 = create();
const q2 = create();
setAxisAngle(q1, [0, 1, 0], Math.PI / 4);
setAxisAngle(q2, [0, 1, 0], Math.PI / 2);const angleDiff = getAngle(q1, q2);
console.log('角度差異:', angleDiff);

3. 數學運算函數

multiply(out, a, b) - 四元數乘法

應用場景:組合兩個旋轉操作,常用于對象的連續旋轉。

import { create, setAxisAngle, multiply } from 'quat';// 先繞Y軸旋轉90度,再繞X軸旋轉45度
const rotationY = create();
const rotationX = create();
setAxisAngle(rotationY, [0, 1, 0], Math.PI / 2);
setAxisAngle(rotationX, [1, 0, 0], Math.PI / 4);const combinedRotation = create();
multiply(combinedRotation, rotationX, rotationY);

rotateX(out, a, rad) - 繞X軸旋轉

應用場景:在現有旋轉基礎上增加繞X軸的旋轉,常用于第一人稱視角控制。

import { create, rotateX } from 'quat';const currentRotation = create();
// 增加繞X軸的旋轉(如抬頭/低頭)
rotateX(currentRotation, currentRotation, 0.1);

rotateY(out, a, rad) - 繞Y軸旋轉

應用場景:在現有旋轉基礎上增加繞Y軸的旋轉,常用于角色左右轉向。

import { create, rotateY } from 'quat';const currentRotation = create();
// 增加繞Y軸的旋轉(如左右轉頭)
rotateY(currentRotation, currentRotation, 0.1);

rotateZ(out, a, rad) - 繞Z軸旋轉

應用場景:在現有旋轉基礎上增加繞Z軸的旋轉,常用于滾轉操作。

import { create, rotateZ } from 'quat';const currentRotation = create();
// 增加繞Z軸的旋轉(如飛機滾轉)
rotateZ(currentRotation, currentRotation, 0.1);

invert(out, a) - 計算逆四元數

應用場景:計算相反的旋轉,用于撤銷旋轉操作或計算相對旋轉。

import { create, setAxisAngle, invert } from 'quat';const rotation = create();
setAxisAngle(rotation, [0, 1, 0], Math.PI / 4);// 計算相反的旋轉
const inverseRotation = create();
invert(inverseRotation, rotation);

conjugate(out, a) - 計算共軛四元數

應用場景:對于單位四元數,共軛等同于逆,用于旋轉的反向操作。

import { create, conjugate } from 'quat';const q = create();
// 對于單位四元數,共軛等于逆
const conjugateQ = create();
conjugate(conjugateQ, q);

4. 插值函數

slerp(out, a, b, t) - 球面線性插值

應用場景:在兩個旋轉狀態之間平滑過渡,是動畫系統的核心函數。

import { create, setAxisAngle, slerp } from 'quat';const startRotation = create();
const endRotation = create();
setAxisAngle(startRotation, [0, 1, 0], 0);
setAxisAngle(endRotation, [0, 1, 0], Math.PI);// 在起始和結束旋轉之間插值
const interpolatedRotation = create();
slerp(interpolatedRotation, startRotation, endRotation, 0.5); // 50%位置

lerp(out, a, b, t) - 線性插值

應用場景:快速的線性插值,適用于性能要求高的場景或作為slerp的近似。

import { create, setAxisAngle, lerp } from 'quat';const startRotation = create();
const endRotation = create();
setAxisAngle(startRotation, [0, 1, 0], 0);
setAxisAngle(endRotation, [0, 1, 0], Math.PI);const interpolatedRotation = create();
lerp(interpolatedRotation, startRotation, endRotation, 0.5);

sqlerp(out, a, b, c, d, t) - 球面二次插值

應用場景:使用控制點進行更復雜的旋轉插值,適用于高級動畫系統。

import { create, sqlerp } from 'quat';const q1 = create();
const q2 = create();
const q3 = create();
const q4 = create();const result = create();
sqlerp(result, q1, q2, q3, q4, 0.5);

5. 實用工具函數

normalize(out, a) - 歸一化四元數

應用場景:確保四元數為單位長度,防止數值誤差累積。

import { create, normalize } from 'quat';const q = [0.5, 0.5, 0.5, 0.5]; // 非單位四元數
const normalizedQ = create();
normalize(normalizedQ, q);

dot(a, b) - 點積計算

應用場景:計算兩個四元數的相似度,用于檢測旋轉是否相近。

import { create, dot } from 'quat';const q1 = create();
const q2 = create();const similarity = dot(q1, q2);
if (similarity > 0.99) {console.log('兩個旋轉非常接近');
}

equals(a, b) - 近似相等比較

應用場景:比較兩個四元數是否近似相等,用于狀態檢測。

import { create, setAxisAngle, equals } from 'quat';const q1 = create();
const q2 = create();
setAxisAngle(q2, [0, 1, 0], 0.0001); // 很小的旋轉if (equals(q1, q2)) {console.log('兩個旋轉近似相等');
}

random(out) - 生成隨機四元數

應用場景:生成隨機旋轉,用于測試或特殊效果。

import { create, random } from 'quat';const randomRotation = create();
random(randomRotation);
console.log('隨機旋轉:', randomRotation);

6. 高級數學函數

exp(out, a) - 指數函數

應用場景:高級數學運算,用于特定的物理模擬或數學計算。

import { create, exp } from 'quat';const q = create();
const result = create();
exp(result, q);

ln(out, a) - 自然對數

應用場景:與指數函數配合使用,用于復雜的數學運算。

import { create, ln } from 'quat';const q = create();
const result = create();
ln(result, q);

pow(out, a, b) - 冪運算

應用場景:對四元數進行縮放,用于特殊的動畫或數學運算。

import { create, pow } from 'quat';const q = create();
const result = create();
pow(result, q, 2); // 計算q的平方

實際應用示例

1. 3D相機控制

import { create, rotateY, rotateX, multiply } from 'quat';class CameraController {constructor() {this.rotation = create();}// 左右轉頭yaw(angle) {rotateY(this.rotation, this.rotation, angle);}// 抬頭低頭pitch(angle) {const pitchRotation = create();rotateX(pitchRotation, pitchRotation, angle);multiply(this.rotation, this.rotation, pitchRotation);}
}

2. 角色動畫插值

import { create, slerp } from 'quat';class AnimationSystem {interpolateRotation(start, end, progress) {const result = create();slerp(result, start, end, progress);return result;}
}

3. 物體朝向計算

import { create, setAxisAngle, multiply, invert } from 'quat';function lookAtRotation(forward, up) {// 計算物體看向某個方向的旋轉const rotation = create();// 實現lookAt邏輯...return rotation;
}function relativeRotation(from, to) {// 計算從一個朝向到另一個朝向的相對旋轉const inverseFrom = create();invert(inverseFrom, from);const relative = create();multiply(relative, inverseFrom, to);return relative;
}

總結

通過本教程,我們了解了 quat庫中各個函數的應用場景:

  1. 創建和初始化函數:用于創建和設置四元數的初始狀態
  2. 查詢和獲取函數:用于提取四元數的信息
  3. 數學運算函數:實現四元數的基本數學操作
  4. 插值函數:實現旋轉的平滑過渡
  5. 實用工具函數:提供常用的操作和比較功能
  6. 高級數學函數:用于復雜的數學計算

掌握這些函數的應用場景,可以幫助您在3D圖形、游戲開發、機器人學等領域更好地使用四元數來處理旋轉和方向問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/98064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/98064.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/98064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java后端】Spring Boot 多模塊項目實戰:從零搭建父工程與子模塊

如何用 Spring Boot 搭建一個父工程 (Parent Project),并在其中包含多個子模塊 (Module),適合企業級項目或者需要分模塊管理的場景。Spring Boot 多模塊項目實戰:從零搭建父工程與子模塊在日常開發中,我們經常會遇到這樣的需求&am…

企業級AI會議系統技術實現:快鷺如何用AI重構會議全流程

摘要 本文深度解析快鷺AI會議系統的核心技術架構,重點探討其在語音識別、自然語言處理、數據集成和安全防護等方面的技術實現。通過對比傳統會議系統的技術痛點,分析快鷺AI如何通過技術創新實現會議籌備時間減少67%、數據調取速度提升100倍的顯著效果。…

【CSS學習筆記3】css特性

1css三大特性 1.1層疊性:就近原則,最新定義的樣式 1.2繼承性:子標簽集成父標簽的樣式,如文本和字號 行高的繼承:不加單位指的是當前文字大小的倍數 body {font: 12px/1.5 Microsoft YaHei;color: #be1313;} div {…

[C語言]常見排序算法①

1.排序的概念及常見的排序算法排序在咱們日常生活中十分的常見,就好比是網上購物的時候通常能夠選擇按照什么排序,比如價格、評論數量、銷量等。那么接下來咱們就來了解一些關于排序的概念。排序:所謂排序,就是使一串記錄&#xf…

文獻閱讀筆記:RS電子戰測試與測量技術文檔

信息來源:羅德與施瓦茨(Rohde & Schwarz)公司關于電子戰(Electronic Warfare, EW)測試與測量解決方案專業技術文檔。 該文檔由臺灣地區應用工程師Mike Wu撰寫,核心圍繞電子戰基礎、雷達系統、實戰應用及…

別再糾結 Postman 和 Apifox 了!這款開源神器讓 API 測試更簡單

別再糾結 Postman 和 Apifox 了!這款開源神器讓 API 測試更簡單🔥 作為一名開發者,你是否還在為選擇 API 測試工具而糾結?Postman 太重、Apifox 要聯網、付費功能限制多?今天給大家推薦一款完全免費的開源替代方案 ——…

微調神器LLaMA-Factory官方保姆級教程來了,從環境搭建到模型訓練評估全覆蓋

1. 項目背景 開源大模型如LLaMA,Qwen,Baichuan等主要都是使用通用數據進行訓練而來,其對于不同下游的使用場景和垂直領域的效果有待進一步提升,衍生出了微調訓練相關的需求,包含預訓練(pt)&…

創建其他服務器賬號

? 在 /home74 下創建新用戶的完整步驟1. 創建用戶并指定 home 目錄和 shellsudo useradd -m -d /home74/USERNAME -s /bin/bash USERNAME-m:自動創建目錄并復制 /etc/skel 默認配置文件(.bashrc 等)。-d:指定用戶 home 路徑&…

【WebGIS】Vue3使用 VueLeaflet + 天地圖 搭建地圖可視化平臺(基礎用法)

初始化 創建項目 nodejs 18.0.6npm 9.5.1 引入地圖服務 VueLeaflet GitHub - vue-leaflet/vue-leaflet: vue-leaflet 與 vue3 兼容 Vue Leaflet (vue2-leaflet) package.josn安裝版本 直接添加四個依賴 {// ..."scripts": {// ...},"depen…

OpenCV 開發 -- 圖像閾值處理

文章目錄[toc]1 基本概念2 簡單閾值處理cv2.threshold3 自適應閾值處理cv2.adaptiveThreshold更多精彩內容👉內容導航 👈👉OpenCV開發 👈1 基本概念 圖像閾值處理(Thresholding)是圖像處理中的一種基本技術…

單串口服務器-工業級串口聯網解決方案

在工業自動化、智能電網、環境監測等領域,傳統串口設備(如PLC、傳感器、儀表等)的網絡化升級需求日益增長。博為智能單串口服務器憑借高性能硬件架構、多協議支持和工業級可靠性,為RS485設備提供穩定、高效的TCP/IP網絡接入能力&a…

第 9 篇:深入淺出學 Java 語言(JDK8 版)—— 吃透泛型機制,筑牢 Java 類型安全防線

簡介:聚焦 Java 泛型這一“類型安全保障”核心技術,從泛型解決的核心痛點(非泛型代碼的運行時類型錯誤、強制類型轉換冗余)切入,詳解泛型的本質(參數化類型)、核心用法(泛型類/接口/…

MySQL和Redis的數據一致性問題與業界常見解法

一、為什么會出現數據不一致? 根本原因在于:這是一個涉及兩個獨立存儲系統的數據更新操作,它無法被包裝成一個原子操作(分布式事務)。更新數據庫和更新緩存是兩個獨立的步驟,無論在代碼中如何排列這兩個步驟…

coolshell文章閱讀摘抄

coolshell文章閱讀摘抄打好基礎學好英語限制你的不是其它人,也不是環境,而是自己Java打好基礎 程序語言:語言的原理,類庫的實現,編程技術(并發、異步等),編程范式,設計模…

數據庫造神計劃第六天---增刪改查(CRUD)(2)

🔥個人主頁:尋星探路 🎬作者簡介:Java研發方向學習者 📖個人專欄:《從青銅到王者,就差這講數據結構!!!》、 《JAVA(SE)----如此簡單&a…

使用Rust實現服務配置/注冊中心

Conreg 使用 Rust 實現的配置與注冊中心,參考了 Nacos 的設計,簡單易用,使用 Raft 保證集群節點數據一致性。 支持的平臺: UbuntuCentOS其他常見的 Linux 發行版(我們使用 musl 編譯,理論上支持所有主流…

三色標記算法

在 JVM 并發垃圾收集(GC)中,三色標記算法是實現 “GC 線程與用戶線程并行執行” 的關鍵技術,它解決了并發場景下 “如何準確標記存活對象” 的核心問題,是 CMS、G1 等現代收集器的底層基礎。一、三色標記的核心&#x…

OpenStack 管理與基礎操作學習筆記(一):角色、用戶及項目管理實踐

OpenStack實驗 OpenStack命令 admin-openrc.sh 進入管理員視圖查看當前 OpenStack 中的項目列表,驗證是否已經登錄成功切換用戶 修改文件切換用戶上傳文件切換用戶OpenStack 認證管理 實驗介紹 通過 OpenStack Dashboard 和 OpenStack CLI 兩種方式創建角色、用戶、…

直接查找試卷且可以免費下載

有什么網站可以直接查找試卷且可以免費下載? SearXNG開源元搜索引擎 This website shows the SearXNG public instances searx一個可定制的搜索引擎 分享一個基于Blockstack的DApp-searx,一個可定制的搜索引擎。 1- 鏈接 官網地址:https://searx.worl…

【獨立版】智創云享知識付費小程序 v5.0.23+小程序 搭建教程

介紹智創云享知識付費小程序v5.0.23 含PC、小程序、H5 、前端,系統獨立版已修復已知bug問題。框架是一款基于ThinkPHP框架開發的虛擬資源知識付費小程序,為廣大創業者、自媒體及培訓機構提供知識付費、內容付費、資源變現等領域的行業解決方案&#xff1…