作业帮 > 综合 > 作业

求算法:opengl 绕任意轴旋转后的坐标

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/10 12:50:43
求算法:opengl 绕任意轴旋转后的坐标
//
  void rotAxis3D_Tech_Matrix(float theta,float nx,float ny,float nz,float (&ptIn)[3],float (&ptOut)[3])
  {
  float len = sqrtf(nx * nx + ny * ny + nz * nz); //normalize vector
  nx /= len; ny /= len; nz /= len;
  ptOut[0] = ptIn[0] * (cosf(theta) + nx * nx * (1 - cosf(theta))) + //transform by matrix
  ptIn[1] * (nx * ny * (1 - cosf(theta)) - nz * sinf(theta)) +
  ptIn[2] * (nx * nz * (1 - cosf(theta) + ny * sinf(theta)));
  ptOut[1] = ptIn[0] * (nx * ny * (1 - cosf(theta)) + nz * sinf(theta)) +
  ptIn[1] * (ny * ny * (1 - cosf(theta)) + cosf(theta)) +
  ptIn[2] * (ny * nz * (1 - cosf(theta)) - nx * sinf(theta));
  ptOut[2] = ptIn[0] * (nx * nz * (1 - cosf(theta) - ny * sinf(theta))) +
  ptIn[1] * (ny * nz * (1 -cosf(theta)) + nx * sinf(theta)) +
  ptIn[2] * (nz * nz * (1 - cosf(theta)) + cosf(theta));
  }
  直接给出个算法吧,这个算法直接用矩阵作的,在一般情况下也就不用四元数了.
  晕,哥哥看错了,你是问OpenGL,那把上面公式中的矩阵提取出来,注意到这个矩阵是三阶的,最后一行是给你设置平移参数的.可以简单设置为 0 0 0 1
  构造好矩阵之后,调用glLoadMatrixf设置ModelView矩阵就OK了,
  上面矩阵如何提取?
  (cosf(theta) + nx * nx * (1 - cosf(theta)))
  (nx * ny * (1 - cosf(theta)) - nz * sinf(theta))
  (nx * nz * (1 - cosf(theta) + ny * sinf(theta))) 这是第一列,其他两列也这么提取就可以了
  当然这是假设没有平移和缩放变换的
再问: 麻烦解释一下原理 谢谢!
再答: 晕,,这个原理不好打字,,都是公式,,你可以参考一些计算机图形学书籍,, 根据线性代数的性质,有两种简单的方法构造变换矩阵, 1 将三个坐标轴想法作同样的绕轴变换,得到三个新向量,单位化后这三个向量就是新的基向量,可以直接构造矩阵 2 将变换向量分解到平行于垂直于旋转轴的两个方向,然后用几何方法求出垂直分量的新坐标,最后将三个原来的基坐标带入变换公式,最后得到变换矩阵。 一般图形学书上都有详细描述的,,你要是不会说不定还通不过考试呢,,嘿嘿