当前位置: 首页 > 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.jsqmd.com/news/878902/

相关文章:

  • ChatGPT数据可视化实战手册(2024最新版):从原始JSON到可交付Dashboard的7个关键跃迁
  • Java并发编程:ReentrantReadWriteLock读写锁
  • LSLib:游戏资源逆向工程的架构级解决方案
  • 长期使用Taotoken Token Plan套餐在项目开发中的成本节省体感
  • 天际模组编排师:用LOOT主列表告别游戏崩溃的智能解决方案
  • Zotero文献去重插件:高效清理重复文献的完整解决方案
  • 辽宁省东港寄件省钱新思路!不用再跑门店比价,这些线上渠道寄全国划算又稳妥 - 时讯资讯
  • 大数据机器学习框架性能对比:从Spark MLlib到Scikit-learn的基准测试实践
  • next.js 开发中的水合(Hydration)问题
  • VSCode中R语言开发环境配置与使用完整教程
  • Mac Mouse Fix终极指南:让你的普通鼠标秒变专业级触控板
  • 新手必看,在Python项目中通过OpenAI兼容SDK调用Taotoken聚合API
  • 新版本Claude Desktop 无法使用 国产 deepseek v4 模型
  • 仅剩最后47套!《ChatGPT脑筋急转弯生成军规手册》PDF+127个经A/B测试验证的高互动Prompt模板(含儿童/职场/银发三版适配)
  • 基于符号传递熵与共识嵌套交叉验证的电竞选手技能评估模型
  • 开源入门踩坑实录:新手必避的10个坑,每个都让我熬到凌晨三点
  • 使用Taotoken后我的月度大模型API用量与成本变得清晰可见
  • 对比直接使用厂商API,Taotoken在稳定性方面的补充价值
  • GitHub中文插件:5分钟实现GitHub界面全面中文化的终极指南
  • 百度网盘直链解析:5分钟实现全速下载的终极指南
  • 数据驱动永磁材料设计:高通量微磁模拟与机器学习融合
  • 可视化 React 水合(Hydration)问题
  • 3个让你在家也能练出效果的健身法则
  • 【Gemini代码生成能力权威评测】:基于2000+真实编码场景的7大维度深度拆解
  • 终极伪代码生成器:如何让复杂代码秒变人类可读文档
  • Zotero中文文献管理难题的终极解决方案:茉莉花插件深度解析
  • 量子机器学习工程实践:从数据编码到梯度优化的核心挑战与前沿进展
  • 【AIGC内容竞争力突围关键】:为什么92%的ChatGPT使用者不会“讲故事”?资深NLP架构师首曝4层认知断层
  • 暗黑破坏神II角色存档编辑终极指南:5分钟掌握Diablo Edit2
  • 登录状态正常