我正在尝试在传统OpenGL中进行骨架动画,并认为我可以在各个顶点上使用矩阵。当我编程并且它不起作用时,我做了一些谷歌搜索:https://www.talisman.org/opengl-1.1/Reference/glLoadMatrix.html
如果在执行glBegin和glEnd的相应执行之间执行glLoadMatrix,则会生成GL_INVALID_OPERATION。
所以现在我很难过。这是一个图表:
骨头标有红色。我正在尝试进行骨骼动画,因此有两个矩形。一个使用Bone 0,第二个使用Bone 1.只有构成第二个矩形的三角形的特定顶点使用Bone 1的旋转矩阵,而不使用Bone 0的旋转矩阵的三角形的特定顶点,有点像蛇,如果这是有道理的。
由于我不能将glLoadMatrix用于三角形中的各个顶点,我还可以基于存储的矩阵替换顶点?也许将一些矩阵值乘以顶点?不知道如何去做。任何意见都表示赞赏,谢谢!
答案 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,并为每个顶点提供一个索引,该索引说明要与哪个矩阵相乘。这比简单方法快得多。
再次感谢!只要我有声誉,我就会投票!