C++OpenGL三维显示镜面反射光线漫反射实例

程序示例精选
C++OpenGL三维显示镜面反射光线漫反射实例
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!

前言

这篇博客针对《C++OpenGL三维显示镜面反射光线漫反射实例》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。


运行结果


文章目录

一、所需工具软件
二、使用步骤
       1. 主要代码
       2. 运行结果
三、在线协助

一、所需工具软件

       1. Python
       2. Pycharm

二、使用步骤

代码如下(示例):
void init() {


    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutCreateWindow("ObjLoader");
    glEnable(GL_DEPTH_TEST);
    //glDisable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH); 
    setLightRes();
    glEnable(GL_DEPTH_TEST);
    // objModel.Init();

    glDepthFunc(GL_LEQUAL); // 设置深度测试函数
}

void display() {
    glColor3f(1.0, 1.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // 应用平移和缩放
    glTranslatef(transX, transY, -270.0f); // 应用水平和垂直平移141.0f
    glScalef(zoomFactor, zoomFactor, zoomFactor); // 应用缩放

    setLightRes();
    glPushMatrix();

    // 更新gluLookAt以使用vertDegree进行垂直旋转
    float vertRad = c * vertDegree; // 将vertDegree转换为弧度
    gluLookAt(r * cos(c * degree) * cos(vertRad), r * sin(vertRad), r * sin(c * degree) * cos(vertRad),
        0.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f);

    // 根据计算出的中心坐标平移模型
    glTranslatef(-objModel.center[0], -objModel.center[1], -objModel.center[2]);
    objModel.Draw();
    glPopMatrix();
    glutSwapBuffers();
}


void reshape(int width, int height) {
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0f, (GLdouble)width / (GLdouble)height, 1.0f, 200.0f);
    glMatrixMode(GL_MODELVIEW);
}

// 在全局范围内定义一个变量来追踪当前鼠标操作
enum MouseAction { NONE, ROTATE, TRANSLATE };
MouseAction currentAction = NONE;

void mouseButton(int button, int state, int x, int y) {
    if (state == GLUT_DOWN) {
        if (button == GLUT_LEFT_BUTTON) {
            currentAction = ROTATE;
            oldPosX = x;
            oldPosY = y;
        }
        else if (button == GLUT_RIGHT_BUTTON) {
            currentAction = TRANSLATE;
            oldRightPosX = x;
            oldRightPosY = y;
        }
    }
    else if (state == GLUT_UP) {
        currentAction = NONE;
    }
}

void mouseMove(int x, int y) {
    if (currentAction == ROTATE) {
        int deltaX = x - oldPosX;
        int deltaY = y - oldPosY;
        degree += deltaX;
        vertDegree += deltaY;
        oldPosX = x;
        oldPosY = y;
    }
    else if (currentAction == TRANSLATE) {
        transX += (x - oldRightPosX) * 0.01f;
        transY -= (y - oldRightPosY) * 0.01f;
        oldRightPosX = x;
        oldRightPosY = y;
    }
    glutPostRedisplay();
}

//滚轮没反应
void mouseWheel(int wheel, int direction, int x, int y) //
{
    cout << "test " << endl;
    cout << "Mouse wheel event detected. Direction: " << direction << endl;
    if (direction > 0) {
        zoomFactor += 0.1f; // 增加缩放因子
    }
    else {
        zoomFactor -= 0.1f; // 减小缩放因子
    }

    // 防止缩放因子小于等于0
    if (zoomFactor <= 0.1f) {
        zoomFactor = 0.1f;
    }

    glutPostRedisplay();
}


void processNormalKeys(unsigned char key, int x, int y) {
    switch (key) {
    case 'w': // Pressing "w" key, zoom in
        cout << "Zoom factor increased by 0.1\n"; 
        zoomFactor += 0.1f;
        break;
    case 's': // Pressing "s" key, zoom out
        zoomFactor -= 0.1f;
        if (zoomFactor <= 0.1f) {
            zoomFactor = 0.1f; // Prevent zoomFactor from going below 0.1
        }
        break;
    case 27: // Pressing the Esc key (ASCII value 27) to exit the program
        exit(0);
        break;
        // Add more cases for handling other keys as needed
    }
    glutPostRedisplay();
}


void specialKeys(int key, int x, int y) {
    switch (key) {
    case GLUT_KEY_UP:
        // 按下上方向键,进行相应操作
        break;
    case GLUT_KEY_DOWN:
        // 按下下方向键,进行相应操作
        break;
    }
    glutPostRedisplay();
}


void myIdle() {
    glutPostRedisplay();
}


int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMouseFunc(mouseButton);
    glutMotionFunc(mouseMove);
    glutMouseWheelFunc(mouseWheel);
    glutKeyboardFunc(processNormalKeys);     // 处理一般的键盘事件
    glutSpecialFunc(specialKeys);  // 处理特殊键盘事件


    glutIdleFunc(myIdle);

    // 在此处调用 CalculateCenter() 函数
    objModel.CalculateCenter();
    // 打印模型的中心坐标
    objModel.PrintCenter();

    // 计算并打印模型长宽高
    objModel.CalculateBoundingBox();
    objModel.PrintBoundingBox();

	glutMainLoop();
	return 0;
}


运行结果

三、在线协助:

如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!

1)远程安装运行环境,代码调试
2)Visual Studio, Qt, C++, Python编程语言入门指导
3)界面美化
4)软件制作
5)云服务器申请
6)网站制作

当前文章连接:https://blog.csdn.net/alicema1111/article/details/132666851
个人博客主页https://blog.csdn.net/alicema1111?type=blog
博主所有文章点这里:https://blog.csdn.net/alicema1111?type=blog

博主推荐:
Python人脸识别考勤打卡系统:
https://blog.csdn.net/alicema1111/article/details/133434445
Python果树水果识别https://blog.csdn.net/alicema1111/article/details/130862842
Python+Yolov8+Deepsort入口人流量统计:https://blog.csdn.net/alicema1111/article/details/130454430
Python+Qt人脸识别门禁管理系统:https://blog.csdn.net/alicema1111/article/details/130353433
Python+Qt指纹录入识别考勤系统:https://blog.csdn.net/alicema1111/article/details/129338432
Python Yolov5火焰烟雾识别源码分享:https://blog.csdn.net/alicema1111/article/details/128420453
Python+Yolov8路面桥梁墙体裂缝识别:https://blog.csdn.net/alicema1111/article/details/133434445
Python+Yolov5道路障碍物识别:https://blog.csdn.net/alicema1111/article/details/129589741
Python+Yolov5跌倒检测 摔倒检测 人物目标行为 人体特征识别:https://blog.csdn.net/alicema1111/article/details/129272048

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荷塘月色2

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值