hackferances 2023-10-05 14:00 采纳率: 54.5%
浏览 2
已结题

OpenGL立方体观察测试

这是一段OpenGL代码, 目的是通过移动鼠标来旋转视角观察中间的橙色立方体
在旋转视角部分,当我加入第44行代码,也就是也能在y之旋转,旋转的时候会看起来有些吃力和奇怪。
把那一行删了就没问题了,但是不能看立方体的上方和下方了。
代码运行的时候,鼠标会一直停在中间,按ESC退出程序。


#define GLUT_DISABLE_ATEXIT_HACK
#define _USE_MATH_DEFINES
#define v(x) x/256.0
#include <iostream>
#include <cmath>
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

void display();
void reshape(int,int);
void timer(int);
void move(int,int);
void init();

int main(int argc,char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowPosition(0,0);
    glutInitWindowSize(1536,864);
    glutCreateWindow("title");
    glutFullScreen(); 
    
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutTimerFunc(0,timer,0);
    glutPassiveMotionFunc(move);
    init();
    
    glutMainLoop();//in loop
    return 0;
}

float mx,my;
float dis=-8.0;

void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//clear
    glLoadIdentity();
    glTranslatef(0,-1.0,dis);
    glRotatef(mx,0.0,1.0,0.0);
    glRotatef(my,0.5,0.0,0.5);//这段代码运行后转起来有点奇怪 
    
    //画立方体 
    glBegin(GL_QUADS);
    glColor3f(1.0,0.5,0.0);
    glVertex3f(-1.0,1.0,1.0);
    glVertex3f(-1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,1.0);
    glVertex3f(1.0,1.0,1.0);
    glVertex3f(1.0,1.0,-1.0);
    glVertex3f(1.0,-1.0,-1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    glVertex3f(-1.0,1.0,-1.0);
    glVertex3f(1.0,1.0,1.0);
    glVertex3f(1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,-1.0);
    glVertex3f(1.0,1.0,-1.0);
    glVertex3f(-1.0,1.0,-1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    glVertex3f(-1.0,-1.0,1.0);
    glVertex3f(-1.0,1.0,1.0);
    glVertex3f(-1.0,1.0,-1.0);
    glVertex3f(-1.0,1.0,1.0);
    glVertex3f(1.0,1.0,1.0);
    glVertex3f(1.0,1.0,-1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    glVertex3f(-1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,-1.0);
    glEnd();
    
    //画线 
    glLineWidth(3);
    glBegin(GL_LINES);
    glColor3f(0.0,0.0,0.0);
    glVertex3f(-1.0,1.0,1.0);
    glVertex3f(1.0,1.0,1.0);
    glVertex3f(1.0,1.0,1.0);
    glVertex3f(1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,1.0);
    glVertex3f(-1.0,-1.0,1.0);
    glVertex3f(-1.0,-1.0,1.0);
    glVertex3f(-1.0,1.0,1.0);
    glVertex3f(-1.0,1.0,-1.0);
    glVertex3f(1.0,1.0,-1.0);
    glVertex3f(1.0,1.0,-1.0);
    glVertex3f(1.0,-1.0,-1.0);
    glVertex3f(1.0,-1.0,-1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    glVertex3f(-1.0,1.0,-1.0);
    glVertex3f(-1.0,1.0,1.0);
    glVertex3f(-1.0,1.0,-1.0);
    glVertex3f(1.0,1.0,1.0);
    glVertex3f(1.0,1.0,-1.0);
    glVertex3f(1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,-1.0);
    glVertex3f(-1.0,-1.0,1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    glEnd();
    
    glutSwapBuffers();
}

void reshape(int w,int h){
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(80,16.0/9.0,2.0,50.0);
    glMatrixMode(GL_MODELVIEW);
}

void timer(int){
    glutPostRedisplay();
    glutTimerFunc(1000.0/60.0,timer,0);
    //检测输入用WINDOWS库 
    if (GetKeyState(0x57)&0x8000){
        if (dis<-5.0) dis+=0.1;
    }else if (GetKeyState(0x53)&0x8000){
        if (dis>-20.0) dis-=0.1;
    }
    if (GetKeyState(0x1B)&0x8000){//按ESC退出 
        exit(0);
    }
}

void move(int x,int y){
    mx+=(x-glutGet(GLUT_SCREEN_WIDTH)/2)*0.1;
    my+=(y-glutGet(GLUT_SCREEN_HEIGHT)/2)*0.1;
    glutWarpPointer(glutGet(GLUT_SCREEN_WIDTH)/2,glutGet(GLUT_SCREEN_HEIGHT)/2);
}

void init(){
    glClearColor(v(135),v(206),v(250),1.0);
    glEnable(GL_DEPTH_TEST);
}
  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-05 23:32
    关注

    引自强大而免费的微信小程序:皆我百晓生。


    这段OpenGL代码实现了一个立方体的观察和视角旋转功能。通过移动鼠标来旋转视角观察立方体。当加入第44行的代码时,会在y轴上旋转,但旋转时会出现一些奇怪的现象。当删除该行代码时,可以正常观察立方体,但无法看到立方体的上方和下方。代码运行时,鼠标会一直停在屏幕中间,按ESC键退出程序。

    这段代码使用了OpenGL库和Windows库来实现功能。在显示函数display()中,首先清除颜色缓冲区和深度缓冲区,然后进行绘制操作。先进行平移和旋转变换,然后绘制立方体的各个面和边线。最后交换缓冲区来显示绘制结果。

    在reshape()函数中,设置视口和透视投影矩阵。

    在timer()函数中,通过GetKeyState()函数检测按键状态,根据按键状态来改变视角的距离视点的距离。按下W键距离视点更近,按下S键距离视点更远。同时,处理ESC键按下的情况,按下ESC键时退出程序。

    在move()函数中,根据鼠标移动的位置来改变视角旋转的角度。通过glutWarpPointer()函数将鼠标重置到屏幕中心,来实现无限旋转。

    在init()函数中,设置清除颜色为橙色,并启用深度测试。

    该代码需要在支持OpenGL的环境中运行,同时需要安装OpenGL和GLUT库。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月13日
  • 创建了问题 10月5日

悬赏问题

  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境