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

 我来答
sl65agm
2011-03-21 · TA获得超过1383个赞
知道小有建树答主
回答量:734
采纳率:0%
帮助的人:586万
展开全部
  //************************************
  //rotAxis3D_Tech_Matrix
  //rotate point or vector by give reference axis and angle(in radius)
  //Note this function use Row vector multipily Matrix from left
  //Paras:
  //theta: rotation angle
  // nx ny nz: rotation Refernce Axis
  //ptIn: input point or vector
  //ptOut: output point or vector
  //............
  //.........Module Sehnsucht in Prj White Board
  //************************************
  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 将变换向量分解到平行于垂直于旋转轴的两个方向,然后用几何方法求出垂直分量的新坐标,最后将三个原来的基坐标带入变换公式,最后得到变换矩阵。

一般图形学书上都有详细描述的,,你要是不会说不定还通不过考试呢,,嘿嘿
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
dragon__y
2011-03-23 · TA获得超过435个赞
知道小有建树答主
回答量:547
采纳率:50%
帮助的人:288万
展开全部
GLdouble m_dModelViewMatrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX, m_dModelViewMatrix);

m_dModelViewMatrix里面就是矩阵变换后的矩阵坐标
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式