当我使用glm :: rotate来执行旋转时,为什么旋转后的原点会在翻译后发生变化?

时间:2017-07-21 05:44:55

标签: c++ opengl graphics

我正在开发一个机器人手模拟程序,我可以在其中加载和绘制机器人手模型(3DS MAX中内置的模型)并根据输入执行一些操作,例如关节角度。

手模型包含许多不同的部分,每个部分都有自己的模型矩阵和VBO存储顶点坐标,法线和uv。

我想在某个轴(不是坐标轴)周围的关节上使用glm :: rotate()执行旋转,所以我打算将它转换为世界原点,然后执行旋转,最后返回。

这里的问题是,当我在翻译后执行旋转时,它旋转的世界原点似乎也发生了变化,看起来世界起源已经以相同的方式被翻译。

另外,我真的不知道glm :: rotate是否围绕世界起源旋转?令人困惑的是它为什么会发生变化,我已经测试过直接旋转而不是在旋转之前进行平移,它实际上围绕世界原点旋转,但是当我在旋转之前执行平移时,它会发生变化。

更多详情:

我也认为这个问题最有可能出现在坐标系中。我使用Robothand类来表示机器人手对象,以及那些"部件"是Model类的对象,模型之间存在父子关系,因此在一个特定模型中执行的每个转换都会对其子模型产生相同的影响。

顶点着色器

void main(){

    mat4 MVP = P * V * M;

    gl_Position = MVP * vec4(vertexPosition_modelspace,1);

    Position_worldspace = (M * vec4(vertexPosition_modelspace,1)).xyz;

    vec3 vertexPosition_cameraspace = (V * M * vec4(vertexPosition_modelspace,1)).xyz;

    EyeDirection_cameraspace = vec3(0,0,0) - vertexPosition_cameraspace;

    vec3 LightPosition_cameraspace = (V * vec4(LightPosition_worldspace,1)).xyz;
    LightDirection_cameraspace = LightPosition_cameraspace + EyeDirection_cameraspace;

    Normal_cameraspace = ( V * M * vec4(vertexNormal_modelspace,0)).xyz;

    UV = vertexUV;

    Color = vertexColor;
}

我必须解释机器人手模型是用3ds max构建的,并导出为.obj文件。在3DS MAX中,所有模型共享相同的世界原点,这意味着它们的模型坐标系的原点在于同样的立场。如果我在没有平移的情况下旋转任何模型没有任何问题,它将围绕世界坐标轴旋转,但真正的问题是,如果我先翻译,世界原点将以相同的方式翻译,它看起来像是在新的旋转坐标系。

0 个答案:

没有答案