求算法: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 将变换向量分解到平行于垂直于旋转轴的两个方向,然后用几何方法求出垂直分量的新坐标,最后将三个原来的基坐标带入变换公式,最后得到变换矩阵。
一般图形学书上都有详细描述的,,你要是不会说不定还通不过考试呢,,嘿嘿
东莞大凡
2024-08-07 广告
2024-08-07 广告
在东莞市大凡光学科技有限公司,我们利用Halcon软件处理机器视觉项目时,会用到自定义标定板以满足特定需求。Halcon支持用户根据实际应用场景自定义标定板形状与标记点。这不仅可以灵活应对不同工作环境,还能提高标定精度。通过调整圆点数量、间...
点击进入详情页
本回答由东莞大凡提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询