求算法: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 将变换向量分解到平行于垂直于旋转轴的两个方向,然后用几何方法求出垂直分量的新坐标,最后将三个原来的基坐标带入变换公式,最后得到变换矩阵。 一般图形学书上都有详细描述的,,你要是不会说不定还通不过考试呢,,嘿嘿
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 将变换向量分解到平行于垂直于旋转轴的两个方向,然后用几何方法求出垂直分量的新坐标,最后将三个原来的基坐标带入变换公式,最后得到变换矩阵。 一般图形学书上都有详细描述的,,你要是不会说不定还通不过考试呢,,嘿嘿
求算法:opengl 绕任意轴旋转后的坐标
android opengl 已知物体原空间坐标和旋转过的角度,怎么求出它旋转后的空间坐标,并转换成屏幕坐标
使用OpenGL怎样获得局部坐标经变换后得到的世界坐标?
关于OPenGL坐标变换的问题,
在opengl中某点经过坐标变换后,请问可以使用什么函数或方法求出变换后这点的坐标?
求曲线xy=-1绕坐标原点逆时针旋转45°后得到的曲线.
三角函数问题∶求一个点绕原点旋转一个角度后的坐标
求助!OPENGL中屏幕坐标到世界坐标的转换~
平面上有一点(x,y),将其绕坐标原点旋转一角度α,求旋转后的点的坐标.
二维图像旋转后的方程就是 任意曲线 绕一点 旋转任意角度后的方程 只在二维上旋转请问怎么求啊 请写出公式
二次函数y=3x²-6x-2的图像绕坐标原点顺时针旋转180°,求旋转后的函数关系式
若将y=2x-5的函数图像绕坐标原点o,按逆时针方向旋转90°,求旋转后图像的函数关系式