0

問題があります。glut(openGLユーティリティツールキット)を使用しています。メインウィンドウにサブウィンドウを作成しています。メインウィンドウには単純な図が表示され、サブウィンドウには別のビューからの図が表示されます。図が回転するため、メインウィンドウとサブウィンドウは常に再表示されます。

しかし、2つのうち1つだけが回転図を表示します。したがって、プログラムを開始すると、メインウィンドウの図形は回転しますが、サブウィンドウでは回転せず、静止しているだけです。

サブウィンドウでマウスを動かして任意のキーを押すと、役割が変わり、フィギュアがサブウィンドウで回転し、メインウィンドウで静止します。

どうすれば両方を同時に表示させることができますか。Lighthouseのチュートリアルに従いましたが、答えが得られませんでした。ビューポートで何かする必要がありますか?

 * GLUT Shapes Demo
 *
 * Written by Nigel Stewart November 2003
 *
 * This program is test harness for the sphere, cone
 * and torus shapes in GLUT.
 *
 * Spinning wireframe and smooth shaded shapes are
 * displayed until the ESC or q key is pressed.  The
 * number of geometry stacks and slices can be adjusted
 * using the + and - keys.
 */
#include <windows.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <math.h>
#include <stdlib.h>

static int slices = 16;
static int stacks = 16;
int m=0;


int mainWindow,SubWindow, SubWindow2;

/* GLUT callback Handlers */

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-10,10,-10,10,-10,10);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;

        case '+':
            slices++;
            stacks++;
            break;

        case '-':
            if (slices>3 && stacks>3)
            {
                slices--;
                stacks--;
            }
            break;
    }


    //glutPostRedisplay();
}
void keyp(int key, int xx, int yy) {


    glutSetWindow(mainWindow);
    glutPostRedisplay();

}

void displaysub()
{const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;

    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
     glClearColor(20,1,1,1);
     glLoadIdentity();
     glOrtho(-5,5,-5,5,-5,5);
    glColor3f(0,0,0);
glRotated(a,0,0,10);
    glPushMatrix();
        glTranslated(0,0,0);
        glutSolidSphere(2,10,10);
    glPopMatrix();

    glutSwapBuffers();
}

void display()
{const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;
        glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
     glClearColor(3,0,0,1);
glLoadIdentity();
     glOrtho(-10,10,-10,10,-10,10);
     glRotated(a,10,10,0);


displaysub();


}

static void idle(void)
{
    glutPostRedisplay();
}

/* Program entry point */
void init()
{


    glClearColor(3,0,0,1);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    // register callbacks
    glutIgnoreKeyRepeat(1);
    glutKeyboardFunc(key);
    glutSpecialFunc(keyp);

}



int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);


    mainWindow = glutCreateWindow("GLUT Shapes");
        glutSetWindow(mainWindow);
        glClearColor(3,0,0,1);
        glutDisplayFunc(display);
        init();


    SubWindow = glutCreateSubWindow(mainWindow,0,0,50,50);
        glutSetWindow(SubWindow);
        glClearColor(3,0,0,1);
        glutDisplayFunc(displaysub);
        init();



  glutIdleFunc(idle);
    glutMainLoop();

    return 1;
}
4

1 に答える 1

6

のドキュメントでglutPostRedisplayは、現在のウィンドウの表示機能のみが呼び出されると指定されています。この場合、2つのウィンドウがあります。私は過剰使用の専門家ではありませんが、2つの変更を提案します

関数から削除displaysub()してdisplay()書き直しますidle()

static void idle()
{
  int currentWindow = glutGetWindow();
  glutSetWindw(mainWindow);
  glutPostRedisplay();
  glutSetWindw(subWindow);
  glutPostRedisplay();
  glutSetWindow(currentWindow);
}

glutPostRedisplayメインループで更新するウィンドウをマークするだけです。これは、マウスフォーカスのあるウィンドウだと思います。現在のウィンドウとは関係なくウィンドウごとに投稿を行うことにより、すべてのウィンドウがそれぞれの表示呼び出しを受け取ります

于 2012-12-28T22:48:57.053 に答える