SharpGL仿真机器人和太阳系运动

11 篇文章 2 订阅

1、SharpGL库文件

 下载链接1:SharpGL程序库文件.rar-C#文档类资源-CSDN下载

2、用法visua studio winform界面工具中,鼠标右击添加选项卡取名SharpGL4,在选项卡SharpGL4中鼠标右击选择项

 工程属性设置为.NET4

 将OpenGLControl控件拖到winform界面上。

添加引用

 

2、添加openGLControl1控件事件函数openGLControl1_OpenGLInitialized、openGLControl1_Resized、openGLControl1_OpenGLDraw

openGLControl1_OpenGLInitialized:

private void openGLControl1_OpenGLInitialized(object sender, EventArgs e)
       {
            OpenGL gl = openGLControl1.OpenGL;

            gl.ClearColor(0, 0, 0, 0);

            length[0] = 10.0f;              //机器人关节1长度
            length[1] = 10.0f;
            length[2] = 8.0f;
            length[3] = 2.0f;
        }

openGLControl1_Resized:

private void openGLControl1_Resized(object sender, EventArgs e)
        {
            OpenGL gl = openGLControl1.OpenGL;
            //  设置当前矩阵模式,对投影矩阵应用随后的矩阵操作
            gl.MatrixMode(OpenGL.GL_PROJECTION);
            // 重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心
            gl.LoadIdentity();
            // 创建透视投影变换
            gl.Perspective(60.0f, (double)Width / (double)Height, 0.01, 100.0);             //修改60.0f,更改显示物体大小
            // 视点变换
            //gl.LookAt(-5, 5, -5, 0, 0, 0, 0, 1, 0);   //VS2010及其之前版本使用该参数
            //gl.LookAt(-5, 5, 15, 0, 0, 0, 0, 1, 0);   //VS2012以后版本,使用该参数

            gl.LookAt(-5, 10, 45, 0, 0, 0, 0, 1, 0);   //VS2012以后版本,使用该参数
            // 设置当前矩阵为模型视图矩阵
            gl.MatrixMode(OpenGL.GL_MODELVIEW);
        }

openGLControl1_OpenGLDraw :

        private void openGLControl1_OpenGLDraw(object sender, PaintEventArgs e)
        {
            OpenGL gl = openGLControl1.OpenGL;
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);   //清除深度缓存       
            gl.LoadIdentity();                                                   // 重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心




            DrawRobotClass myDraw = new DrawRobotClass();      //使用SharpGL库做的3D物体——t太阳系和4轴机械臂

            //myDraw.DrawSunSys(ref gl, angle);               //测试-太阳系统
            myDraw.DrawRobot1(ref gl, theta, length);         //测试-4关节机械臂
        }

SharpGL绘制基本的立方体:

        /// <summary>
        /// 绘制立方体
        /// </summary>
        /// <param name="gl">OpenGL对象</param>
        /// <param name="xPos">立方体X轴位置</param>
        /// <param name="yPos">立方体Y轴位置</param>
        /// <param name="zPos">立方体Z轴位置</param>
        /// <param name="isLine">是否线段显示</param>
        private void DrawCube(ref OpenGL gl, float xPos, float yPos, float zPos, bool isLine)
        {
            gl.PushMatrix();    //矩阵依次压入堆栈中
            gl.Translate(xPos, yPos, zPos);     //
            if (isLine)
            {
                gl.Begin(OpenGL.GL_LINE_STRIP);
            }
            else
            {
                gl.Begin(OpenGL.GL_POLYGON);    //GL_POLYGON:多边形
            }
            //一个立方体6个面。每个面四个点。一个立方体8个点

            //顶面:
            gl.Vertex(0.0f, 0.0f, 0.0f);    //顶点坐标
            gl.Vertex(0.0f, 0.0f, -1.0f);
            gl.Vertex(-1.0f, 0.0f, -1.0f);
            gl.Vertex(-1.0f, 0.0f, 0.0f);

            //底面
            gl.Vertex(0.0f, -1.0f, 0.0f);
            gl.Vertex(0.0f, -1.0f, -1.0f);
            gl.Vertex(-1.0f, -1.0f, -1.0f);
            gl.Vertex(-1.0f, -1.0f, 0.0f);

            //前面
            gl.Vertex(0.0f, 0.0f, 0.0f);
            gl.Vertex(-1.0f, 0.0f, 0.0f);
            gl.Vertex(-1.0f, -1.0f, 0.0f);
            gl.Vertex(0.0f, -1.0f, 0.0f);

            //后面
            gl.Vertex(0.0f, 0.0f, -1.0f);
            gl.Vertex(0.0f, -1.0f, -1.0f);
            gl.Vertex(-1.0f, -1.0f, -1.0f);
            gl.Vertex(-1.0f, 0.0f, -1.0f);

            //左面
            gl.Vertex(-1.0f, 0.0f, 0.0f);
            gl.Vertex(-1.0f, -1.0f, -1.0f);
            gl.Vertex(-1.0f, 0.0f, -1.0f);
            gl.Vertex(-1.0f, 0.0f, 0.0f);

            //右面
            gl.Vertex(0.0f, 0.0f, 0.0f);
            gl.Vertex(0.0f, -1.0f, 0.0f);
            gl.Vertex(0.0f, -1.0f, -1.0f);
            gl.Vertex(0.0f, 0.0f, -1.0f);

            gl.End();
            gl.PopMatrix();     //弹出堆栈顶部的矩阵
        }

