将法线绘制到曲面

时间:2010-10-27 05:22:53

标签: opengl

我正在尝试将法线向量绘制到网格文件中,以便我可以看到法向量如何从其受尊重的脸部反弹。在绘图功能中,它接收每个面并从面的中心点到(中心+法线向量)绘制一条线。然而,当我跑步时,我看不到任何红线从每张脸上反弹。我在这里做错了什么?

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;
}

1 个答案:

答案 0 :(得分:0)

法线也可能指向错误的方向 - 例如,如果三角形的方向相反,则法线可能会进入绘制的对象。此外,由于你的法线未标准化(单位长度),因此可能很难看到esp。如果你的三角形很小。