Java 在OpenGL中渲染加载了ASIMP的动画模型时折叠网格

Java 在OpenGL中渲染加载了ASIMP的动画模型时折叠网格,java,animation,opengl,glsl,assimp,Java,Animation,Opengl,Glsl,Assimp,因此,我正在加载和渲染动画模型,我可以在静态位置渲染网格,没有问题,还可以使用调试线绘制动画骨骼 正如你在视频中所看到的,我已经正确地显示了动画“木棍图”。但是,顶部的网格似乎仅部分正确显示 正如标题中提到的,我正在使用Assimp和OpenGL 在场景中加载的对象的模型加载端,遍历保持父子旋转的节点,识别属于骨骼的节点,并将骨骼信息添加到节点 └───Scene ├───Camera ├───Armature │ └───Torso : [ ROOT_BO

因此,我正在加载和渲染动画模型,我可以在静态位置渲染网格,没有问题,还可以使用调试线绘制动画骨骼

正如你在视频中所看到的,我已经正确地显示了动画“木棍图”。但是,顶部的网格似乎仅部分正确显示

正如标题中提到的,我正在使用Assimp和OpenGL

在场景中加载的对象的模型加载端,遍历保持父子旋转的节点,识别属于骨骼的节点,并将骨骼信息添加到节点

└───Scene
     ├───Camera
     ├───Armature
     │    └───Torso : [ ROOT_BONE ]
     │        ├───Chest : [ BONE ]
     │        │    ├───Neck : [ BONE ]
     │        │    │    └───Head : [ BONE ]
     │        │    ├───Upper_Arm_L : [ BONE ]
     │        │    │    └───Lower_Arm_L : [ BONE ]
     │        │    │        └───Hand_L : [ BONE ]
     │        │    └───Upper_Arm_R : [ BONE ]
     │        │        └───Lower_Arm_R : [ BONE ]
     │        │            └───Hand_R : [ BONE ]
     │        ├───Upper_Leg_L : [ BONE ]
     │        │    └───Lower_Leg_L : [ BONE ]
     │        │        └───Foot_L : [ BONE ]
     │        └───Upper_Leg_R : [ BONE ]
     │            └───Lower_Leg_R : [ BONE ]
     │                └───Foot_R : [ BONE ]
     └───Character: [ 1 MESH(ES) ]
下面是我当前模型节点结构的一个摘要。 每个节点都有一个变换矩阵,旁边有[ROOT_BONE]/[BONE]的节点还包括一个偏移矩阵

要渲染动画骨骼,我在动画关键帧中读取,基于插值的位置旋转和缩放值为每个“通道”(骨骼)构建矩阵。当我将动画矩阵相乘(基于其父层次)时,我将获得世界空间中的骨骼/连接位置。(我似乎不需要知道任何节点变换矩阵或骨骼偏移矩阵,以获得正确渲染。(只需将动画矩阵与其父动画矩阵相乘)

为了渲染网格,我尝试了一些方法,仅使用动画中的矩阵可以获得与上面所示视频类似的结果,但是躯干躺在调试骨架前面的地面上,手臂/腿的显示仍然与视频相同。视频中所示的结果是通过多种方法实现的将动画矩阵与相应的骨骼进行叠加,然后将结果传递给顶点着色器

uniform mat4 uModelViewProjection;
uniform mat4 uBones[100];

in vec4 aPosition;

in  vec4 aWeights;
in ivec4 aBoneIds;

void main(void) {
    mat4 skinMat =
    uBones[aBoneIds[0]] * aWeights[0] +
    uBones[aBoneIds[1]] * aWeights[1] +
    uBones[aBoneIds[2]] * aWeights[2] +
    uBones[aBoneIds[3]] * aWeights[3];

    gl_Position = uModelViewProjection * skinMat * aPosition;
}
下面是顶点着色器的相关代码。我在这里尝试了几种不同的方法,也得到了相同的结果(在某些情况下甚至更糟)

看到奇怪的“折叠”顶点后,我立即想到的一些事情可能是骨骼矩阵没有正确传递,我确实记录了它们以验证它们确实被发送,并且我还检查了着色器统一位置句柄以确保它们被正确找到

我假设我在某个地方遗漏了一个步骤,或者只是按照错误的顺序做了一些事情。我一直在为这个主题编写各种各样的“教程”,但它们都很难理解。(代码到处都是,没有最好的文档,我无法运行任何一个,因为所有的示例都需要不同的语言/预先存在的框架,或者它只是简单地被破坏了。)

其他信息:

  • 我当前尝试加载的模型是Collada(.dae)文件
  • 我正在为ASIMP和OpenGL使用LWJGL绑定

我终于解决了这个问题。当在OpenGL着色器中使用
ivec4
(或任何其他
I
前缀数据类型)作为属性时,必须使用
glvertexattributeinter
而不是
glvertexattributepointer
(注意
I
)。如果您不指定此项,缓冲区数据将以浮点形式发送到GPU。

Ah,谢谢您的提示。我阅读了您的帖子,在重现此问题时遇到了一些问题!