atan2f()不起作用

时间:2017-07-21 09:56:35

标签: c++ opengl glm-math coordinate-transformation atan2

我尝试用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;
}

1 个答案:

答案 0 :(得分:0)

如果要围绕世界中心旋转对象,首先必须设置旋转矩阵:

float angle = ...;
glm::vec3 rotAxis( ... );
glm::mat4 rotMat = glm::rotation( glm::mat4(1.0f), angle, rotAxis );

注意glm::rotation函数计算角度的正弦和余弦,并在矩阵内设置适当的字段。

第二,您必须设置对象位置矩阵,这是描述对象初始位置的矩阵:

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;