问题描述
我学会了如何从法线制作旋转矩阵,但我仍然不明白如何控制围绕其自身轴的旋转。我正在尝试修复切线,但对我没有任何作用。我尝试了两种方式:
- 我将切线作为向上和法线的叉积。我通过 XZ 平面中切线和 X 轴之间的角度制作了一个单独的 Y 旋转矩阵。我用它乘以 TBN 矩阵。因此,围绕其轴进行了不必要的完整 360 度旋转,法线与向上相反:
https://www.youtube.com/watch?v=S-C8tEMmNWs
代码:
void physics::rotationMatrixFromVectorY_UP_21(glm::vec3& n,glm::mat3& mat) {
glm::vec3 normal = glm::normalize(n);
glm::vec3 up = glm::vec3(0.0f,1.0f,0.0f);
glm::vec3 tangent = glm::normalize(glm::cross(up,normal));
glm::vec3 binormal = glm::cross(normal,tangent);
mat[0][0] = tangent.x;
mat[0][1] = tangent.y;
mat[0][2] = tangent.z;
mat[2][0] = -binormal.x;
mat[2][1] = -binormal.y;
mat[2][2] = -binormal.z;
mat[1][0] = normal.x;
mat[1][1] = normal.y;
mat[1][2] = normal.z;
float angleDir = std::atan2(tangent.x,tangent.z);
angleDir += glm::radians(DEBUG_IMGUI_UGOL_2);
glm::mat3 mmmm = glm::mat3(glm::rotate(glm::mat4(1.0f),-angleDir,glm::vec3(0,0)));
mat *= mmmm;
}
- 我将切线作为归一化(normal.y,-normal.x,0.0f)。一直在YX平面上。结果:
https://www.youtube.com/watch?v=-dj8P1opJdM
Code:
void physics::rotationMatrixFromVectorY_UP_20(glm::vec3& n,glm::mat3& mat) {
glm::vec3 normal = glm::normalize(n);
glm::vec3 tangent = glm::normalize(glm::vec3(normal.y,0.0f));
glm::vec3 binormal = glm::cross(normal,tangent);
mat[0][0] = tangent.x;
mat[0][1] = tangent.y;
mat[0][2] = tangent.z;
mat[2][0] = -binormal.x;
mat[2][1] = -binormal.y;
mat[2][2] = -binormal.z;
mat[1][0] = normal.x;
mat[1][1] = normal.y;
mat[1][2] = normal.z;
}
正如您在视频中看到的,我无法不断固定切线以使斧头不会围绕其轴 (Y) 旋转。我需要完成我的代码,但我不明白如何完成。我觉得我应该使用点积,但我缺乏数学知识。请帮帮我。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)