游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2900|回复: 2

请问怎么样连续绘制两个图形显示在一个窗口上?

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2004-5-13 23:03:00 | 显示全部楼层 |阅读模式
目的是绘制一个直角坐标系,并绘制一个四棱锥体,让锥体响应键盘的函数,对坐标系进行旋转。我虽然绘制了,但是只是显示椎体,不显示坐标系。另外,怎么让键盘响应起来,我用的是鼠标响应。希望有时间的朋友给看看,下面是源程序:
#include <glut.h>

//bool bLoadIdentity= false;
static int rotAngle = 0;


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

//---画坐标系
///*
void drawAxis()
{
  glPointSize(5);
   glEnable(GL_POINT_SMOOTH);
   glBegin(GL_POINTS);
    glVertex2i(0,0);//在原点处画一个点
   glEnd();
   glBegin(GL_LINES);
    glVertex2i(0,0);
    glVertex2i(1,0);
    glVertex2i(0,0);
        glVertex2i(0,1);
    glVertex2i(0,0);
        glVertex2i(-1,-1);
   glEnd();
}
//*/

void display(void)
{  glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);   
   glMatrixMode(GL_MODELVIEW);
   //if(bLoadIdentity)

   glLoadIdentity();
   //---画坐标系----------------
///*
glPushMatrix();
   glLoadIdentity();
   glColor3f (1.0, 0.0, 0.0); //红色
   drawAxis();
   //------------------------
    glRotatef(90,0,0,1);
    //glTranslatef(0.5,0.0,0.0);
    glColor3f (.0, 1.0, .0); //绿色
    drawAxis();
   //----------------------------
        glRotatef(135,0,0,1);
    //glTranslatef(0.5,0.0,0.0);
    glColor3f (.0, .0, 1.0); //蓝色
    drawAxis();
glPopMatrix();
//*/
   gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
   glScalef(1.0,2.0,1.0);
   glTranslatef(0.0f,0.0f,0.5f);//移出屏幕0.5
   
   glRotated ((GLdouble)rotAngle, 1.0, 0.0, 0.0);        //--------绕x轴旋转
   //glutWireCube(1.0);
   glBegin(GL_TRIANGLES);//开始绘制锥体
            glColor3f(1.0f,0.0f,0.0f);          //red
                glVertex3f(0.0f,1.0f,0.0f);//front triangle (top piont)
                glColor3f(0.0f,1.0f,0.0f);          //green
                glVertex3f(-1.0f,0.0f,1.0f);//              (left)
                glColor3f(0.0f,0.0f,1.0f);          //blue
                glVertex3f(1.0f,0.0f,1.0f);//               (right)
        
                glColor3f(1.0f,0.0f,0.0f);          //red
                glVertex3f(0.0f,1.0f,0.0f);//right triangle (top point)
                glColor3f(0.0f,0.0f,1.0f);          //blue
                glVertex3f(1.0f,0.0f,1.0f);//               (left)
                glColor3f(1.0f,1.0f,0.0f);          //yellow
                glVertex3f(1.0f,0.0f,-1.0f);//              (right)
        
                glColor3f(1.0f,0.0f,0.0f);          //red
                glVertex3f(0.0f,1.0f,0.0f);//back triangle  (top point)
                glColor3f(1.0f,1.0f,0.0f);          //yellow
                glVertex3f(1.0f,0.0f,-1.0f);//              (left)
                glColor3f(1.0f,0.0f,1.0f);          //purple
                glVertex3f(-1.0f,0.0f,-1.0f);//             (right)
        
                glColor3f(1.0f,0.0f,0.0f);          //red
                glVertex3f(0.0f,1.0f,0.0f);//left triangle  (top point)
                glColor3f(1.0f,0.0f,1.0f);          //purple
                glVertex3f(-1.0f,0.0f,-1.0f);//             (left)
                glColor3f(0.0f,1.0f,0.0f);          //green
                glVertex3f(-1.0f,0.0f,1.0f);//              (right)
        glEnd();

    glBegin(GL_QUADS);
        glColor3f(0.0f,1.0f,0.0f);          //green
                glVertex3f(-1.0f,0.0f,1.0f);//bottum?
        glColor3f(0.0f,0.0f,1.0f);          //blue
                glVertex3f(1.0f,0.0f,1.0f);
                glColor3f(1.0f,1.0f,0.0f);          //yellow
                glVertex3f(1.0f,0.0f,-1.0f);
                glColor3f(1.0f,0.0f,1.0f);          //purple
                glVertex3f(-1.0f,0.0f,-1.0f);
    glEnd();
    glFlush();
}

void reshape(int w, int h)
{
        glViewport(0,0,(GLsizei)w,(GLsizei)h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
        glMatrixMode(GL_MODELVIEW);
        //gluOrtho2D(-1.0,1.0,-1.0,1.0);
}

//-------键盘响应------------------------------
/*
void keyboard(char key, int state, int x, int y)
{
        switch(key)
        {
        case 'x':
                //if(state == GLUT_DOWN)
                //{
                        //glRotated ((GLdouble)spin, 1.0, 0.0, 0.0);
                        spin = (spin+30)%360;
                        glutPostRedisplay();
                //}
                break;
    case 'y':
                    spin = (spin+30)%360;
                        glutPostRedisplay();
                break;
        case 'z':
            spin = (spin+30)%360;
                        glutPostRedisplay();
                break;
        default:
                break;
        }
}
*/

//------------鼠标响应---------------------------------
void mouse(int button, int state, int x, int y)
{
        switch(button)
        {
        case GLUT_LEFT_BUTTON:
                if(state == GLUT_DOWN)
                {
                        //glRotated ((GLdouble)rotAngle, 1.0, 0.0, 0.0);
                        rotAngle += 30.;
                        if (rotAngle >= 360.)
                                rotAngle = 0.;
                        glutPostRedisplay();
                }                 
                break;
        default:
                break;
        }
}




int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize (250, 250);
   glutInitWindowPosition (100, 100);
   glutCreateWindow ("OpenGL Transformation");
   init ();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   //glutKeyboardFunc(keyboard);  //-------注册键盘响应
   glutMouseFunc(mouse);  //---------注册鼠标响应
   glutMainLoop();
   return 0;
}

21

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
QQ
发表于 2004-5-21 17:10:00 | 显示全部楼层

Re:请问怎么样连续绘制两个图形显示在一个窗口上?

    我以为实现键盘响应,并不是给键盘赋上使物体变换的事件,而是通过变换不同的投影方向来实现的.不显示坐标的原因:背景颜色的设置和光照未关闭~未指定NORMAL(画线),深度检测,旋转变换改变了裁剪范围,等等等........(-_-||没有具体看)

2

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2004-5-23 23:36:00 | 显示全部楼层

Re:请问怎么样连续绘制两个图形显示在一个窗口上?

你没有定义材质,我以前也遇到过类似的情况
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-1 06:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表