【问题标题】:I'm having problems with wiring the teapot in OpenGL我在 OpenGL 中连接茶壶时遇到问题
【发布时间】:2016-12-18 00:59:26
【问题描述】:

代码的输出如下所示:

怎样才能让茶壶变成这个样子?:

我一直在尝试添加 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();
}

【问题讨论】:

  • 欢迎来到 SO!请解释您遇到的确切问题。说“它不起作用”根本没有帮助。

标签: opengl


【解决方案1】:

您可以在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的最后两个参数从1变成了100

你可以这样写:

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 侧视图)。

旁注:您应该阅读一些关于 OpenGL 矩阵的教程,例如 GL_MODELVIEW 和 GL_PROJECTION - 它们扮演什么角色以及如何操作它们

干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2020-10-01
    相关资源
    最近更新 更多