atan2f() 不起作用
atan2f() doesn't work
我尝试使用 atan2f 将对象的方向更改为朝向中心,但它给了我错误的值。我哪里错了吗?
glm::vec3 center = glm::vec3(0.4f, 0.4f, 0.0f);
for(int i = 0; i < num; i++){
float rel = i / (float) num;
float angle = rel * M_PI * 2;
glm::vec3 position = glm::vec3(cos(angle), glm::sin(angle), position.z);
position.x *= radius; position.y *= radius;
position.x += center; position.y += center;
glm::mat4 trans = glm::translate(glm::mat4(1.0f), position);
float newAngle = atan2f(position.y - center.y, position.x - center.x);
glm::mat4 rotation = glm::rotation(glm::mat4(1.0f), newAngle, glm::vec3(0, 0, 1));
numModel.at(i) = trans * rotation;
}
如果你想围绕世界中心旋转一个物体你必须先设置一个旋转矩阵:
float angle = ...;
glm::vec3 rotAxis( ... );
glm::mat4 rotMat = glm::rotation( glm::mat4(1.0f), angle, rotAxis );
注意 glm::rotation
函数计算角度的正弦和余弦并在矩阵内设置适当的字段。
2nd 你必须设置你的物体位置矩阵,这是描述物体初始位置的矩阵:
glm::vec3 position( radius, 0.0f, 0.0f );
glm::mat4 transMat = glm::translate( glm::mat4(1.0f), position );
要围绕世界中心旋转对象,您必须将旋转矩阵 rotMat
乘以模型矩阵 transMat
,因为旋转矩阵定义了用于放置对象的参考系.
glm::mat4 modelMat = rotMat * transMat;
如果你想围绕它自己的原点旋转一个对象,你必须先将你的对象放置在世界中,然后你必须旋转它:
glm::mat4 modelMat = transMat * rotMat;
另见问题的答案OpenGL transforming objects with multiple rotations of Different axis
在您的情况下,如果您希望对象指向世界中心,您首先必须将对象平移到它的位置。第二,你必须计算世界的 X 轴与从物体到中心的方向之间的角度。最后,您必须将物体转向 相反 方向。
glm::vec3 position( ... );
glm::vec3 center( ... );
glm::mat4 transMat = glm::translate( glm::mat4(1.0f), position );
float angle = atan2f(center.y - position.y, center.x - position.x);
glm::vec3 rotAxis( 0.0f, 0.0f, 1.0f );
glm::mat4 rotMat = glm::rotation( glm::mat4(1.0f), -angle, rotAxis );
glm::mat4 modelMat = transMat * rotMat;
我尝试使用 atan2f 将对象的方向更改为朝向中心,但它给了我错误的值。我哪里错了吗?
glm::vec3 center = glm::vec3(0.4f, 0.4f, 0.0f);
for(int i = 0; i < num; i++){
float rel = i / (float) num;
float angle = rel * M_PI * 2;
glm::vec3 position = glm::vec3(cos(angle), glm::sin(angle), position.z);
position.x *= radius; position.y *= radius;
position.x += center; position.y += center;
glm::mat4 trans = glm::translate(glm::mat4(1.0f), position);
float newAngle = atan2f(position.y - center.y, position.x - center.x);
glm::mat4 rotation = glm::rotation(glm::mat4(1.0f), newAngle, glm::vec3(0, 0, 1));
numModel.at(i) = trans * rotation;
}
如果你想围绕世界中心旋转一个物体你必须先设置一个旋转矩阵:
float angle = ...;
glm::vec3 rotAxis( ... );
glm::mat4 rotMat = glm::rotation( glm::mat4(1.0f), angle, rotAxis );
注意 glm::rotation
函数计算角度的正弦和余弦并在矩阵内设置适当的字段。
2nd 你必须设置你的物体位置矩阵,这是描述物体初始位置的矩阵:
glm::vec3 position( radius, 0.0f, 0.0f );
glm::mat4 transMat = glm::translate( glm::mat4(1.0f), position );
要围绕世界中心旋转对象,您必须将旋转矩阵 rotMat
乘以模型矩阵 transMat
,因为旋转矩阵定义了用于放置对象的参考系.
glm::mat4 modelMat = rotMat * transMat;
如果你想围绕它自己的原点旋转一个对象,你必须先将你的对象放置在世界中,然后你必须旋转它:
glm::mat4 modelMat = transMat * rotMat;
另见问题的答案OpenGL transforming objects with multiple rotations of Different axis
在您的情况下,如果您希望对象指向世界中心,您首先必须将对象平移到它的位置。第二,你必须计算世界的 X 轴与从物体到中心的方向之间的角度。最后,您必须将物体转向 相反 方向。
glm::vec3 position( ... );
glm::vec3 center( ... );
glm::mat4 transMat = glm::translate( glm::mat4(1.0f), position );
float angle = atan2f(center.y - position.y, center.x - position.x);
glm::vec3 rotAxis( 0.0f, 0.0f, 1.0f );
glm::mat4 rotMat = glm::rotation( glm::mat4(1.0f), -angle, rotAxis );
glm::mat4 modelMat = transMat * rotMat;