旋转矩阵法线

问题描述

我学会了如何从法线制作旋转矩阵,但我仍然不明白如何控制围绕其自身轴的旋转。我正在尝试修复切线,但对我没有任何作用。我尝试了两种方式:

  1. 我将切线作为向上和法线的叉积。我通过 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;
}
  1. 我将切线作为归一化(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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...