2、事例二: 三角形的几何变换平移(Translate)、旋转(Scale)、缩放(Rotate)

namespace sharpGLTest02
{
    public partial class Form1 : Form
    {
        private int mtype = 3;
        public Form1()
        {
            InitializeComponent();
        }

        //初始化
        private void openGLControl1_OpenGLInitialized(object sender, EventArgs e)
        {

        }
        //调整
        private void openGLControl1_Resize(object sender, EventArgs e)
        {

        }
        //画图
        private void openGLControl1_OpenGLDraw(object sender, PaintEventArgs e)
        {
            SharpGL.OpenGL gl = this.openGLControl1.OpenGL;

            gl.ClearColor(0, 0, 0, 1);
            //清除深度缓存 
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);

            switch (mtype)
            {
                case 0:
                    translateSample(gl);
                    break;
                case 1:
                    rotateSample(gl);
                    break;
                case 2:
                    scaleSample(gl);
                    break;
                case 3:
                    originSample(gl);
                    break;
            }
            gl.Finish();
            gl.Flush(); //强制刷新
        }
        private void originSample(SharpGL.OpenGL gl)
        {
            gl.LoadIdentity();
            gl.Translate(0f, 0f, -1f);
            drawPT(gl);

            //gl.LoadIdentity();
            //gl.Translate(0f, 1f, -1f);
            //drawPT(gl);
        }

        private void scaleSample(SharpGL.OpenGL gl)
        {
            gl.LoadIdentity();
            //缩放
            //gl.Scale(1f, 1f, 1f);
            gl.Scale(1f, 2f, 1f);
            gl.Translate(0, 0, -9f);
            drawPT(gl);

            gl.LoadIdentity();
            gl.Scale(5f, 1f, 1f);
            //gl.Translate(0, 1, -9f);
            gl.Translate(0, 2, -9f);
            drawPT(gl);
        }

        private void rotateSample(SharpGL.OpenGL gl)
        {
            gl.LoadIdentity();
            //旋转
            gl.Rotate(0,0, 45);
            gl.Translate(0, 0, -3f);
            drawPT(gl);

            //gl.Rotate(0, 0, 45);
            //gl.Translate(-1, 1,0f);
            //drawPT(gl);
        }

        private void translateSample(SharpGL.OpenGL gl)
        {
            //重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心
            gl.LoadIdentity();
            //因为gl.LoadIdentity();将变换点移到原点,坐标轴变换位置到(0, 0, -3),注意此时是相对上面(0,0,0)点定位 
            gl.Translate(0f, 0f, -3f);
            drawPT(gl);

            gl.LoadIdentity();
            //gl.Translate(0f, 0.5f, -3f);
            gl.Translate(0f, 1f, -3f);
            //gl.Translate(0f, 1.5f, -3f);
            drawPT(gl);
        }

        private void drawPT(SharpGL.OpenGL gl)
        {
            gl.PointSize(5f);
            gl.Begin(OpenGL.GL_TRIANGLES);
            {
                gl.Vertex(0.0f, 0f, 0.0f);
                gl.Vertex(-1.0f, -1f, 0.0f);
                gl.Vertex(1.0f, -1f, 0.0f);
            }
            gl.End();
        }

        //按钮点击事件
        private void btnTranslate_Click(object sender, EventArgs e)
        {
            switch(((Button)sender).Name)
            {
                case "btnTranslate":
                    mtype = 0;
                    break;
                case "btnRotate":
                    mtype = 1;
                    break;
                case "btnScale":
                    mtype = 2;
                    break;
                case "btnOrigin":
                    mtype = 3;
                    break;
            }
        }
        
    }
}
我驰骋天下,守你盛世繁华
原文地址:https://www.cnblogs.com/lotuses/p/11357920.html