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
我有一段代码需要一个法线和一个位置,然后创建一个矩阵。 矩阵应将值定向在法线的方向上,并在某个方向上偏移所有内容。 使用命名空间 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