13、事例十三:光源例子:环绕二次曲面球体的光源(二)

namespace sharpGLTest13
{
    public partial class Form1 : Form
    {
        private float rotation = 0.0f;
        float m_bReadX, m_bReadY;
        float m_bGreenX, m_bGreenY;
        float m_bBlueX, m_bBlueY;

        //3个光源位置
        float[] lightPosR = new float[] { 0f, 0f, 2f, 1f };
        float[] lightPosG = new float[] { 0f, 0f, 2f, 1f };
        float[] lightPosB = new float[] { 0f, 0f, 2f, 1f };

        //3个光源漫射光
        float[] diffLightR = { 1f, 0f, 0f, 1f };
        float[] diffLightG = { 0f, 1f, 0f, 1f };
        float[] diffLightB = { 0f, 0f, 1f, 1f };

        //定义3个光源我镜面光
        float[] specLightR = { 1f, 0f, 0f, 1f };
        float[] specLightG = { 0f, 1f, 0f, 1f };
        float[] specLightB = { 0f, 0f, 1f, 1f };

        //默认的光源, 灰色光源,用于默认照明
        float[] defDiffLight = new float[] { 0.8f, 0.8f, 0.8f, 1f };
        float[] defSpecLight = new float[] { 1f, 1f, 1f, 1f };
        float[] defLightPos = new float[] { 0f, 0f, 10f, 1f };

        public Form1()
        {
            InitializeComponent();
        }

