Почему не корректно срабатывает ZBuffer

156
09 ноября 2021, 11:10

Помогите, уже второй день не могу понять, почему у меня не корректно отображается 3d сцена, плоскости не перекрываются, почему, не понятно

class Camera {
public:
    glm::quat camera_quat;
    GLfloat x = 0.5, y = 6.5, z = -60;
    GLfloat centerx = 0.5, centery = 0, centerz = 1;
    GLfloat rotx = 1, roty = 0, rotz = 0;
};
struct point3d {
    float x, y, z;
};
class Scene {
public:
    Camera* camera = new Camera();
};
float speedx = 0;
struct coordinate {
    float x, y, z;
    coordinate(float a, float b, float c) : x(a), y(b), z(c) {};
};
float angle = 0.0;      
Scene* scene = new Scene();
std::vector <Object3D>* objects3D = new std::vector < Object3D>();
float offset = 0;
bool loaded = false;
void display(void)
{
    if (!loaded) {
        loader.LoadFile("map3.obj", objects3D);
        loaded = true;
    }
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    int height = glutGet(GLUT_WINDOW_HEIGHT);
    int width = glutGet(GLUT_WINDOW_WIDTH);
    gluPerspective(60.0f, (double)width / (double)height, 0.0f, 300.0f);

    glm::mat4 myMatrix;
    glm::vec4 myVector;
    float key_pitch = 5, key_yaw = 0, key_roll = 0;
    glm::quat key_quat = glm::quat(glm::vec3(key_pitch, key_yaw, key_roll));
    key_pitch = key_yaw = key_roll = 0;
    scene->camera->camera_quat = key_quat * scene->camera->camera_quat;
    scene->camera->camera_quat = glm::normalize(scene->camera->camera_quat);
    glm::mat4 rotate = glm::mat4_cast(scene->camera->camera_quat);
    glm::mat4 translate = glm::mat4(1.0f);
    glm::vec3 eyeVector(0, 0, 0);
    translate = glm::translate(translate, -eyeVector);
    glm::mat4 viewMatrix = rotate * translate;

    glMatrixMode(GL_MODELVIEW); //СМОТРЕТЬ ОТСЮДА ----------------------------------->
    glLoadIdentity();
    gluLookAt(scene->camera->x, scene->camera->y, scene->camera->z, scene->camera->x + scene->camera->rotx, scene->camera->y + scene->camera->roty, scene->camera->z + scene->camera->rotz, 0, 1, 0);
    glMatrixMode(GL_MODELVIEW);
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    for (int i = 0; i < objects3D->size(); i++)
    {
        for (int k = 0; k < objects3D->at(i).vertex.size(); k++)
        {
            glEnable(GL_TEXTURE_2D);
            glColor3d(1, 1, 1);
            glBindTexture(GL_TEXTURE_2D, objects3D->at(i).texture);
            glBegin(GL_POLYGON);
            for (int j = 0; j < objects3D->at(i).vertex.at(k).size(); j++)
            {
                glTexCoord2d(objects3D->at(i).vertex.at(k).at(j).TextureCoordinate.X, objects3D->at(i).vertex.at(k).at(j).TextureCoordinate.Y);
                glVertex3f(objects3D->at(i).vertex.at(k).at(j).Position.X, objects3D->at(i).vertex.at(k).at(j).Position.Y, objects3D->at(i).vertex.at(k).at(j).Position.Z);
            }
            glEnd();
            glDisable(GL_TEXTURE_2D);
        }
    }
    glutSwapBuffers();
    glutPostRedisplay();
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("game");
    glutDisplayFunc(display);
    glutMainLoop();
}

Вот сама неправильно отрисованная сцена, ну вы сами видите, например забор за домом правильно отрисовался, а вот окна на задней стороне домика совсем не правильно, они не должны были отрисовываться, что делать? ((((((((

UPD:

READ ALSO
Сортировка по алфавиту

Сортировка по алфавиту

Собственно говоря мне нужно отсортировать " string name;" по алфавитуЖелательно без указателей и векторов

67
Как запустить команду в cmd

Как запустить команду в cmd

Как можно запустить команду cmd через system(""); что бы при этом не открывалась консоль именно при вызове system("");

189
Разные типы параметров у std::ios_base::width и std::setw

Разные типы параметров у std::ios_base::width и std::setw

Почему потоковый width для изменения принимает параметр типа std::streamsize, в то время как манипулятор setw принимает простой int? Насколько я понимаю,...

99
default initialization для std::vector

default initialization для std::vector

Можно ли как-то проинициализировать n элементов std::vector<int> по-умолчанию, те

81