opengl - 给定旋转后的法向量,求平面的 OpenGL 旋转矩阵

标签 opengl matrix rotation plane

有没有办法获得将平面旋转到新方向的矩阵,给定它的新法向量

下图描述了所描述的内容

enter image description here

最佳答案

鉴于旧常态 N和新常态 N'您可以通过以下方式获得旋转:

RotationAxis = cross(N, N')
RotationAngle = arccos(dot(N, N') / (|N| * |N'|))

在哪里
  • cross(x, y)是向量的叉积 xy
  • dot(x, y)是向量的点积 xy
  • |x|是向量的长度 x

  • 这将以最短的方式将旧法线旋转到新法线。

    备注
  • RotationAngle将以弧度为单位(如果 arccos 在大多数实现中返回弧度)
  • arccos是余弦函数的反函数。这是必要的,因为dot(N, N') = |N| * |N'| * cos(RotationAngle)哪里RotationAngle是向量之间的角度。
  • RotationAxis未标准化
  • 如果两个法线都归一化,则除以 (|N| * |N'|)变得不必要(事实上,如果 N 被标准化,你可以省略 |N| 的乘积,如果 N' 被标准化然后省略 |N'| )
  • 如果 N' = -N,此方法将失败(因为有无数条最短路径)

  • 它是如何工作的?

    第一个观察结果是两个法线将始终定义(至少)一个平面,两个法线都位于其中。将它们分开的最小角度也将在该平面内进行测量。

    所以RotationAxis向量将是包含两个 N 的平面的法线和 N'RotationAngle是前面提到的两者之间的最小角度。

    所以通过旋转 RotationAxisRotationAngle旧常态 N在平面内旋转,以最短路径朝向 N' .

    关于opengl - 给定旋转后的法向量,求平面的 OpenGL 旋转矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13199126/

    相关文章:

    uiimageview - 从旋转的 UIImageView 创建 UIImage

    c++ - D3DXMatrixTransformation2D 行为怪异

    java - 两侧都可见 OpenGL Quad?

    python - 将 sympy 表达式分解为矩阵系数?

    css - 如何在 TH 表格标签中使用 CSS Rotate()

    使用函数进行 Matrix<double> 逐点运算

    python - 如何找到属于非方阵零空间的线性无关向量? (Python)

    opengl - 写入浮点 FBO 时的低精度和钳位

    c++ - glDrawElements 成功但是 glDrawElementsInstance 失败并显示 GL_INVALID_OPERATION

    c++ - 当我在顶点着色器中有 "out"时,OpenGL 不绘制