        private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
        {
            OpenGL gl = openGLControl.OpenGL;
            setLight(gl);
            //gl.Enable(OpenGL.GL_NORMALIZE);
            gl.ClearColor(0, 0, 0, 0);
        }
        private void setLight(OpenGL gl)
        {
            //0号灯光,默认灯光
            gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_DIFFUSE, defDiffLight);
            gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_SPECULAR, defSpecLight);
            gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, defLightPos);

            //1号灯光
            gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_DIFFUSE, diffLightR);
            gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_SPECULAR, specLightR);
            gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_POSITION, lightPosR);

            //2号灯光
            gl.Light(OpenGL.GL_LIGHT2, OpenGL.GL_DIFFUSE, diffLightG);
            gl.Light(OpenGL.GL_LIGHT2, OpenGL.GL_SPECULAR, specLightG);
            gl.Light(OpenGL.GL_LIGHT2, OpenGL.GL_POSITION, lightPosG);

            //3号灯光
            gl.Light(OpenGL.GL_LIGHT3, OpenGL.GL_DIFFUSE, diffLightB);
            gl.Light(OpenGL.GL_LIGHT3, OpenGL.GL_SPECULAR, specLightB);
            gl.Light(OpenGL.GL_LIGHT3, OpenGL.GL_POSITION, lightPosB);

            gl.Enable(OpenGL.GL_LIGHTING);
            gl.Enable(OpenGL.GL_LIGHT0);  //启用默认光源

        }

        private void openGLControl_Resized(object sender, EventArgs e)
        {
            OpenGL gl = openGLControl.OpenGL;
            gl.MatrixMode(OpenGL.GL_PROJECTION);
            gl.LoadIdentity();
            gl.Perspective(70.0f, (double)Width / (double)Height, 0.01, 100.0);
            gl.LookAt(-5, 5, -5, 0, 0, 0, 0, 1, 0);
            gl.MatrixMode(OpenGL.GL_MODELVIEW);
        }

        private void openGLControl_OpenGLDraw(object sender, PaintEventArgs e)
        {
            OpenGL gl = openGLControl.OpenGL;
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
            gl.LoadIdentity();
            gl.Rotate(rotation, 0.0f, 1.0f, 0.0f);

            draw(gl);
            rotation += 3.0f;

            update(gl);
        }

        void update(OpenGL gl)
        {
            gl.Enable(OpenGL.GL_LIGHT1);
            m_bReadX += 16;
            m_bReadY += 12;
            gl.Enable(OpenGL.GL_LIGHT2);
            m_bGreenX += 10;
            m_bGreenY += 6;
            gl.Enable(OpenGL.GL_LIGHT3);
            m_bBlueX += 2;
            m_bBlueY += 4;
        }

        void draw(OpenGL gl)
        {
            gl.PushMatrix();
            //旋转红光
            gl.Rotate(m_bReadX, 1f, 0f, 0f);
            gl.Rotate(m_bReadY, 0f, 1f, 0f);
            //设置红光的位置
            gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_POSITION, lightPosR);
            //绘制光球
            gl.Translate(lightPosR[0], lightPosR[1], lightPosR[2]);
            gl.Color(1f, 0f, 0f);
            gl.PushAttrib(OpenGL.GL_LIGHTING_BIT);
            gl.Disable(OpenGL.GL_LIGHTING);
            drawSphere(gl, lightPosR[0], lightPosR[1], lightPosR[2], 0.2f, 10, 10, false);
            gl.Enable(OpenGL.GL_LIGHTING);
            gl.PopAttrib();
            gl.PopMatrix();


            gl.PushMatrix();
            //旋转绿光
            gl.Rotate(m_bGreenX, 1f, 0f, 0f);
            gl.Rotate(m_bGreenY, 0f, 1f, 0f);
            //设置绿光的位置
            gl.Light(OpenGL.GL_LIGHT2, OpenGL.GL_POSITION, lightPosG);
            //绘制光球
            gl.Translate(lightPosG[0], lightPosG[1], lightPosG[2]);
            gl.Color(0f, 1f, 0f);
            gl.PushAttrib(OpenGL.GL_LIGHTING_BIT);
            gl.Disable(OpenGL.GL_LIGHTING);
            drawSphere(gl, lightPosG[0], lightPosG[1], lightPosG[2], 0.2f, 10, 10, false);
            gl.Enable(OpenGL.GL_LIGHTING);
            gl.PopAttrib();
            gl.PopMatrix();


            gl.PushMatrix();
            //旋转蓝光
            gl.Rotate(m_bBlueX, 1f, 0f, 0f);
            gl.Rotate(m_bBlueY, 0f, 1f, 0f);
            //设置蓝光的位置
            gl.Light(OpenGL.GL_LIGHT3, OpenGL.GL_POSITION, lightPosB);
            //绘制光球
            gl.Translate(lightPosB[0], lightPosB[1], lightPosB[2]);
            gl.Color(0f, 0f, 1f);
            gl.PushAttrib(OpenGL.GL_LIGHTING_BIT);
            gl.Disable(OpenGL.GL_LIGHTING);
            drawSphere(gl, lightPosB[0], lightPosB[1], lightPosB[2], 0.2f, 10, 10, false);
            gl.Enable(OpenGL.GL_LIGHTING);
            gl.PopAttrib();
            gl.PopMatrix();


            //绘制球体
            gl.PushMatrix();
            gl.Rotate(rotation, 1f, 0f, 0f);
            gl.Rotate(rotation, 0f, 1f, 0f);
            gl.Rotate(rotation, 0f, 0f, 1f);
            drawSphere(gl, 0, 0, 0, 3, 40, 40, false);

            gl.PopMatrix();

            gl.Flush();

        }
        //二次曲面球体
        void drawSphere(OpenGL gl, float x, float y, float z, double radius, int segx, int segy, bool isLines)
        {
            gl.PushMatrix();
            gl.Translate(x, y, z);
            var sphere = gl.NewQuadric();

            /*
             * QuadricDrawStyle(IntPtr quadObject, uint drawStyle);
             * 第一个参数是二次方程对象状态的指针
             * 第二个参数的枚举值:GLU_FILL(二次方程对象画成实体)、GLU_LINE(二次方程对象画成线框)
             *      GLU_POINT(二次方程对象画成一组顶点的集合)、GLU_SILHOUETTE(类似于线框,但相邻的多边形的边不被绘制)
             * */
            if (isLines)
                gl.QuadricDrawStyle(sphere, OpenGL.GL_LINES);
            else
                gl.QuadricDrawStyle(sphere, OpenGL.GL_QUADS);

            /*
             * QuadricNormals(IntPtr quadricObject, uint normals);
             * 这个函数指定二次方程对象如何生成法线。
             * 第二个参数可以是:GLU_NONE不生成法线,GLU_FLAT扁平法线,GLU_SMOOTH平滑法线。
             * 
             * */
            gl.QuadricNormals(sphere, OpenGL.GLU_NONE);   //GLU_NONE,GLU_FLAT,GLU_SMOOTH

            /*
             * QuadricOrientation(IntPtr quadricObject, int orientation);
             * 这个函数可以指定法线的朝向,指向外面还是只想里面。
             * orientation可以是GLU_OUTSIDE或者是GLU_INSIDE这两个值。
             * OpenGL默认是以GL_CCW逆时针为正方向的
             * 
             * */
            gl.QuadricOrientation(sphere, (int)OpenGL.GLU_OUTSIDE);  //GLU_OUTSIDE,GLU_INSIDE

            /*
             * QuadricTexture(IntPtr quadricObject, int textureCoords)
             * 这个函数可以指定二次方程表面的纹理坐标
             * textureCoords这个参数可以是GL_TRUE或者GL_FALSE.
             * 当为球体和圆柱体生成纹理坐标时,纹理是对称地环绕在球体和圆柱体的表面的
             * 如果应用到圆盘上,那么纹理的中心就是圆盘的中心,然后以线性插值的方式扩展到圆盘的边界
             * 
             * */
            gl.QuadricTexture(sphere, (int)OpenGL.GLU_FALSE);  //GL_TRUE,GLU_FALSE
            gl.Sphere(sphere, radius, segx, segy);
            gl.DeleteQuadric(sphere);
            gl.PopMatrix();
        }

        /*
         * 以点画圆
         * 
         * */
        //球心坐标为(x,y,z),球的半径为radius,M,N分别表示球体的横纵向被分成多少份
        void drawSphere1(OpenGL gl, float xx, float yy, float zz, float radius, float M, float N, bool isLines)
        {
            const float PI = 3.1415926f;
            float step_z = (float)Math.PI / M;
            float step_xy = 2 * PI / N;
            float[] x = new float[4] { 0, 0, 0, 0 };
            float[] y = new float[4] { 0, 0, 0, 0 };
            float[] z = new float[4] { 0, 0, 0, 0 };

            float angle_z = 0.0f;
            float angle_xy = 0.0f;
            int i = 0, j = 0;
            gl.Begin(OpenGL.GL_QUADS);
            for (i = 0; i < M; i++)
            {
                angle_z = i * step_z;
                for (j = 0; j < N; j++)
                {
                    angle_xy = j * step_xy;

                    x[0] = (float)(radius * Math.Sin(angle_z) * Math.Cos(angle_xy));
                    y[0] = (float)(radius * Math.Sin(angle_z) * Math.Sin(angle_xy));
                    z[0] = (float)(radius * Math.Cos(angle_z));

                    x[1] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Cos(angle_xy));
                    y[1] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Sin(angle_xy));
                    z[1] = (float)(radius * Math.Cos(angle_z + step_z));

                    x[2] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Cos(angle_xy + step_xy));
                    y[2] = (float)(radius * Math.Sin(angle_z + step_z) * Math.Sin(angle_xy + step_xy));
                    z[2] = (float)(radius * Math.Cos(angle_z + step_z));

                    x[3] = (float)(radius * Math.Sin(angle_z) * Math.Cos(angle_xy + step_xy));
                    y[3] = (float)(radius * Math.Sin(angle_z) * Math.Sin(angle_xy + step_xy));
                    z[3] = (float)(radius * Math.Cos(angle_z));

                    for (int k = 0; k < 4; k++)
                    {
                        gl.Vertex(xx + x[k], yy + y[k], zz + z[k]);
                    }
                }
            }
            gl.End();
        }
    }
}

 

