C++ OpenGL子窗口don';我不能同时回应
我有一个问题,我正在使用glut(openGL实用工具工具包)。我正在主窗口中制作一个子窗口。主窗口显示一个简单的地物,子窗口显示另一个视图中的地物。图形会旋转,因此应始终重新显示主窗口和子窗口 但这两个窗口中只有一个显示旋转的图形。因此,当我启动程序时,主窗口中的图形会旋转,但子窗口中的图形不会旋转,它只是静止不动 当我在子窗口中移动鼠标并按下任意键时,角色会发生变化,因此人物会在子窗口中旋转,并在主窗口中静止不动 如何让它们同时显示。我遵循了灯塔的教程,但它没有给我答案。 我必须对我的视口做些什么吗C++ OpenGL子窗口don';我不能同时回应,c++,opengl,glut,codeblocks,viewport,C++,Opengl,Glut,Codeblocks,Viewport,我有一个问题,我正在使用glut(openGL实用工具工具包)。我正在主窗口中制作一个子窗口。主窗口显示一个简单的地物,子窗口显示另一个视图中的地物。图形会旋转,因此应始终重新显示主窗口和子窗口 但这两个窗口中只有一个显示旋转的图形。因此,当我启动程序时,主窗口中的图形会旋转,但子窗口中的图形不会旋转,它只是静止不动 当我在子窗口中移动鼠标并按下任意键时,角色会发生变化,因此人物会在子窗口中旋转,并在主窗口中静止不动 如何让它们同时显示。我遵循了灯塔的教程,但它没有给我答案。 我必须对我的视口做
* 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;
}
*GLUT形状演示
*
*Nigel Stewart于2003年11月撰写
*
*该程序是球体、圆锥体的测试线束
*以及过剩的圆环形状。
*
*旋转的线框和平滑的阴影形状
*显示,直到按下ESC或q键。这个
*可以调整几何体堆栈和切片的数量
*使用+和-键。
*/
#包括
#苹果__
#包括
#否则
#包括
#恩迪夫
#包括
#包括
静态int切片=16;
静态整数堆栈=16;
int m=0;
int主窗口、子窗口、子窗口2;
/*GLUT回调处理程序*/
静态空心调整大小(整型宽度、整型高度)
{
常量浮点ar=(浮点)宽度/(浮点)高度;
glViewport(0,0,宽度,高度);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(-10,10,-10,10,-10,10);
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
静态无效键(无符号字符键,整数x,整数y)
{
开关(钥匙)
{
案例27:
案例‘q’:
出口(0);
打破
格“+”:
切片++;
堆栈++;
打破
案例'-':
如果(切片>3和堆栈>3)
{
切片--;
堆栈--;
}
打破
}
//再发现();
}
无效密钥(整数密钥,整数xx,整数yy){
设置窗口(主窗口);
再发现();
}
void displaysub()
{const double t=glutGet(GLUT运行时间)/1000.0;
常数双a=t*90.0;
glClear(GL_深度_缓冲_位| GL_颜色_缓冲_位);
glClearColor(20,1,1,1);
glLoadIdentity();
格洛托(-5,5,-5,5,-5,5);
gl3f(0,0,0);
(a,0,0,10);
glPushMatrix();
gl(0,0,0);
固体球(2,10,10);
glPopMatrix();
glutSwapBuffers();
}
无效显示()
{const double t=glutGet(GLUT运行时间)/1000.0;
常数双a=t*90.0;
glClear(GL_深度_缓冲_位| GL_颜色_缓冲_位);
glClearColor(3,0,0,1);
glLoadIdentity();
格洛托(-10,10,-10,10,-10,10);
(a,10,10,0);
displaysub();
}
静态无效空闲(无效)
{
再发现();
}
/*程序入口点*/
void init()
{
glClearColor(3,0,0,1);
glEnable(GLU深度试验);
glEnable(GL_CULL_面);
//注册回调
GLUTIGNOREKEYREPLATE(1);
键盘功能(键);
glutSpecialFunc(keyp);
}
int main(int argc,char*argv[])
{
glutInit(&argc,argv);
glutInitWindowSize(640480);
位置(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_深度);
主窗口=glutCreateWindow(“GLUT形状”);
设置窗口(主窗口);
glClearColor(3,0,0,1);
glutDisplayFunc(显示器);
init();
子窗口=子窗口(主窗口,0,0,50,50);
设置窗口(子窗口);
glClearColor(3,0,0,1);
glutDisplayFunc(displaysub);
init();
glutIdleFunc(空闲);
glutMainLoop();
返回1;
}
上的文档指定只调用当前窗口的display func。在这种情况下,有两个窗口。我不是使用glut的专家,但我建议做两个改变
从display()
函数中删除displaysub()
,然后重写idle()
glutPostRedisplay
只是在主循环中标记要更新的窗口,我猜这是一个有鼠标焦点的窗口。通过独立于当前窗口对每个窗口进行post,所有窗口都将收到各自的显示调用上的文档指定仅调用当前窗口的显示函数。在这种情况下,有两个窗口。我不是使用glut的专家,但我建议做两个改变
从display()
函数中删除displaysub()
,然后重写idle()
glutPostRedisplay
只是在主循环中标记要更新的窗口,我猜这是一个有鼠标焦点的窗口。通过为每个独立于当前窗口的窗口发帖,所有窗口都将收到各自的显示呼叫请向我们显示您的代码。我已使用代码编辑请向我们显示您的代码。我已使用代码编辑谢谢,它可以工作!!!但为什么它会起作用呢?你更新主窗口中的子窗口了吗?谢谢,它可以工作!!!但为什么它会起作用呢?是否更新主窗口中的子窗口?
static void idle()
{
int currentWindow = glutGetWindow();
glutSetWindw(mainWindow);
glutPostRedisplay();
glutSetWindw(subWindow);
glutPostRedisplay();
glutSetWindow(currentWindow);
}