atan2f() 不起作用

Posted

技术标签:

【中文标题】atan2f() 不起作用【英文标题】:atan2f() doesn't work 【发布时间】:2017-07-21 09:56:34 【问题描述】:

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

【问题讨论】:

你能注意到错误值有什么特别之处吗?也许您需要反转标志或添加pi/2 或类似的东西。 @HolyBlackCat 感谢您的回答。我有 3 个对象,如果我尝试用 atan2f 改变它们的角度,我有一个保持 0 度,另一个大约 120 度,另一个保持 -120 度。权限值必须是90度,大约135度,最后也是大约-135度.. 【参考方案1】:

如果你想围绕世界中心旋转一个物体,你必须先设置一个旋转矩阵:

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;

【讨论】:

嗨,我已经在中心周围创建了对象并进行了翻译。我尝试做的不是围绕中心旋转,而是将对象的顶点定向到中心。

以上是关于atan2f() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PHP.INI不起作用

C#DataGridView的行列表头背景色字体色不起作用

关于Animate css不起作用的原因

修改php.ini不起作用是为啥

Vba窗体的keydown怎么不起作用

Angular 的 $http.post 不起作用,它的 $http... 也不起作用,但 jQuerys ajax 起作用。为啥?