当前位置: 首页 > news >正文

Three 数学运算

Three.js -> GLM 替换指南论 (Cheat Sheet)

以后遇到其他的三维数学转换,按照以下几个规则来套,基本不会出错:

1. 范式转换:从“改自身”到“返回值”

Three.js 的方法经常改变对象本身并 return this,而 GLM 返回新值。

  • Three: a.add(b) \(\rightarrow\) GLM: a = a + b 或者 a += b
  • Three: a.cross(b) \(\rightarrow\) GLM: a = glm::cross(a, b)
  • Three: a.normalize() \(\rightarrow\) GLM: a = glm::normalize(a)
  • Three: v.length() \(\rightarrow\) GLM: glm::length(v)
  • Three: v.distanceTo(v2) \(\rightarrow\) GLM: glm::distance(v, v2)

2. 乘法顺序 (极其重要)

Three.js 有时候让人迷惑的 multiplypremultiply,在 C++ 运算符重载下非常清晰:

  • Three: matrix1.multiply(matrix2)

  • GLM: matrix1 = matrix1 * matrix2 (右乘,应用在局部坐标系)

  • Three: matrix1.premultiply(matrix2)

  • GLM: matrix1 = matrix2 * matrix1 (左乘,应用在世界/父坐标系)

3. 矩阵与变换 (Matrix4 -> glm::mat4)

Three.js 的 Matrix4.makeTranslation, makeRotationX 等被 GLM 的一系列全局函数取代,需要引入 <glm/gtc/matrix_transform.hpp>

  • 平移glm::translate(glm::mat4(1.0f), glm::vec3(x, y, z))
  • 缩放glm::scale(glm::mat4(1.0f), glm::vec3(x, y, z))
  • 旋转glm::mat4_cast(quaternion) 或者 glm::rotate(glm::mat4(1.0f), angle, axis)

注意: glm::mat4(1.0f) 表示创建一个单位矩阵(Identity Matrix)。在进行仿射变换时,往往需要一个单位矩阵作为起点。

4. 从矩阵提取位移/旋转/缩放

在 Three.js 中,你经常会用到 matrix.decompose(position, quaternion, scale)
在 GLM 中,这个功能包含在实验扩展中:

#include <glm/gtx/matrix_decompose.hpp>glm::vec3 scale;
glm::quat rotation;
glm::vec3 translation;
glm::vec3 skew;
glm::vec4 perspective;glm::decompose(matrix, scale, rotation, translation, skew, perspective);

5. 内存与指针交互

GLM 的设计可以无缝配合 OpenGL 的 glUniform*glVertexAttribPointer,提取指针的方法非常简单:

  • 提取 Vector3 数据:glm::value_ptr(myVec3) \(\rightarrow\) 变成 float*
  • 提取 Matrix4 数据:glm::value_ptr(myMat4) \(\rightarrow\) 变成 float*
    (需要包含 #include <glm/gtc/type_ptr.hpp>)

遵循这套法则,你在重构 Object3D, Camera, Mesh 的时候,就会感觉非常丝滑,且底层运行效率远超原来的纯面向对象封装!

http://www.zskr.cn/news/1370994.html

相关文章:

  • 【数据分析】智慧城市温度与湿度分析系统【含Matlab源码 15555期】
  • 实测Taotoken多模型路由稳定性,低延迟与高可用性体验分享
  • Agent 一接消息通知中心就开始误点跳转:从 Notification Claim 到 Target Proof 的工程实战
  • 干货合集:2026年真正好用的专业AI论文写作软件
  • 如何在3分钟内将视频压缩90%?免费开源神器CompressO完全指南
  • 新版本Claude Desktop 无法使用 国产 deepseek v4 模型
  • 爬虫合规七道关:从HTTP请求到法庭证据链的技术实践
  • TrafficMonitor插件开发实战:从零构建Windows任务栏监控组件
  • 你的Logistic回归用对了吗?Minitab实操指南:二值、名义与有序数据的模型选择避坑
  • 桌面实时股票监控终极指南:5分钟打造你的Windows投资助手
  • Linux内核安全模块深入剖析【3.0】
  • Linux内核安全模块深入剖析【2.9】
  • 从零开始将 OpenClaw Agent 工具接入 Taotoken 的详细步骤
  • next.js 开发中的水合(Hydration)问题
  • 手把手教你搞定TaiShan鲲鹏服务器CentOS 7.9安装(附BIOS关键设置与iBMC远程安装)
  • 如何永久免费使用Cursor Pro:终极指南与完整解决方案
  • 【紧急预警】Gemini CSR项目启动窗口期仅剩47天!错过Q3政策红利将影响全年ESG评级得分
  • Zotero中文文献管理难题的终极解决方案:茉莉花插件深度解析
  • GitHub中文插件:5分钟实现GitHub界面全面中文化的终极指南
  • 火狐浏览器配置Burp Suite抓包完全指南
  • 机器学习赋能水泥熟料矿物相实时预测:从数据清洗到模型部署的工业实践
  • TrafficMonitor插件生态完整指南:10分钟打造个性化桌面监控中心
  • 10分钟精通Translumo:Windows最强开源实时屏幕翻译工具完整指南
  • Sketch MeaXure终极指南:如何用现代化TypeScript插件高效完成设计标注
  • Warcraft Helper终极指南:8大功能让魔兽争霸3在现代系统重获新生
  • 辽宁省本溪寄快递省钱干货|不用跑网点!四款公众号 + 小程序寄件渠道,发全国性价比拉满 - 时讯资讯
  • VSCode中R语言开发环境配置与使用完整教程
  • DeepSeek敏感词识别失效真相:3类隐蔽绕过手法+实时过滤响应<80ms的工业级配置清单
  • GPT-SoVITS:用1分钟语音数据训练高质量TTS模型的实用指南
  • TV浏览器终极指南:智能电视上网的5大优势与完整解决方案