Opengl鼠标旋转问题

Opengl mouse rotation issue

当我点击鼠标时,我的图形可以旋转,但是当我用鼠标将图形转回初始位置时,我不知道为什么这是我的事件

这是关于我的问题的插图

我觉得跟在图片框上移动完全不一样

Mouse_up 事件

 private void simpleOpenGlControl1_MouseUp(object sender, MouseEventArgs e)
        {
            Dragging2 = false;
        } 

 private void simpleOpenGlControl1_MouseMove(object sender, MouseEventArgs e)
        {
            xrot -= 0.5;
            simpleOpenGlControl1.Refresh();

        } 

Mouse_down 事件

        {
            
            if (e.Button == MouseButtons.Left)
            {
                    Dragging2 = true;
            }
           
        } 
            double olcek3d_gen1 = obj.genislikDeger1 / pictureBox1.Width;
            double olcek3d_gen2 = obj.genislikDeger2 / pictureBox1.Width;
            double olcek3d_gen3 = obj.genislikDeger3 / pictureBox1.Width;
            double olcek3d_gen4 = obj.genislikDeger4 / pictureBox1.Width;

            double olcek3d_yuk1 = obj.yukselikDeger1 / pictureBox1.Width;
            double olcek3d_yuk2 = obj.yukselikDeger2 / pictureBox1.Width;
            double olcek3d_yuk3 = obj.yukselikDeger3 / pictureBox1.Width;
            double olcek3d_yuk4 = obj.yukselikDeger4 / pictureBox1.Width;

            double olcek_derinlik = obj.L / pictureBox1.Width;





            //Gl.glColorMask(1,1,1,1);




            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT | Gl.GL_ACCUM_BUFFER_BIT);

            Gl.glEnable(Gl.GL_DEPTH_TEST); //clear buffers to preset values
            Gl.glClearColor(0, 0, 0, 0);

           /* Gl.glEnable(Gl.GL_COLOR_MATERIAL);

            Gl.glEnable(Gl.GL_LIGHTING);

            Gl.glEnable(Gl.GL_LIGHT0);*/




            Gl.glBlendFunc(Gl.GL_ONE, Gl.GL_ONE_MINUS_SRC_ALPHA);

            Gl.glMatrixMode(Gl.GL_MODELVIEW);

            Gl.glLoadIdentity();                 // load the identity matrix
                                                 // load the identity 
            Gl.glTranslated(left_right, up_down, sabit3D);



            //Gl.glEnable(Gl.GL_TEXTURE_2D);
            if (Dragging2)
            {
                Gl.glRotated(xrot, xRotate, yRotate, zRotate);
                listBox1.Items.Add("angle  " + xrot.ToString() +"  xrot  "+ xRotate+"  yrot  "+ yRotate+"  zrot  "+zRotate+"  left_right  "+left_right+"  up_Down  "+ up_down);
            }
           







            //rotate on y
            //Gl.glRotated(zrot += 0.5, 0, 0, 1); //rotate on z



            //face 1.0

            //face 2.0 görünen açıdan sağdaki
            Gl.glBegin(Gl.GL_QUADS);
            Gl.glColor3ub(90, 90, 90);
            Gl.glVertex3d(olcek3d_gen1, 0, 0);
            Gl.glVertex3d(olcek3d_gen1, 0, olcek_derinlik);
            Gl.glVertex3d(olcek3d_gen1, olcek3d_yuk1, olcek_derinlik);
            Gl.glVertex3d(olcek3d_gen1, olcek3d_yuk1, 0);
            Gl.glEnd();

            //face 3.0 ön yüzey
            Gl.glBegin(Gl.GL_QUADS);
            Gl.glColor3ub(100, 100, 100);
            Gl.glVertex3d(0, 0, olcek_derinlik);
            Gl.glVertex3d(olcek3d_gen1, 0, olcek_derinlik);
            Gl.glVertex3d(olcek3d_gen1, olcek3d_yuk1, olcek_derinlik);
            Gl.glVertex3d(0, olcek3d_yuk1, olcek_derinlik);
            Gl.glEnd();

            //face 4.0 arka yüzey

            Gl.glBegin(Gl.GL_QUADS);
            Gl.glColor3ub(110, 110, 110);
            Gl.glVertex3d(0, 0, 0);
            Gl.glVertex3d(0, 0, olcek_derinlik);
            Gl.glVertex3d(0, olcek3d_yuk1, olcek_derinlik);
            Gl.glVertex3d(0, olcek3d_yuk1, 0);
            Gl.glEnd();

            //face 5.0 üst yüzey



            Gl.glBegin(Gl.GL_QUADS);
            Gl.glColor3ub(100, 100, 100);
            Gl.glVertex3d(0, olcek3d_yuk1, 0);
            Gl.glVertex3d(olcek3d_gen1, olcek3d_yuk1, 0);
            Gl.glVertex3d(olcek3d_gen1, olcek3d_yuk1, olcek_derinlik);
            Gl.glVertex3d(0, olcek3d_yuk1, olcek_derinlik);
            Gl.glEnd();


            //face 6.0 // sorun olan bölge başlangıc en zıt arkası
            Gl.glBegin(Gl.GL_QUADS);
            Gl.glColor3ub(100, 100, 100);
            Gl.glVertex3d(0, 0, 0);
            Gl.glVertex3d(olcek3d_gen1, 0, 0);
            Gl.glVertex3d(olcek3d_gen1, olcek3d_yuk1, 0);
            Gl.glVertex3d(0, olcek3d_yuk1, 0);
            Gl.glEnd();

            //face 1.1

            Gl.glBegin(Gl.GL_QUADS);    //start drawing GL_QUADSis the connection mode
            Gl.glColor3ub(90, 90, 90);

            Gl.glVertex3d(0, -1 * olcek3d_yuk2, 0);
            Gl.glVertex3d(olcek3d_gen2, -1 * olcek3d_yuk2, 0);
            Gl.glVertex3d(olcek3d_gen2, 0, 0);
            Gl.glVertex3d(0, 0, 0);
            Gl.glEnd();

            //face 2.1
            Gl.glBegin(Gl.GL_QUADS);
            Gl.glColor3ub(70, 70, 70);
            Gl.glVertex3d(olcek3d_gen2, -1 * olcek3d_yuk2, 0);
            Gl.glVertex3d(olcek3d_gen2, -1 * olcek3d_yuk2, olcek_derinlik);
            Gl.glVertex3d(olcek3d_gen2, 0, olcek_derinlik);
            Gl.glVertex3d(olcek3d_gen2, 0, 0);
            Gl.glEnd();

            //face 3.1
            Gl.glBegin(Gl.GL_QUADS);
            Gl.glColor3ub(80, 80, 80);
            Gl.glVertex3d(0, -1 * olcek3d_yuk2, olcek_derinlik);
            Gl.glVertex3d(olcek3d_gen2, -1 * olcek3d_yuk2, olcek_derinlik);
            Gl.glVertex3d(olcek3d_gen2, 0, olcek_derinlik);
            Gl.glVertex3d(0, 0, olcek_derinlik);
            Gl.glEnd();

            //face 4.1
            Gl.glBegin(Gl.GL_QUADS);
            Gl.glColor3ub(90, 90, 90);
            Gl.glVertex3d(0, -1 * olcek3d_yuk2, 0);
            Gl.glVertex3d(0, -1 * olcek3d_yuk2, olcek_derinlik);
            Gl.glVertex3d(0, 0, olcek_derinlik);
            Gl.glVertex3d(0, 0, 0);
            Gl.glEnd();

            //face cover.1 çizgi level
            Gl.glBegin(Gl.GL_QUADS);
            Gl.glColor3ub(80, 80, 80);
            Gl.glVertex3d(olcek3d_gen1, 0, 0);
            Gl.glVertex3d(olcek3d_gen2, 0, 0);
            Gl.glVertex3d(olcek3d_gen2, 0, olcek_derinlik);
            Gl.glVertex3d(olcek3d_gen1, 0, olcek_derinlik);
            Gl.glEnd();


            if (sev.Value == 2)
            {
                //face 5.1
                Gl.glBegin(Gl.GL_QUADS);
                Gl.glColor3ub(85, 85, 85);
                Gl.glVertex3d(0, -1 * olcek3d_yuk2, 0);
                Gl.glVertex3d(olcek3d_gen2, -1 * olcek3d_yuk2, 0);
                Gl.glVertex3d(olcek3d_gen2, -1 * olcek3d_yuk2, olcek_derinlik);
                Gl.glVertex3d(0, -1 * olcek3d_yuk2, olcek_derinlik);
                Gl.glEnd();
            }


            if (sev.Value >= 3)
            {
                //face 1.2

                Gl.glBegin(Gl.GL_QUADS);    //start drawing GL_QUADSis the connection mode
                Gl.glColor3ub(85, 85, 85);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3), 0);
                Gl.glVertex3d(olcek3d_gen3, -1 * (olcek3d_yuk2 + olcek3d_yuk3), 0);
                Gl.glVertex3d(olcek3d_gen3, -1 * olcek3d_yuk2, 0);
                Gl.glVertex3d(0, -1 * olcek3d_yuk2, 0);
                Gl.glEnd();

                //face 2.2
                Gl.glBegin(Gl.GL_QUADS);
                Gl.glColor3ub(70, 70, 70);
                Gl.glVertex3d(olcek3d_gen3, -1 * (olcek3d_yuk2 + olcek3d_yuk3), 0);
                Gl.glVertex3d(olcek3d_gen3, -1 * (olcek3d_yuk2 + olcek3d_yuk3), olcek_derinlik);
                Gl.glVertex3d(olcek3d_gen3, -1 * olcek3d_yuk2, olcek_derinlik);
                Gl.glVertex3d(olcek3d_gen3, -1 * olcek3d_yuk2, 0);
                Gl.glEnd();

                //face 3.2
                Gl.glBegin(Gl.GL_QUADS);
                Gl.glColor3ub(90, 90, 90);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3), olcek_derinlik);
                Gl.glVertex3d(olcek3d_gen3, -1 * (olcek3d_yuk2 + olcek3d_yuk3), olcek_derinlik);
                Gl.glVertex3d(olcek3d_gen3, -1 * olcek3d_yuk2, olcek_derinlik);
                Gl.glVertex3d(0, -1 * olcek3d_yuk2, olcek_derinlik);
                Gl.glEnd();

                //face 4.2
                Gl.glBegin(Gl.GL_QUADS);
                Gl.glColor3ub(85, 85, 85);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3), 0);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3), olcek_derinlik);
                Gl.glVertex3d(0, -1 * olcek3d_yuk2, olcek_derinlik);
                Gl.glVertex3d(0, -1 * olcek3d_yuk2, 0);
                Gl.glEnd();

                //face kapak.2
                Gl.glBegin(Gl.GL_QUADS);
                Gl.glColor3ub(80, 80, 80);

                Gl.glVertex3d(olcek3d_gen2, -1 * (olcek3d_yuk1), 0);
                Gl.glVertex3d(olcek3d_gen3, -1 * (olcek3d_yuk1), 0);
                Gl.glVertex3d(olcek3d_gen3, -1 * (olcek3d_yuk1), olcek_derinlik);
                Gl.glVertex3d(olcek3d_gen2, -1 * (olcek3d_yuk1), olcek_derinlik);
                Gl.glEnd();



                if (sev.Value == 3)
                {
                    //face 5.2
                    Gl.glBegin(Gl.GL_QUADS);
                    Gl.glColor3ub(85, 85, 85);
                    Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3), 0);
                    Gl.glVertex3d(olcek3d_gen3, -1 * (olcek3d_yuk2 + olcek3d_yuk3), 0);
                    Gl.glVertex3d(olcek3d_gen3, -1 * (olcek3d_yuk2 + olcek3d_yuk3), olcek_derinlik);
                    Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3), olcek_derinlik);
                    Gl.glEnd();

                }


            }
            if (sev.Value == 4)
            {
                //face 1.3

                Gl.glBegin(Gl.GL_QUADS);    //start drawing GL_QUADSis the connection mode
                Gl.glColor3ub(85, 85, 85);

                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), 0);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), 0);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk2 + olcek3d_yuk3), 0);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3), 0);
                Gl.glEnd();

                //face 2.3
                Gl.glBegin(Gl.GL_QUADS);
                Gl.glColor3ub(70, 70, 70);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), 0);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), olcek_derinlik);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk2 + olcek3d_yuk3), olcek_derinlik);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk2 + olcek3d_yuk3), 0);
                Gl.glEnd();

                //face 3.3
                Gl.glBegin(Gl.GL_QUADS);
                Gl.glColor3ub(90, 90, 90);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), olcek_derinlik);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), olcek_derinlik);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk2 + olcek3d_yuk3), olcek_derinlik);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3), olcek_derinlik);
                Gl.glEnd();

                //face 4.3
                Gl.glBegin(Gl.GL_QUADS);
                Gl.glColor3ub(85, 85, 85);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), 0);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), olcek_derinlik);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3), olcek_derinlik);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3), 0);
                Gl.glEnd();
                //face 5.3
                Gl.glBegin(Gl.GL_QUADS);
                Gl.glColor3ub(85, 85, 85);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), 0);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), 0);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), olcek_derinlik);
                Gl.glVertex3d(0, -1 * (olcek3d_yuk2 + olcek3d_yuk3 + olcek3d_yuk4), olcek_derinlik);
                Gl.glEnd();

                //face kapak.2
                Gl.glBegin(Gl.GL_QUADS);
                Gl.glColor3ub(80, 80, 80);

                Gl.glVertex3d(olcek3d_gen3, -1 * (olcek3d_yuk1 + olcek3d_yuk2), 0);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk1 + olcek3d_yuk2), 0);
                Gl.glVertex3d(olcek3d_gen4, -1 * (olcek3d_yuk1 + olcek3d_yuk2), olcek_derinlik);
                Gl.glVertex3d(olcek3d_gen3, -1 * (olcek3d_yuk1 + olcek3d_yuk2), olcek_derinlik);
                Gl.glEnd();
            }

因为您仅在 Dragging2 处于活动状态时才应用 xrot 旋转...您应该在每一帧执行此操作,或者在鼠标向上时将最终旋转应用于用于初始化的某些初始矩阵框架开始时的模型视图而不是标识

所以最简单的就是改:

if (Dragging2)
    {
    Gl.glRotated(xrot, xRotate, yRotate, zRotate);
    listBox1.Items.Add("angle  " + xrot.ToString() +"  xrot  "+ xRotate+"  yrot  "+ yRotate+"  zrot  "+zRotate+"  left_right  "+left_right+"  up_Down  "+ up_down);
    }

进入:

Gl.glRotated(xrot, xRotate, yRotate, zRotate);
if (Dragging2)
    {
    listBox1.Items.Add("angle  " + xrot.ToString() +"  xrot  "+ xRotate+"  yrot  "+ yRotate+"  zrot  "+zRotate+"  left_right  "+left_right+"  up_Down  "+ up_down);
    }

不确定列表框的用途(或者它是否没有内存泄漏...)。但是,如果您的 xRotate, yRotate, zRotate 发生变化,那么您需要实施初始累积矩阵 ...