我正在尝试实现代码以渲染骨骼和网格动画。在我的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是顶点中的当前点。
您的循环变量为t
。但是,您在循环中引用了j
。在我看来,您的循环可能会因j
的较大值而崩溃。
您没有在for循环中使用t
。这是预期的吗?
[mySkeleton->vertex[i][j]
似乎超出范围,因为j
应该用于mesh->faces
/ mesh->nfaces
。
还可以将glNormal3fv
和glVertex3fv
与数组一起使用。
通过超出范围的内存操作,您会发生各种奇怪的事情,尽管我看不到任何超出范围的写入。您的*
运算符不修改对象吗?
如果您担心性能。您不应该使用即时模式。相反,将所有数据与缓冲区对象(包括联接/骨骼转换)一起放在GPU上,并在顶点着色器中动态进行动画处理。
这是几年前的,但值得一读:Animated Crowd Rendering。