2、测试太阳系

构造 太阳系中的太阳、地球、月亮三个天体。太阳为自转、地球绕太阳公转并且自转、月亮绕地球转并且自转。

angle[0]、angle[1]、angle[2]分别对应太阳、地球、月亮的自己转动角度。(补充:月亮绕地球转一圈27.3天、月亮自转一圈也是27.3天,所以地球上的人见不到月亮背面)

        /// <summary>
        /// 模拟太阳、地球、月亮运动
        /// </summary>
        /// <param name="gl"></param>
        /// <param name="angle"></param>
        public void DrawSunSys(ref OpenGL gl,float[] angle)
        {
            //CuePos[] cubePos

            //画太阳
            gl.PushMatrix();
            {
                gl.Color(1.0f, 0.0f, 0.0f);
                gl.Translate(0.0f, 0.0f, 0.0f);
                gl.Scale(4.0f, 4.0f, 4.0f);
                gl.Rotate(angle[0], 0.0f, 1.0f, 0.0f);
                DrawCube(ref gl, 0.0f, 0.0f, 0.0f, false);
            }
            gl.PopMatrix();

            //画地球
            gl.PushMatrix();
            {
                gl.Color(0.0f, 0.0f, 1.0f);
                gl.Rotate(angle[1], 0.0f, 1.0f, 0.0f);  //地球公转,绕太阳旋转。Y轴
                gl.Translate(0.0f, 0.0f, -20.0f);      //地球-太阳距离
                gl.Rotate(angle[0], 0.0f, 1.0f, 0.0f);      //地球自转  Y轴旋转
                gl.Scale(3.0f, 3.0f, 3.0f); //地球尺寸
                DrawCube(ref gl, 0.0f, 0.0f, 0.0f, true);
            }
            gl.PopMatrix();

            //画月亮
            gl.PushMatrix();
            {               
                gl.Color(1.0f, 1.0f, 0.0f);     //黄色
                gl.Rotate(angle[1], 0.0f, 1.0f, 0.0f);  //和地球一起绕太阳转。Y轴
                gl.Translate(0.0f, 0.0f, -20.0f);    //旋转变换后,前面的Z轴对应到现在的X轴。到太阳距离
                gl.Rotate(angle[2], 0.0f, 1.0f, 0.0f);  //月亮绕地球转:Z轴
                gl.Translate(-5.0f, 0.0f, 0.0f); //月亮到地球距离5.0f
                gl.Scale(2.0f, 2.0f, 2.0f);  //月球尺寸
                DrawCube(ref gl, 0.0f, 0.0f, 0.0f, true);
            }
            gl.PopMatrix();
        }

运动程序:

3、测试四轴机械臂

代码

工程下载链接:

SharpGL仿真太阳系和机械臂运动.rar-C#文档类资源-CSDN下载

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SharpGL是一个.NET的开源图形,可以用来进行3D图形渲染。要使用SharpGL画一个六轴机器人,需要以下步骤: 1. 安装SharpGL。可以在Visual Studio的NuGet包管理器中搜索SharpGL并安装。 2. 创建一个Windows窗体应用程序,将SharpGL控件添加到窗体中。 3. 在SharpGL的OpenGLDraw事件中编写绘图代码。可以使用OpenGL的变换函数(如glTranslatef、glRotatef)来控制机器人的位置和方向。 4. 根据机器人的结构,使用OpenGL的绘图函数(如glBegin、glEnd、glVertex3f)来绘制每个部件。 以下是一个简单的示例代码,用SharpGL绘制一个六轴机器人: ```csharp using System; using System.Windows.Forms; using SharpGL; namespace SharpGLRobot { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void openGLControl_OpenGLDraw(object sender, RenderEventArgs args) { OpenGL gl = openGLControl.OpenGL; // 清除屏幕 gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); // 设置视角 gl.MatrixMode(OpenGL.GL_PROJECTION); gl.LoadIdentity(); gl.Perspective(60.0f, (double)Width / (double)Height, 0.1f, 100.0f); gl.LookAt(0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); // 绘制机器人 gl.MatrixMode(OpenGL.GL_MODELVIEW); gl.LoadIdentity(); // 绘制基座 gl.Color(0.5f, 0.5f, 0.5f); gl.Begin(OpenGL.GL_QUADS); gl.Vertex3f(-1.0f, -1.0f, -1.0f); gl.Vertex3f(1.0f, -1.0f, -1.0f); gl.Vertex3f(1.0f, 1.0f, -1.0f); gl.Vertex3f(-1.0f, 1.0f, -1.0f); gl.End(); // 绘制第一段臂 gl.Translate(0.0f, 0.0f, -1.0f); gl.Color(1.0f, 0.0f, 0.0f); gl.Begin(OpenGL.GL_QUADS); gl.Vertex3f(-0.5f, -0.5f, -2.0f); gl.Vertex3f(0.5f, -0.5f, -2.0f); gl.Vertex3f(0.5f, 0.5f, -2.0f); gl.Vertex3f(-0.5f, 0.5f, -2.0f); gl.End(); // 绘制第二段臂 gl.Translate(0.0f, 0.0f, -1.0f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Big_潘大师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值