glBegin()中的干扰向量

问题描述 投票:-1回答:2

我正在尝试实现代码以渲染骨骼和网格动画。在我的glBegin(GL_TRIANGLES)部分中,我发现了一些矢量,似乎在不应该干扰我的信息的情况下。

glBegin(GL_TRIANGLES);
    for (int i = 0; i < mesh->nfaces.size(); i += 1)
      for (int k = 0; k < 3; k += 1) {
          int j = k;//2 - k;

          glm::vec4 myPointPrime;

          myPointPrime.w = 1;



          myPoint.x = ecks = mesh->vertex[mesh->faces[i][j]][0];
          myPoint.y = why = mesh->vertex[mesh->faces[i][j]][1];
          myPoint.z = zed = mesh->vertex[mesh->faces[i][j]][2];



            // Stuff vvvv THIS CAUSES PROBLEMS
          for (int t = 0; t < mySkeleton->vertex.at(i).size(); t++) {
              myPointPrime += mySkeleton->vertex[i][j] * MyXformations * myPoint;
          }

          glNormal3f(mesh->normal[mesh->nfaces[i][j]][0],
                    mesh->normal[mesh->nfaces[i][j]][1],
                    mesh->normal[mesh->nfaces[i][j]][2]);


          glVertex3f(mesh->vertex[mesh->faces[i][j]][0],
                    mesh->vertex[mesh->faces[i][j]][1],
                    mesh->vertex[mesh->faces[i][j]][2]);
         // glVertex3f(myPointPrime.x, myPointPrime.y, myPointPrime.z);
         // glVertex3f(myPoint.x, myPoint.y, myPoint.z);
    }
glEnd();

myPointPrime + = ...代码对我的Vertex调用来说很奇怪,除非我注释掉for循环,否则场景将无法渲染。

[如果我注释掉循环,则场景将渲染,但是如果对16,000个顶点进行动画处理,则我有点需要循环,

是否有让它与glVertex调用自动相乘的感觉?

编辑:

下面是代码的另一个版本,我希望应该更清楚一些,而不是在实际的绘图代码中计算点,我将整个网格更改为假定应该在每帧中跟随骨架,但是什么都不渲染。

for (int vertex_i = 0; vertex_i < mesh->nfaces.size(); vertex_i++) {
    for (int k = 0; k < 3; k += 1) {
        int j = k;//2 - k;

        pointp.x = 0;
        pointp.y = 0;
        pointp.z = 0;
        for (int t = 0; t < mySkeleton->vertex.at(vertex_i).size(); t++) {
            point.x = mesh->vertex[mesh->faces[vertex_i][j]][0];
            point.y = mesh->vertex[mesh->faces[vertex_i][j]][1];
            point.z = mesh->vertex[mesh->faces[vertex_i][j]][2];

            //glPushMatrix();
            pointp += mySkeleton->vertex[vertex_i][t] * myTranslationMatrix * myRotationMatrix * point;

            cout << "PointP X: " << pointp.x << " PointP Y: " << pointp.y << " PointP Z: " << pointp.z << endl;
            mesh->vertex[mesh->faces[vertex_i][j]][0] = pointp.x;
            mesh->vertex[mesh->faces[vertex_i][j]][1] = pointp.y;
            mesh->vertex[mesh->faces[vertex_i][j]][2] = pointp.z;
            //myPointPrime += MyXformations * myPoint;
        }
    }
}

我的假设是,pointp的计算可能没有按照我认为的去做?

mySkeleton-> vertex [vertex_i] [t]是我的'skeleton'类的向量,它包含每个顶点的所有权重,每个顶点有17个权重。

“ MyXformations”是从我的骨架动画函数传递的4x4矩阵,该矩阵保存了最后一个已知的关键帧,并将其应用于顶点。

point是顶点中的当前点。

c++ animation opengl glm-math
2个回答
0
投票

您的循环变量为t。但是,您在循环中引用了j。在我看来,您的循环可能会因j的较大值而崩溃。


0
投票

您没有在for循环中使用t。这是预期的吗?

[mySkeleton->vertex[i][j]似乎超出范围,因为j应该用于mesh->faces / mesh->nfaces

还可以将glNormal3fvglVertex3fv与数组一起使用。

通过超出范围的内存操作,您会发生各种奇怪的事情,尽管我看不到任何超出范围的写入。您的*运算符不修改对象吗?

如果您担心性能。您不应该使用即时模式。相反,将所有数据与缓冲区对象(包括联接/骨骼转换)一起放在GPU上,并在顶点着色器中动态进行动画处理。

这是几年前的,但值得一读:Animated Crowd Rendering

© www.soinside.com 2019 - 2024. All rights reserved.