游戏开发论坛

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

Opengl画动态直线问题,请高手看看程序,在线等

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-1-21 10:33:00 | 显示全部楼层 |阅读模式
希望达到的效果是动态直线一边画,一边可以使用旋转进行观察。退一步或者画完后可以进行旋转、缩放等进行观察也可以。
程序实际是:在矩形框内画出动态直线后,使用旋转时,每旋转一步,动态直线重绘一次,当把画动态直线部分屏蔽掉,矩形框旋转很正常。所以觉得可能是画动态直线时进入循环需要时间,考虑了很长时间,不知道如何解决。特此请教高手,非常着急,在线等。

#include<GL/glaux.h>
#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glut.h>

static int rotate=0;
int clrBufferFlag=1;
float view_rotx=0.0;
float view_roty=0.0;


void init(void)
{
        glClearColor(0.0,0.0,0.0,0.0);//设定缓存的清除值
        glShadeModel(GL_FLAT);//选择平面明暗模式
}
static void special(int k, int x, int y)
{
        switch (k)
        {
        case GLUT_KEY_UP:
                view_rotx += 5.0;
                break;
        case GLUT_KEY_DOWN:
                view_rotx -= 5.0;
                break;
        case GLUT_KEY_LEFT:
                view_roty += 5.0;
                break;
        case GLUT_KEY_RIGHT:
                view_roty -= 5.0;
                break;
   
        default:
                return;
        }
        glutPostRedisplay();
}
void display(void)
{
        glClear(GL_COLOR_BUFFER_BIT);//清除缓存为设定值
        gluLookAt(1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);//视点设置
        glPushMatrix();
       
       
        //glLoadIdentity();//将栈顶设为单位矩阵
       
        glRotatef((GLfloat) rotate,0.0,1.0,0.0);
        glRotatef((GLfloat)view_rotx, 1.0, 0.0, 0.0);
        glRotatef((GLfloat)view_roty, 0.0, 1.0, 0.0);

       
        glColor3f(1.0,0.0,0.0);//红色
        //glScalef(600.0,600.0,500.0);
        glutWireCube(600.0);//画线框
        //glFlush();
        //glEnable(GL_LINE_SMOOTH);
        glTranslatef(-300.0,-300.0,-300.0);
        //glTranslatef(-300.0,-300.0,0.0);
            glBegin(GL_LINES);
                     glColor3f(0.0,1.0,1.0);
                 glVertex3f(0.0,0.0,0.0);
                 glVertex3f(800.0,0.0,0.0);
                         
                         
                         glColor3f(1.0,1.0,0.0);
             glVertex3f(0.0,0.0,0.0);
                         glVertex3f(0.0,800.0,0.0);

                         glColor3f(1.0,0.0,1.0);
                         glVertex3f(0.0,0.0,0.0);
                         glVertex3f(0.0,0.0,800.0);

            glEnd();



//****************************************//画动态直线部分
//*
                //int clrBufferFlag=1;

        int pos_x=20,pos_y=30,pos_z=5;
        int count=0;
        while (count<15)
        {                                if (clrBufferFlag==1)
                                        {
                          //glClear(GL_COLOR_BUFFER_BIT);
                                         clrBufferFlag=0;
                                        }
                                       
       
                                        //glLoadIdentity();
                                        //gluLookAt(1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);
                                        //glRotatef((GLfloat) rotate,0.0,1.0,0.0);
                                        //glEnable(GL_LINE_SMOOTH);

                                        glColor3f(1.0,0.0,0.0);
                                        glBegin(GL_LINES);
                                                glColor3f(1.0,1.0,1.0);
                                                glVertex3f(pos_x,pos_y,pos_z);
                                                pos_x+=10;pos_y+=15;pos_z+=20;
                                                glVertex3f(pos_x,pos_y,pos_z);
                                        glEnd();
                                        //glPopMatrix();
                                        //glDisable(GL_LINE_SMOOTH);
                                        glFlush();
                                        Sleep(100);
                                        count++;
        }  // end of while       
        //*/
        //****************************************画动态直线结束

       
        glPopMatrix();
        glutSwapBuffers();//交换当前窗口的缓存
}



void reshape(int w,int h)
{
        glViewport(0,0,(GLsizei)w,(GLsizei) h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-550,550,-550,550,1300,-700);

        glMatrixMode(GL_MODELVIEW);
}


void keyboard(unsigned char key,int x,int y)
{
        switch(key){
        case 'r':
                        rotate=(rotate+5)%360;
                        glutPostRedisplay();
                //rotate+=1.0f;
                        break;
        case 'R':
                rotate=(rotate-5)%360;
                glutPostRedisplay();
                break;
        case 27:
                exit(0);
                break;
        default:
                break;
        }

}

int main(int argc,char **argv)
{
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
        glutInitWindowSize(600,600);
        glutInitWindowPosition(100,100);
        glutCreateWindow(argv[0]);
        init();
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        glutSpecialFunc(special);
        glutKeyboardFunc(keyboard);
        glutMainLoop();
        //Sleep(100);
        return 0;
}

30

主题

422

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2006-1-22 15:32:00 | 显示全部楼层

Re:Opengl画动态直线问题,请高手看看程序,在线等

