使用 glm 撤消/防止围绕特定轴旋转



我有一段代码,它采用法线和位置,然后创建一个矩阵。矩阵应将值定向到法线方向,并在某个方向上偏移所有值。使用命名空间 GLM;

//Initialize a base translation matrix:
mat4 matrix = translate(mat4(),vec3(pos.x,pos.y,pos.z));
vec3 normal = vec3(inputnormal.x,inputnormal.y,inputnormal.z);
const vec3 upvector = vec3(0.0,0.0,1.0);
//Rotate around normal axis a bit (input by artists)
//matrix = rotate(matrix,radians(degrees),normal);
//Build orientation matrix from normal + upvector:
vec3 tangent = normalize(cross( normal, upvector ));
vec3 binormal = normalize(cross(normal, tangent));
mat3 orient = mat3(tangent, binormal, normal);
//Multiply by the orientation matrix
matrix *= mat4(orient); 

方向有效,框的顶部正确指向法线方向。但是盒子绕法线轴旋转很多法线。(即使 rad 为 0.0)

这是问题的视频:关卡编辑器中的贴花指向法线直接,但也沿法线轴旋转。

编辑:添加了视频和新的计算...https://www.youtube.com/watch?v=Yeq9Fn4f9Gs

所以我的问题是:如何防止围绕法轴旋转,或者如何找到适当的角度来撤消矩阵中的所述旋转。(那么,给定矩阵和任意轴,我如何找到角度?

您需要 2 个非平行方向,而不仅仅是一个......并利用交叉乘积获得第 3 个向量。

所以一个轴是你的normal,因为另一个向量使用一些不变的东西。哪一个取决于您的环境。例如一些可能性:向上,向北,到太阳,到月亮,(1,0,0)(0,1,0)(0,0,1),到脸的第一个顶点。错误选择的向量将导致矩阵随着法向量的变化而旋转。

有关详细信息,请参阅:

  • 了解 4x4 齐次变换矩阵
  • 旋转一组向量

最新更新