求算法:opengl 绕任意轴旋转后的坐标
展开全部
//************************************
//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))) 这是第一列,其他两列也这么提取就可以了
当然这是假设没有平移和缩放变换的
//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 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询