/// 不知道你满意了没- -
#include<GL/glaux.h>
#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glut.h>

static float rotate=0;
int clrBufferFlag=1;
float view_rotx=0.0;
float view_roty=0.0;
int count = 0;
int pos_x1=20,pos_y1=30,pos_z1=5;
int pos_x=20,pos_y=30,pos_z=5;

void init(void)
{
    glClearColor(0.0,0.0,0.0,0.0);//É趨»º´æµÄÇå³ýÖµ
    glShadeModel(GL_FLAT);//Ñ¡ÔñÆ½ÃæÃ÷°µÄ£Ê½
}
static void special(int k, int x, int y)
{
    switch (k)
    {
    case GLUT_KEY_UP:
        view_rotx += 5.0;
        break;
    case GLUT_KEY_DOWN:
        view_rotx -= 5.0;
        break;
    case GLUT_KEY_LEFT:
        view_roty += 5.0;
        break;
    case GLUT_KEY_RIGHT:
        view_roty -= 5.0;
        break;
        
    default:
        return;
    }
    glutPostRedisplay();
}


void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);//Çå³ý»º´æÎªÉ趨ֵ
    gluLookAt(1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);//ÊÓµãÉèÖÃ
    glPushMatrix();
   
   
    //glLoadIdentity();//½«Õ»¶¥ÉèΪµ¥Î»¾ØÕó
    glLoadIdentity();
    glRotatef((GLfloat) rotate,0.0,1.0,0.0);
    glRotatef((GLfloat)view_rotx, 1.0, 0.0, 0.0);
    glRotatef((GLfloat)view_roty, 0.0, 0.0, 1.0);
   
   
    glColor3f(1.0,0.0,0.0);//ºìÉ«
    //glScalef(600.0,600.0,500.0);
    glutWireCube(600.0);//»­Ïß¿ò
    //glFlush();
    //glEnable(GL_LINE_SMOOTH);
    glTranslatef(-300.0,-300.0,-300.0);
    //glTranslatef(-300.0,-300.0,0.0);
    glBegin(GL_LINES);
    glColor3f(0.0,1.0,1.0);
    glVertex3f(0.0,0.0,0.0);
    glVertex3f(800.0,0.0,0.0);
   
   
    glColor3f(1.0,1.0,0.0);
    glVertex3f(0.0,0.0,0.0);
    glVertex3f(0.0,800.0,0.0);
   
    glColor3f(1.0,0.0,1.0);
    glVertex3f(0.0,0.0,0.0);
    glVertex3f(0.0,0.0,800.0);
   
    glEnd();
   
   
    //****************************************//»­¶¯Ì¬Ö±Ïß²¿·Ö
    //*
    //int clrBufferFlag=1;
   
    if (clrBufferFlag==1)
    {
        //glClear(GL_COLOR_BUFFER_BIT);
        clrBufferFlag=0;
    }
   
   
    //glLoadIdentity();
    //gluLookAt(1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);
    //glRotatef((GLfloat) rotate,0.0,1.0,0.0);
    //glEnable(GL_LINE_SMOOTH);
   
    glColor3f(1.0,0.0,0.0);
    glBegin(GL_LINES);
    glColor3f(1.0,1.0,1.0);
    glVertex3f(pos_x1,pos_y1,pos_z1);
    glVertex3f(pos_x,pos_y,pos_z);
    glEnd();
    //glPopMatrix();
    //glDisable(GL_LINE_SMOOTH);

    //*/
    //****************************************»­¶¯Ì¬Ö±Ïß½áÊø
   
   
    glPopMatrix();
    glFlush();
    glutSwapBuffers();//½»»»µ±Ç°´°¿ÚµÄ»º´æ
}
void update()
{
    count++;
    pos_x+=10;pos_y+=15;pos_z+=20;
    if (count == 15)
    {
        pos_x=pos_x1;
        pos_y=pos_y1;
        pos_z=pos_z1;
        count = 0;
    }
    Sleep(100);
    glutPostRedisplay();
}

void reshape(int w,int h)
{
    glViewport(0,0,(GLsizei)w,(GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-550,550,-550,550,1300,-700);
   
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}


void keyboard(unsigned char key,int x,int y)
{
    switch(key){
    case 'r':
        rotate += 1;
        if (rotate > 360)
            rotate -= 360;
        glutPostRedisplay();
        //rotate+=1.0f;
        break;
    case 'R':
        rotate -= 1;
        if (rotate < 0)
            rotate += 360;
        glutPostRedisplay();
        break;
    case 27:
        exit(0);
        break;
    default:
        break;
    }
   
}

int main(int argc,char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(600,600);
    glutInitWindowPosition(100,100);
    glutCreateWindow(argv[0]);
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutSpecialFunc(special);
    glutKeyboardFunc(keyboard);
    glutIdleFunc(update);
    glutMainLoop();
    return 0;
}

13

主题

49

帖子

55

积分

注册会员

Rank: 2

积分
55
QQ
发表于 2006-1-25 19:54:00 | 显示全部楼层

Re:Opengl画动态直线问题,请高手看看程序,在线等

把关键代码贴出来就行了,怎么跟出书的人一样,狂贴代码占篇幅
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 08:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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