Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在特定顶点上使用glLoadMatrixd?_C_Opengl_Matrix - Fatal编程技术网

C 在特定顶点上使用glLoadMatrixd?

C 在特定顶点上使用glLoadMatrixd?,c,opengl,matrix,C,Opengl,Matrix,我试图在传统的OpenGL中制作骨骼动画,并认为我可以在各个顶点上使用矩阵。当我对它进行编程但它不起作用时,我通过谷歌搜索找到了以下内容: 如果在glBegin的执行和glEnd的相应执行之间执行glLoadMatrix,则生成GLU INVALID_操作 所以现在我被难住了。这是一张图表: 骨骼用红色标记。我正在尝试做骨骼动画,所以有两个矩形。一个使用骨骼0,另一个使用骨骼1。只有构成第二个矩形的三角形的特定顶点使用骨骼1的旋转矩阵,而那些不使用骨骼0的旋转矩阵的顶点,有点像蛇,如果有意义的话

我试图在传统的OpenGL中制作骨骼动画,并认为我可以在各个顶点上使用矩阵。当我对它进行编程但它不起作用时,我通过谷歌搜索找到了以下内容:

如果在glBegin的执行和glEnd的相应执行之间执行glLoadMatrix,则生成GLU INVALID_操作

所以现在我被难住了。这是一张图表:

骨骼用红色标记。我正在尝试做骨骼动画,所以有两个矩形。一个使用骨骼0,另一个使用骨骼1。只有构成第二个矩形的三角形的特定顶点使用骨骼1的旋转矩阵,而那些不使用骨骼0的旋转矩阵的顶点,有点像蛇,如果有意义的话


既然我不能对三角形中的单个顶点使用glLoadMatrix,那么还有什么方法可以基于存储的矩阵置换顶点呢?也许将一些矩阵值乘以顶点?我不知道该怎么做。欢迎您的任何意见,谢谢

您提到了两个矩形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();

你要做的就是剥皮!不幸的是,这将比你的方法需要付出更多的努力。可以在一个开始和结束之间进行,这通常是可取的

最简单的方法是不使用OpenGL来变换顶点。在将顶点传递给OpenGL之前,使用您最喜欢的矩阵数学库将顶点与骨骼矩阵相乘。如果顶点的数量不是太多,它不会让你慢很多

更难的方法是实现蒙皮着色器。这就很好地介绍了如何做到这一点。其原理是将多个矩阵上传到OpenGL,并为每个顶点提供一个索引,该索引表示要与哪个矩阵相乘。这将比简单的方法快得多


GPU的速度很快,因为它们经过优化,可以在大量数据上执行相同的操作-折衷的办法是,在进行绘图调用时,您不能修改状态,例如更改矩阵。

嘿,自从我发布了我的问题并查看了刚才的回复,为所有有相同问题的人发布了答案,我注意到我已经有了一些答案,所以感谢您的回复

不过,既然我已经想出了一个解决方案,我想我会把答案和另外两个一起发布

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

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

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

再次感谢!只要我有资格投票,我就会投票