2016-12-13 1 views
0

의 코드의 출력을 찻 주전자 배선에 문제가 발생하는 것은 다음과 같습니다 :이내가 OpenGL을

을? : 같은 주전자 모양을 만들 수있는 방법

gluPerspectiveglViewport 명령을 추가하려고했지만 작동하지 않습니다.

#include<windows.h> 
#include<stdio.h> 
#include<GL/gl.h> 
#include<GL/freeglut.h> 


void DrawScene(void); 

void DrawSceneAxes(void); 

void InitOpenGL(void); 

void ReshapeWindow(int width, int height); 

int mainWindow; 

int main(int argc, char **argv) 
{ 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); 
glutInitWindowSize(800, 600); 
glutInitWindowPosition(150,150); 
mainWindow = glutCreateWindow("Transformacje czajnikowe"); 
if(mainWindow == 0){ 
    puts("Can't create window!\n"); 
    exit(-1); 
} 
glutSetWindow(mainWindow); 

glutDisplayFunc(DrawScene); 
glutReshapeFunc(ReshapeWindow); 

InitOpenGL(); 

glEnable(GL_DEPTH_TEST); 

glutMainLoop(); 

return(0); 
} 


void DrawScene(void) 
{ 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

DrawSceneAxes(); 

glutSwapBuffers(); 

} 


void DrawSceneAxes(void) 
{ 
typedef float pt3d[3]; 


pt3d x_beg = { -10.0f, 0.0f, 0.0f }; 
pt3d x_end = { 10.0f, 0.0f, 0.0f }; 


pt3d y_beg = { 0.0f, -10.0f, 0.0f }; 
pt3d y_end = { 0.0f, 10.0f, 0.0f }; 


pt3d z_beg = { 0.0f, 0.0f, -10.0f }; 
pt3d z_end = { 0.0f, 0.0f, 10.0f }; 


glBegin(GL_LINES); 

    glColor3f(1.0f, 0.0f, 0.0f); 
    glVertex3fv(x_beg); 
    glVertex3fv(x_end); 


    glColor3f(0.0f, 1.0f, 0.0f); 
    glVertex3fv(y_beg); 
    glVertex3fv(y_end); 


    glColor3f(0.0f, 0.0f, 1.0f); 
    glVertex3fv(z_beg); 
    glVertex3fv(z_end); 
glEnd(); 

glutWireTeapot(4.0); 
} 


void InitOpenGL(void) 
{ 
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
} 


void ReshapeWindow(int width, int height) 
{ 
//printf("w: %d\n", width); 
//printf("h: %d\n", height); 
GLdouble nRange = 15.0f; 
if(height == 0) 
{ 
    height = 1; 
} 

if(width == 0) 
{ 
    width = 1; 
} 

glViewport(0, 0, width, height); 

glMatrixMode(GL_PROJECTION); 

glLoadIdentity(); 

if(width <= height) 
    glOrtho(-nRange, nRange, -nRange*((GLdouble)height/width), nRange*((GLdouble)height/width), -1.0f, 1.0f); 
else 
    glOrtho(-nRange*((GLdouble)width/height), nRange*((GLdouble)width/height), -nRange, nRange, -1.0f, 1.0f); 

glMatrixMode(GL_MODELVIEW); 

glLoadIdentity(); 
} 
+2

에 오신 것을 환영합니다 SO에 조작하는 방법! 정확한 문제를 설명해주십시오. "작동하지 않습니다."라고 말하면 전혀 도움이되지 않습니다. – Mark

답변

0

당신은 라인 glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

if (width <= height) 
    glOrtho(-nRange, nRange, -nRange*((GLdouble)height/width), nRange*((GLdouble)height/width), -100.0f, 100.0f); 
else 
    glOrtho(-nRange*((GLdouble)width/height), nRange*((GLdouble)width/height), -nRange, nRange, -100.0f, 100.0f); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

이 당신에게 직교 투영을 줄 것이다 (- 깊이없이 2D 사이드 뷰 모양) 한 후이 시작을 할 수 있습니다. glOrtho의 마지막 두 매개 변수는 100

1에서 변경 참고이 대신 같은 것을 넣을 수 있습니다 :

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glFrustum(-1, 1, -1*((GLdouble)height/width), 1*((GLdouble)height/width), 1, nRange); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(0, 0, -10); 

이 당신 원근 투영을 줄 것이다 (3D 사이드 뷰처럼 보인다).

사이드 참고 : GL_MODELVIEW 및 GL_PROJECTION 같은 OpenGL은 매트릭스에 대한 몇 가지 튜토리얼을 읽어야합니다 - 그들은 역할이 무엇을하고

건배를 그들에게