Undo/Prevent 使用 glm 绕特定轴旋转

Undo/Prevent rotation around a specific axis with 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)

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

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

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

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

所以一个轴是你的 normal 因为另一个向量使用一些不变的东西。哪一个取决于你的环境。例如一些可能性:Up,North,To Sun,To moon,(1,0,0) or (0,1,0) or (0,0,1), To first vertex of face.选错向量会导致矩阵随着法向量的变化而旋转

有关详细信息,请参阅:

  • Rotating a Group of Vectors