Рисование нормалей к поверхностям - PullRequest
1 голос
/ 27 октября 2010

Я пытаюсь нарисовать нормальные векторы в файл сетки, чтобы увидеть, как нормальные векторы отскакивают от их уважаемой грани. В функции рисования она берет каждую грань и рисует линию от центральной точки грани до (центр + вектор нормали). Однако, когда я запускаю его, я не вижу никаких красных линий, отражающихся от каждого лица. Что я тут не так делаю?

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 голосов
/ 29 октября 2010

нормали могут также указывать в неправильном направлении - например, если ориентация треугольников обратная, чем нормаль может попасть в нарисованный объект. Кроме того, так как ваш нормальный здесь не нормализован (длина блока), может быть трудно увидеть esp. если ваши треугольники маленькие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...