render obj file with bad shapes

Started by
1 comment, last by Sonec Borec Nguyen 11 years, 6 months ago
Hi, I'm trying to make easy obj loader (loading car and map - two cars so far) and code looks good, but if I run it, cars looks bad:
14252342_fuuu.png

I don't know what's wrong. Can be some mistake in the code ? Please help, thanks

[source lang="cpp"]// MAIN.cpp - MAIN PROGRAM

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sstream>
#include <iostream>
#include "Lib\GL\headers\glut.h"
#include "Lib\GL\glm\glm.h"

using namespace std;

// Variables
float x=-26, y=-26, z=-500, deg_z=0, deg_y=0;
int displayList=0;
static int w=800,h=600;
GLfloat lightPos[4] = {50.0, 30.0 ,0.0, 0.0};
GLfloat lightAmb[3] = {0.1, 0.1, 0.1};
GLfloat lightDiff[3] = {1.0, 1.0, 1.0};
GLMmodel* car = NULL;
GLMmodel* car2 = NULL;

void initmodel(void) {
car = glmReadOBJ("Models/audi-tt.obj");
if (!car) exit(0);
glmFacetNormals(car);
glmVertexNormals(car, 90.0);

car2 = glmReadOBJ("Models/audi-tt.obj");
if (!car2) exit(0);
glmFacetNormals(car2);
glmVertexNormals(car2, 90.0);
}

void setCamera() {
if(h == 0) h = 1;
float ratio = 1.0 * w / h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h);
gluPerspective(30, ratio, 0.1, 10000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void display(void) {
setCamera();
glClearColor(0.3f, 0.5f, 0.9f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushAttrib(GL_ALL_ATTRIB_BITS);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightPos);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiff);
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

glPushMatrix();
// load first obj
glPushMatrix();
glTranslatef(x,y,z);
glRotatef(deg_z, 1.0, 0.0, 0.0);
glRotatef(deg_y, 0.0, 1.0, 0.0);
glmDraw(car, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
// load second obj
glPushMatrix();
glTranslatef(x+200,y,z);
glRotatef(deg_z, 1.0, 0.0, 0.0);
glRotatef(deg_y, 0.0, 1.0, 0.0);
glmDraw(car2, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();

glPopAttrib();
glFlush();
glutSwapBuffers();
}

void Keyboard(unsigned char key, int xx, int yy) {
glutPostRedisplay();
switch(key) {
case 'a' : x-=2; break; // Move left for X pos
case 'd' : x+=2; break; // Move right for X pos
case 's' : z+=2; break; // Move down for Z pos
case 'w' : z-=2; break; // Move up for Z pos
case '.' : y-=2; break; // Move up for Y pos
case ',' : y+=2; break; // Move down for Y pos
case 'k' : deg_z-=2.0; break; // Rotate up
case 'i' : deg_z+=2.0; break; // Rotate down
case 'j' : deg_y+=2.0; break; // Rotate left
case 'l' : deg_y-=2.0; break; // Rotate right
case 27 : exit(0); // Stop program
}
}

void Resize(int w, int h) {
if(h == 0) h = 1;
float ratio = 1.0 * w / h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h);
gluPerspective(30, ratio, 0.1, 1000);
glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char **argv) {
initmodel();
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(800,600);
glutCreateWindow(argv[0]);
glutKeyboardFunc(Keyboard);
glutDisplayFunc(display);

glutMainLoop();

return 0;
}
[/source]
Advertisement
Your imagehosting does not allow hotlinking so its hard to view your picture, i had to get the url from the source, better use another one next time to make it easier for other users to view your image. Link: http://img4.pixhost.org/images/1667/14252342_fuuu.png

Anyways, enabling depth testing should solve your problem
glEnable( GL_DEPTH_TEST );

ps. you might also want to enable back face culling if your model is set up properly
Thanks a lot, now it works like a charm :)

This topic is closed to new replies.

Advertisement