文章摘要
Inigo Quilez的个人网站展示他在计算机图形学、数学、着色器、分形和演示场景等领域的创作与分享,包含社交媒体链接和作品展示。
文章总结
标题:计算机图形学中的向量运算替代三角函数
核心观点
作者Íñigo Quílez提出:在计算机图形学中应减少对三角函数的依赖,转而采用基于向量点积和叉积的几何运算方法。他认为,当3D算法内部突然出现三角函数时,往往意味着代码存在不必要的复杂性和潜在错误。
关键论证
问题案例
以常见的轴角旋转函数为例,传统实现需要先通过acos(dot(z,d))计算角度,再调用sin/cos生成旋转矩阵。这种实现存在三个缺陷:- 进行了冗余的
acos-cos计算链 - 需要额外的向量归一化操作
- 引入浮点精度风险(需对点积结果进行clamp)
- 进行了冗余的
优化方案
通过几何关系重构算法:- 用叉积长度直接替代
sin(angle) - 用点积结果直接替代
cos(angle) - 最终推导出无三角函数的旋转矩阵公式:
cpp mat3x3 rotationAlign( const vec3& d, const vec3& z ) { const vec3 v = cross( z, d ); const float c = dot( z, d ); const float k = 1.0f/(1.0f+c); return mat3x3( v.x*v.x*k + c, v.y*v.x*k - v.z, v.z*v.x*k + v.y, v.x*v.y*k + v.z, v.y*v.y*k + c, v.z*v.y*k - v.x, v.x*v.z*k - v.y, v.y*v.z*k + v.x, v.z*v.z*k + c ); }
- 用叉积长度直接替代
优势对比
| 传统方法 | 向量方法 | |---|---| | 需3次三角函数调用 | 无三角函数 | | 需归一化操作 | 无归一化 | | 需浮点clamp | 无精度风险 | | 计算路径长 | 计算简洁 |
深层意义
作者指出这种现象反映了计算机图形学中普遍存在的"数学路径依赖"问题: - 许多API(如WebXR)强制使用角度参数 - 开发者习惯性套用三角运算模式 - 实际上多数情况可通过向量运算更优雅地解决
实践建议
- 培养对点积/叉积的几何直觉(如叉积长度与正弦的关系)
- 遇到三角函数时思考能否用向量重构
- 优先选择保持几何一致性的算法设计
文末强调:"当处理向量问题时,应该用向量语言来思考"——这既是性能优化,更是对数学本质的回归。
(注:保留了原文的技术推导核心,删减了社交媒体链接等非技术内容,优化了中文表达逻辑)
评论总结
以下是评论内容的总结:
支持使用复数/向量替代三角函数的观点
- srean认为用复数表示角度可以避免昂贵的三角函数计算,并举例说明如何用几何平均数计算角平分线
"If you care about angles and rotations... represent an angle as a unit complex numbers"
"the bisector is just the geometric mean... sqrt(z1 * z2)" - chriswarbo推荐Wildberger的有理三角函数理论,完全避免角度和平方根计算
"It eschews angles entirely, sticking to ratios... avoids square roots by sticking to 'quadrances'"
- srean认为用复数表示角度可以避免昂贵的三角函数计算,并举例说明如何用几何平均数计算角平分线
提出替代技术方案的观点
- GistNoesis建议使用Householder矩阵进行反射旋转计算
"rotations as two successive reflections... use householder matrix to avoid trigonometry" - the__alchemist提出四元数的混合计算方案
"change out Matrices for Quaternions... a mix of dot products, quaternion multiplication"
- GistNoesis建议使用Householder矩阵进行反射旋转计算
认为角度/三角函数仍有实用价值的观点
- dxuh指出在游戏开发中角度更符合人类直觉
"angles are just more useful and intuitive... can't really look at a quat and know what kind of rotation" - 20k强调API设计需要权衡性能与可维护性
"convenient and intuitive... 99.9999% of the time it simply doesn't matter"
- dxuh指出在游戏开发中角度更符合人类直觉
技术补充观点
- simonreiff从计算复杂度角度分析叉积优于sin函数
"cross-product reduces to... O(1) complexity... computing sin() is O(M(n)log(n))" - xeonmc提到Rodrigues旋转公式的相关性
"This is just Rodrigues' rotation formula"
- simonreiff从计算复杂度角度分析叉积优于sin函数
语言使用讨论
- virgil_disgr4ce对"orientate"用法的质疑
"Do people really prefer 'orientate' over 'orient'?"
- virgil_disgr4ce对"orientate"用法的质疑