在特定顶点上使用glLoadMatrixd?

时间:2015-04-15 08:04:24

标签: c opengl matrix

我正在尝试在传统OpenGL中进行骨架动画,并认为我可以在各个顶点上使用矩阵。当我编程并且它不起作用时,我做了一些谷歌搜索:https://www.talisman.org/opengl-1.1/Reference/glLoadMatrix.html

  

如果在执行glBegin和glEnd的相应执行之间执行glLoadMatrix,则会生成GL_INVALID_OPERATION。

所以现在我很难过。这是一个图表:

enter image description here

骨头标有红色。我正在尝试进行骨骼动画,因此有两个矩形。一个使用Bone 0,第二个使用Bone 1.只有构成第二个矩形的三角形的特定顶点使用Bone 1的旋转矩阵,而不使用Bone 0的旋转矩阵的三角形的特定顶点,有点像蛇,如果这是有道理的。

由于我不能将glLoadMatrix用于三角形中的各个顶点,我还可以基于存储的矩阵替换顶点?也许将一些矩阵值乘以顶点?不知道如何去做。任何意见都表示赞赏,谢谢!

3 个答案:

答案 0 :(得分:0)

你提到了两个矩形Bone0和Bone1。您需要单独绘制它们,因为它们需要具有单独的转换矩阵。两个矩形中的两个点是重合的,用于绘制Bone1的变换矩阵必须确保:

glTranslateF(...);
glRotateF(...);       /* position rectangle Bone0 */

glBegin(GL_QUADS);    /* draw rectangle Bone0 */
glVertex3f(...);      /* draw it */
    ... 
glEnd();

glPushMatrix();       /* save transformation matrix */

glMulMatrix(...);     /*
                       * as per your drawing, this is not just a
                       * simple translate/rotate operation, but
                       * a translate/shear
                       * you need to do that manually
                       */

glBegin(GL_QUADS);    /*
                       * draw rectangle Bone1. Two of the vertices are
                       * coincident with two of rectangle Bone0. Your
                       * shear matrix must ensure they are
                       */
glVertex3F(...);
glEnd();

答案 1 :(得分:0)

你要做的是皮肤!不幸的是,它比你的方法需要更多的努力。可以在开始和结束之间进行,这通常是可取的。

最简单的方法是不使用OpenGL转换顶点。使用您喜欢的矩阵数学库将顶点与骨骼矩阵相乘,然后再传递给OpenGL。如果顶点的数量不是太大,它不会减慢你的速度。

更难的方法是实现蒙皮着色器。这个book chapter提供了关于如何完成的良好介绍。原理是将多个矩阵上传到OpenGL,并为每个顶点提供一个索引,该索引说明要与哪个矩阵相乘。这比简单方法快得多。

GPU非常快,因为它们针对大​​量数据进行相同操作进行了优化 - 这样做的权衡是你无法修改状态(例如更改矩阵)平局电话正在进行中。

答案 2 :(得分:0)

嘿,自从我发布了我的问题以来,我已经做了很多数学工作,并且现在回过头来给任何有相同问题的人发一个答案,我注意到我已经有了一些答案,所以感谢你回答你的输入!

因为我已经找到了解决方案,但我想我会和其他两个一起发布答案。

基本上,我对渲染所做的是无论如何都是逐顶点渲染,它从数据缓冲区读取每个三角形的顶点以及所有这些,所以继续编写一个并不是太麻烦自定义函数将矩阵乘以顶点,因此从缓冲区加载顶点的副本,矩阵根据顶点映射到哪个骨骼与其相乘,然后用于渲染该特定顶点三角形。

有趣的是,我已经实现了@Hannesh建议的内容,我只需编写乘法器函数。很酷!

  

更难的方法是实现蒙皮着色器。本书章节提供了如何完成的良好介绍。原理是将多个矩阵上传到OpenGL,并为每个顶点提供一个索引,该索引说明要与哪个矩阵相乘。这比简单方法快得多。

再次感谢!只要我有声誉,我就会投票!