转载于:https://www.cnblogs.com/lotuses/p/11360292.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于YOLOv9实现工业布匹缺陷(破洞、污渍)检测系统python源码+详细运行教程+训练好的模型+评估 【使用教程】 一、环境配置 1、建议下载anaconda和pycharm 在anaconda中配置好环境,然后直接导入到pycharm中,在pycharm中运行项目 anaconda和pycharm安装及环境配置参考网上博客,有很多博主介绍 2、在anacodna中安装requirements.txt中的软件包 命令为:pip install -r requirements.txt 或者改成清华源后再执行以上命令,这样安装要快一些 软件包都安装成功后才算成功 3、安装好软件包后,把anaconda中对应的python导入到pycharm中即可(不难,参考网上博客) 、环境配置好后,开始训练(也可以训练自己数据集) 1、数据集准备 需要准备yolo格式的目标检测数据集,如果不清楚yolo数据集格式,或者有其他数据训练需求,请看博主yolo格式各种数据集集合链接:https://blog.csdn.net/DeepLearning_/article/details/127276492 里面涵盖了上百种yolo数据集,且在不断更新,基本都是实际项目使用。来自于网上收集、实际场景采集制作等,自己使用labelimg标注工具标注的。数据集质量绝对有保证! 本项目所使用的数据集,见csdn该资源下载页面中的介绍栏,里面有对应的下载链接,下载后可直接使用。 2、数据准备好,开始修改配置文件 参考代码中data文件夹下的banana_ripe.yaml,可以自己新建一个不同名称的yaml文件 train:训练集的图片路径 val:验证集的图片路径 names: 0: very-ripe 类别1 1: immature 类别2 2: mid-ripe 类别3 格式按照banana_ripe.yaml照葫芦画瓢就行,不需要过多参考网上的 3、修改train_dual.py中的配置参数,开始训练模型 方式一: 修改点: a.--weights参数,填入'yolov9-s.pt',博主训练的是yolov9-s,根据自己需求可自定义 b.--cfg参数,填入 models/detect/yolov9-c.yaml c.--data参数,填入data/banana_ripe.yaml,可自定义自己的yaml路径 d.--hyp参数,填入hyp.scratch-high.yaml e.--epochs参数,填入100或者200都行,根据自己的数据集可改 f.--batch-size参数,根据自己的电脑性能(显存大小)自定义修改 g.--device参数,一张显卡的话,就填0。没显卡,使用cpu训练,就填cpu h.--close-mosaic参数,填入15 以上修改好,直接pycharm中运行train_dual.py开始训练 方式: 命令行方式,在pycharm中的终端窗口输入如下命令,可根据自己情况修改参数 官方示例:python train_dual.py --workers 8 --device 0 --batch 16 --data data/coco.yaml --img 640 --cfg models/detect/yolov9-c.yaml --weights '' --name yolov9-c --hyp hyp.scratch-high.yaml --min-items 0 --epochs 500 --close-mosaic 15 训练完会在runs/train文件下生成对应的训练文件及模型,后续测试可以拿来用。 三、测试 1、训练完,测试 修改detect_dual.py中的参数 --weights,改成上面训练得到的best.pt对应的路径 --source,需要测试的数据图片存放的位置,代码中的test_imgs --conf-thres,置信度阈值,自定义修改 --iou-thres,iou阈值,自定义修改 其他默认即可 pycharm中运行detect_dual.py 在runs/detect文件夹下存放检测结果图片或者视频 【特别说明】 *项目内容完全原创,请勿对项目进行外传,或者进行违法等商业行为! 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值