openGL中绕任意轴旋转
直接上代码,具体细节请看参考文献部分
1 代码
glm::mat4 RotateArbitraryLine(glm::vec3 v1, glm::vec3 v2, float theta)
- 第一个参数v1是旋转轴的尾部,
- 第二个参数v2是旋转轴的头部,
- 第三个参数theta是绕v1v2轴的角度;
//绕任意轴的旋转
glm::mat4 RotateArbitraryLine(glm::vec3 v1, glm::vec3 v2, float theta)
{
glm::mat4 rmatrix;
float a = v1.x;
float b = v1.y;
float c = v1.z;
glm::vec3 p1 = v2 - v1;
glm::vec3 p = glm::normalize(p1);
float u = p.x;
float v = p.y;
float w = p.z;
float uu = u * u;
float uv = u * v;
float uw = u * w;
float vv = v * v;
float vw = v * w;
float ww = w * w;
float au = a * u;
float av = a * v;
float aw = a * w;
float bu = b * u;
float bv = b * v;
float bw = b * w;
float cu = c * u;
float cv = c * v;
float cw = c * w;
float costheta = glm::cos(theta);
float sintheta = glm::sin(theta);
rmatrix[0][0] = uu + (vv + ww) * costheta;
rmatrix[0][1] = uv * (1 - costheta) + w * sintheta;
rmatrix[0][2] = uw * (1 - costheta) - v * sintheta;
rmatrix[0][3] = 0;
rmatrix[1][0] = uv * (1 - costheta) - w * sintheta;
rmatrix[1][1] = vv + (uu + ww) * costheta;
rmatrix[1][2] = vw * (1 - costheta) + u * sintheta;
rmatrix[1][3] = 0;
rmatrix[2][0] = uw * (1 - costheta) + v * sintheta;
rmatrix[2][1] = vw * (1 - costheta) - u * sintheta;
rmatrix[2][2] = ww + (uu + vv) * costheta;
rmatrix[2][3] = 0;
rmatrix[3][0] = (a * (vv + ww) - u * (bv + cw)) * (1 - costheta) + (bw - cv) * sintheta;
rmatrix[3][1] = (b * (uu + ww) - v * (au + cw)) * (1 - costheta) + (cu - aw) * sintheta;
rmatrix[3][2] = (c * (uu + vv) - w * (au + bv)) * (1 - costheta) + (av - bu) * sintheta;
rmatrix[3][3] = 1;
return rmatrix;
}
2 参考文献:
https://www.cnblogs.com/graphics/archive/2012/08/10/2627458.html