Hacker News 中文摘要

RSS订阅

避开三角学(2013) -- Avoiding Trigonometry (2013)

文章摘要

Inigo Quilez的个人网站展示他在计算机图形学、数学、着色器、分形和演示场景等领域的创作与分享,包含社交媒体链接和作品展示。

文章总结

标题:计算机图形学中的向量运算替代三角函数

核心观点

作者Íñigo Quílez提出:在计算机图形学中应减少对三角函数的依赖,转而采用基于向量点积和叉积的几何运算方法。他认为,当3D算法内部突然出现三角函数时,往往意味着代码存在不必要的复杂性和潜在错误。

关键论证

  1. 问题案例
    以常见的轴角旋转函数为例,传统实现需要先通过acos(dot(z,d))计算角度,再调用sin/cos生成旋转矩阵。这种实现存在三个缺陷:

    • 进行了冗余的acos-cos计算链
    • 需要额外的向量归一化操作
    • 引入浮点精度风险(需对点积结果进行clamp)
  2. 优化方案
    通过几何关系重构算法:

    • 用叉积长度直接替代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. 优势对比
    | 传统方法 | 向量方法 | |---|---| | 需3次三角函数调用 | 无三角函数 | | 需归一化操作 | 无归一化 | | 需浮点clamp | 无精度风险 | | 计算路径长 | 计算简洁 |

深层意义

作者指出这种现象反映了计算机图形学中普遍存在的"数学路径依赖"问题: - 许多API(如WebXR)强制使用角度参数 - 开发者习惯性套用三角运算模式 - 实际上多数情况可通过向量运算更优雅地解决

实践建议

  • 培养对点积/叉积的几何直觉(如叉积长度与正弦的关系)
  • 遇到三角函数时思考能否用向量重构
  • 优先选择保持几何一致性的算法设计

文末强调:"当处理向量问题时,应该用向量语言来思考"——这既是性能优化,更是对数学本质的回归。

(注:保留了原文的技术推导核心,删减了社交媒体链接等非技术内容,优化了中文表达逻辑)

评论总结

以下是评论内容的总结:

  1. 支持使用复数/向量替代三角函数的观点

    • 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'"
  2. 提出替代技术方案的观点

    • 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"
  3. 认为角度/三角函数仍有实用价值的观点

    • 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"
  4. 技术补充观点

    • 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"
  5. 语言使用讨论

    • virgil_disgr4ce对"orientate"用法的质疑
      "Do people really prefer 'orientate' over 'orient'?"