1
我想绘制法线向量到网格文件,这样我就可以看到法线向量如何从他们受人尊敬的面部反弹。在绘图函数中,它绘制每个面并从面的中心点到(中心+法线向量)绘制一条线。然而,当我运行它时,我没有看到任何红线从每张脸上反弹。我在这里做错了什么?绘制法线到曲面
void drawTria(myFace face) {
glNormal3f((face.getNormal().x), (face.getNormal().y), (face.getNormal().z));
wired ? glBegin(GL_LINE_LOOP) : glBegin(GL_POLYGON);
glColor3f(0.0, 0.0, 0.5);
glVertex3f(vertexList.at(face.v1-1).x, vertexList.at(face.v1-1).y, vertexList.at(face.v1-1).z);
glVertex3f(vertexList.at(face.v2-1).x, vertexList.at(face.v2-1).y, vertexList.at(face.v2-1).z);
glVertex3f(vertexList.at(face.v3-1).x, vertexList.at(face.v3-1).y, vertexList.at(face.v3-1).z);
glEnd();
// Drawing normals
glBegin(GL_LINES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(face.getCenter().x, face.getCenter().y, face.getCenter().z);
glVertex3f((face.getCenter().x+face.getNormal().x), (face.getCenter().y+face.getNormal().y), (face.getCenter().z+face.getNormal().z));
glEnd();
}
myVertex myFace::getCenter() {
myVertex center;
center.x = (vertexList.at(v1-1).x + vertexList.at(v2-1).x + vertexList.at(v3-1).x)/3;
center.y = (vertexList.at(v1-1).y + vertexList.at(v2-1).y + vertexList.at(v3-1).y)/3;
center.z = (vertexList.at(v1-1).z + vertexList.at(v2-1).z + vertexList.at(v3-1).z)/3;
return center;
}
myVertex myFace::getNormal() {
myVertex normal;
normal.x = ((vertexList.at(v2-1).y - vertexList.at(v1-1).y)
* (vertexList.at(v3-1).z - vertexList.at(v1-1).z))
- ((vertexList.at(v2-1).z - vertexList.at(v1-1).z)
* (vertexList.at(v3-1).y - vertexList.at(v1-1).y));
normal.y = ((vertexList.at(v2-1).z - vertexList.at(v1-1).z)
* (vertexList.at(v3-1).x - vertexList.at(v1-1).x))
- ((vertexList.at(v2-1).x - vertexList.at(v1-1).x)
* (vertexList.at(v3-1).z - vertexList.at(v1-1).z));
normal.z = ((vertexList.at(v2-1).x - vertexList.at(v1-1).x)
* (vertexList.at(v3-1).y - vertexList.at(v1-1).y))
- ((vertexList.at(v2-1).y - vertexList.at(v1-1).y)
* (vertexList.at(v3-1).x - vertexList.at(v1-1).x));
return normal;
}
创建一个由单个三角形(0,0)(1,0)(0,1)组成的“模型”,并确保您的法线是预期的(0,0,1),并且您的中心点是合适的。 – genpfault 2010-10-27 15:10:15
你也可以考虑简化你的代码。它很难阅读,并且为你的简单任务执行了太多的操作 - 比如只需要一次就调用getCenter 6次等等。 – rotoglup 2010-10-27 18:40:16
像genpfault说的那样,把它简化为简单的问题:getNormal()产生一个简单的案例的正确答案? getCenter()?你也可以打印出'//绘制法线'下的顶点,看看第一个点是否与第二个点相同。 – LarsH 2010-10-28 02:03:45