早教吧作业答案频道 -->数学-->
空间(vector3)位置求旋转算法前提不借助外部库,已知空间内任意一点求其以原点位置旋转的度数.rotX,rotY,rotZ
题目详情
空间(vector3)位置求旋转算法
前提不借助外部库,已知空间内任意一点 求其以原点位置旋转的度数.
rotX,rotY,rotZ
前提不借助外部库,已知空间内任意一点 求其以原点位置旋转的度数.
rotX,rotY,rotZ
▼优质解答
答案和解析
//
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))) 这是第一列,其他两列也这么提取就可以了
当然这是假设没有平移和缩放变换的
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))) 这是第一列,其他两列也这么提取就可以了
当然这是假设没有平移和缩放变换的
看了空间(vector3)位置求旋...的网友还看了以下:
自动挡车仪表盘上显示20Km/h是什么意思Ф20km/h,以前此位置为油箱剩余油量能行驶的里程数, 2020-04-07 …
滴定管使用中的一个小问题注入待测液的时候要是溶液充满尖嘴部分,请问这个尖嘴部分是指酸(碱)式滴定管 2020-06-06 …
下表是科研人员对暗中垂直生长的水稻根局部遮光和切除处理的结果:处理根尖生长情况1.暗中(对照)继续 2020-06-11 …
谁知道养生养心名句,好像叫养心8法还是养心10句以前一位前辈说给我听过,很好的机句话,反正很很连贯 2020-06-12 …
坐标原点、元点还有圆点?经常会思考关于坐标原点和元点的问题。以前一位老师讲坐标元点就是直角坐标上的 2020-06-14 …
要求:必须先掷出6点,才可以画出身体(画出身体后,才可以按照任意的顺序接着画以下部位):掷出5点画 2020-06-23 …
常见一些标语、横幅、黑板报等等的落款处标示着“某某单位宣”,是否是以前单位宣传部的简写演化来的? 2020-06-27 …
鱼缸100,45,60放加热棒两个200瓦的,我的过滤是过滤捅,进水出水全放在靠右宽度上,加温棒一 2020-06-29 …
我国固定电话的号码是由0至9这十个数组成的,但国家规定:固定电话的第一位不可以是0、1或9.某市由 2020-07-28 …
现在看到的星星光芒,是很多年前发出来的吗?星星的光芒传到地球,需要很多年的时间,是不是我们看到现在星 2020-11-25 …