2011-04-14 6 views
2
#include "std_lib_facilities.h" 
#include <GL/glut.h> 

static float dx=0.0; 
static float dz=10; 
static float points[2]; 
static float cx=0.0; 
static float cy=0.0; 
static float cz=0.0; 
static float spin=0.0; 
static float rotation=1.0; 


int readObject() 
{ 

    ifstream inputFile("spikeBall.ogl"); 

    if(!inputFile) 
    { 
     cerr << "cannot open file spikeBall.ogl" << endl; 
     return -1; 
    } 
    int count = 0; 
    float x,y,z; 

    do{ 
     inputFile >> count; 
     glBegin(GL_POLYGON); 
     for(int i=0;i<count;i++) 
     { 
      inputFile >> x >> y >> z; 
      glVertex3f(((x/5)+cx),((y/5)+cy),((z/5)+cz)); 
     } 
     glEnd(); 

    }while(count!=0); 

    inputFile.close(); 
} 

void init(void) 
{ 
    glClearColor(0.0,0.0,0.0,0.0); 
} 

void display(void) 
{ 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_DEPTH_TEST); 

    glLoadIdentity(); 
    gluLookAt (0,0,20, 0.0,0.0,0.0, 0.0,1.0,0.0); 

    glPushMatrix(); 

    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 

    GLfloat aMaterial[]={0.1745,0.01175,0.01175,1.0}; 
    GLfloat bMaterial[]={0.61424,0.04136,0.04136,1.0}; 
    GLfloat cMaterial[]={0.727811,0.626959,0.626959,1.0}; 
    GLfloat dMaterial=40; 

    glMaterialfv(GL_FRONT,GL_AMBIENT,aMaterial); 
    glMaterialfv(GL_FRONT,GL_DIFFUSE,bMaterial); 
    glMaterialfv(GL_FRONT,GL_SPECULAR,cMaterial); 
    glMaterialf(GL_FRONT,GL_SHININESS,dMaterial); 

    readObject(); 
    glRotatef(spin,0.0,1.0,0.0); 

    glPopMatrix(); 
    glFlush(); 
} 

void idleFunc(void) 
{ 
    spin+=rotation; 
    if(spin>360.0) 
    { 
     spin-=360.0; 
    } 
    cz+=0.1; 
    if(cz=20) 
    { 
     srand((unsigned int) time(NULL)); 
     for(int i=0;i<2;i++) 
     { 
      points[i] = (rand()%20)-10; 
     } 
     cx = points[0]; 
     cy = points[1]; 
     cz = 0; 
     GLfloat lightPos[] = {cx,cy,(cz+2),1.0}; 
     glLightfv(GL_LIGHT0,GL_POSITION,lightPos); 
     std::cout << "cx:" << cx; 
     std::cout << "cy:" << cy; 
     std::cout << "cz:" << cz; 
    } 
    else 
    { 
    } 
    glutPostRedisplay(); 
} 

void reshape (int w, int h) 
{ 
    glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0,20.0); 
    glMatrixMode(GL_MODELVIEW); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(300,300); 
    glutInitWindowPosition(0,0); 
    glutCreateWindow("3ds Max loader"); 
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    init(); 
    glutIdleFunc(idleFunc); 
    glutMainLoop(); 
    return(0); 
} 

3ds max에서 뾰족한 구를 만들어서 .obj로 내보내고 일부 파이썬을 통해 .ogl 파일을 얻었습니다. 앞으로 나아가고 싶습니다. 하여 x와 y 축에 임의의 지점으로 반환하기 전에 화면,하지만 그것은 단지난수 생성기가 호출되어서는 안되는 경우 호출됩니다.

답변

2
cz+=0.1; 
if(cz=20) 
{ 
    [random generator code] 
} 

두 문제가 여기 주위에 튀는 계속 :

먼저 당신이 (=) 20 cz에 할당하는 대신 비교하고 (==) - 더 나쁜 경우에도이 평가판 tes를 true로 설정하고 대괄호 안의 코드를 항상 트리거합니다. 컴파일러를 좀 더 장황한 경고 모드로 바꾸거나 경고를주의 깊게 읽는 것을 고려해야합니다. this link f.e.를 참조하십시오 - 당신은 대부분의 아마 때문에 소수점 연산 부동의 지점을 그리워하기 때문에

두 번째는 엄격한 평등하지만 <= 또는 >=를 사용하여와 수레를 비교해서는 안 당신이 그 문제에 익숙하지 않다면. 그래서 수정 된 코드는 다음과 같아야합니다 cz=20 항상 진정한 표현을 반환하기 때문에 rand() 부분이 호출되고

cz += 0.1; 
if (cz >= 20) 
{ 
    [...] 
} 
+0

한 번 더 질문 glRotatef()는 어디에서 회전해야하며 glove() 메서드에서 glient() 메서드를 사용했을 때와 같이 장소 전체에 내 영역의 모든 부분을 던지지 않아야합니다. – Darren

+0

질문을 수정하면 안된다. 답변을 수락하면보기가 훨씬 줄어들므로 기존 질문을 편집하는 대신 새로운 질문을 시작하는 것이 좋습니다. 두 가지 대답을 받아 들일 수 없으므로 혼란스럽고 불공평합니다. – schnaader

0

있다. 당신은

if(cz=20) 

if(cz==20) 

변경해야합니다 아니면 >= 더 나은 운영자 될 것이다.

+0

감사합니다. – Darren