GLM::Rotate seems to cause wrong rotation?

2019-09-05 18:29发布

Simply put, I'm learning OpenGL and am starting to learn about transform matrices. Below is my current code:

glm::vec4 myPosition(1.0f, 1.0f, 1.0f, 1.0f);

glm::vec3 rotationAxis(0.0f, 1.0f, 0.0f);

glm::mat4 scalar = glm::scale(glm::vec3(1.0f, 1.0f, 1.0f));
glm::mat4 rotator = glm::rotate(360.0f, rotationAxis);
glm::mat4 translator = glm::translate(glm::vec3(1.0f, 1.0f, 1.0f));

glm::mat4 transform = translator * rotator * scalar;

myPosition = transform * myPosition;

As far as I can tell, I'm doing this in the correct order: Scale -> Rotate -> Translate. So, I have the scale set to do nothing because I don't actually want it to scale anywhere (for simplicity sake).

Next, I set rotate to 360.0f on (correct me if I'm wrong) the Y axis. This should return to the original point, at least that's what I would think from a 360 degree rotation around a singular axis.

Then, I set it to translate 1 unit in every direction to make sure it moves.

After finishing this all, I have commented out the rotator line, and it works fantastic, even if I change the scale. However, whenever I add in the rotate line the final position is not a normal 360 degree rotation?

I have configured my program to output the position vector both before transforms and after.

The before position is (1, 1, 1)

The after position is (1.67522, 2, -0.242607).

I have been struggling to find my error, literally all day so if anyone can help me find what I'm doing wrong, it would be greatly appreciated!!

1条回答
淡お忘
2楼-- · 2019-09-05 18:50

According to the documentation at http://glm.g-truc.net/0.9.7/api/a00236.html (for the latest released version right now), glm::rotate(..) takes in an angle expressed in degrees.

However, changing your rotation matrix line

glm::mat4 rotator = glm::rotate(360.0f, rotationAxis);

to

glm::mat4 rotator = glm::rotate(3.141592f * 2.0f, rotationAxis);

which is just 2*PI fixes this.

This means that the angle should be in radians rather than in degrees. Tested on my machine with GLM 0.9.7.1-1. This is either a mistake in the documentation or in the GLM code itself.

From my experience with GLM (some time ago, might've been an earlier version) these kinds of functions should take a degrees angle by default, and the #define GLM_FORCE_RADIANS macro is what makes them calculate in radians. It is possible that the author made this the default behaviour and forgot to update the docs.

On a side note, you should probably not be using scalar as the name for a glm::mat4 value, since a scalar in mathematics is just a single real number rather than a matrix: https://en.wikipedia.org/wiki/Scalar_%28mathematics%29

查看更多
登录 后发表回答