【OpenGL】机器人手臂的实现

2023-11-08

一、基本功能

实现了机器人的一只手臂,由上臂、下臂、五根手指共同组成,通过A、S、D、F、G键向上旋转,通过a、s、d、f、g键向下旋转,通过方向键left和right转向,通过up和down实现放缩。

效果图如下:

 

二、实现过程

 

1、实现手臂

对于手臂的实现,可以使用一个经过放缩后的立方体作为手臂的一段。手臂模型搭建好后,就是要确定手臂的位置,因为手臂进行旋转,不是绕手臂的中心节点(等同于立体体的体心)进行旋转,它是绕手臂的一条边(等同于立方体的一条边)进行旋转。

因此先调用glTranslatef()函数移动至手臂的旋转边上,在旋转边进行旋转glRotate(),再走glTranslatef()进行绘制,此时绘制点即手臂的中心节点,而我们旋转的位置在手臂的旋转边上。实现代码如下所示:

glTranslatef(0.0, 0.0, -distance);

    glRotatef(theta, 0.0, 1.0, 0.0);

    /*绘制第一段*/

    glTranslatef(-1.0*n, 0.0, 0.0);

    glRotatef(shoulder, 0.0, 0.0, 1.0);

    glTranslatef(1.0*n, 0.0, 0.0);

    glPushMatrix();

         glColor4f(1.0f, 0.0, 0.0, 0.0);

         glScalef(2.0*n, 0.4*n, 1.0*n);

         glutSolidCube(1.0);

         //glutWireCube(1.0);

    glPopMatrix();

绘制完该段手臂后,可以继续使用上述代码实现下臂。

 

2、实现手指

因为手指的宽度是比手臂要窄的多,因此,绘制手指,需要先沿手臂宽度方向移动位置,设置好每个手指的起始位置,而手指的位置方法同手臂,因此循环上述过程即可。

 

3、实现手动控制手臂的转动

通过创建键盘响应的相应回调函数即可实现这一功能。

 

4、遇到的问题与思考

在实现过程中,我在手指的绘制过程中卡了一下,因为我自己认为我写的几何变换没有问题,但是却无法被绘制出来,因此我想造成这种问题是否是我几何变换导致的,因此我反复推算几何变换过程的结果,自己觉得并没有问题,因此我进行放缩、旋转进行观察,判断其是否可能是因为被裁剪掉了,之后我发现也不是这个问题,因此我想是不是我给的放大系数n12、n13太小了导致的。因此我将其放大到与n一样的大小,甚至更大,我发现我的手指可以画出来,只是很小,我再次推送我的几何变换式子,发现了问题之所在,我对glScalef的变换没有去保护环境,也就是说,我的手指,是在n11的基础上进一步被缩小了,而我的n11放缩系数是第一节手指,n12是第二节手指,因此我第二节手指的实际放缩倍数为了n11*n12,导致画出的手指很小,几乎看不到,导致这一结果的原因也是因为,自己一直漏考虑到了glScalef的变换。

 

5、源代码

CSDN下载链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【OpenGL】机器人手臂的实现 的相关文章

随机推荐

  • C++ explicit关键字浅析

    explicit关键字 今天在看std thread的时候 发现他的构造函数是这样的 explicit thread Fn fn Args args explicit这个关键字很眼熟 因为在Qt中默认的构造函数也是用的这个关键字 expli
  • Unity 2D像素游戏序列帧动画制作规范

    一 问题背景 笔者遇到了很多很多跟美术策划协作的问题 首先声明本文不考虑SpriteAltas 也不绝对正确 仅供参考 错误可以在评论区指出我进行修改以免误导 我们可以清楚的看到跳跃后会出现角色跟碰撞器大小不一样的情况 这个时候如果我去碰右
  • 软件开发中的SD、SE、QA和RD是什么意思?

    2019独角兽企业重金招聘Python工程师标准 gt gt gt QA QA即英文QUALITY ASSURANCE 的简称 中文意思是品质保证 其在ISO8402 1994中的定义是 为了提供足够的信任表明实体能够满足品质要求 而在品质
  • “卷爆了“的IT互联网行业,为啥至今还有人头铁往里冲?

    细数互联网过往的发展史 造就了成千上万的企业家 创业者 众多职场人趋之若鹜地选择互联网行业 想从这个领域捞一桶金 但不知道从什么时候开始 一篇篇关于互联网红利消失 流量枯竭的文章接踵而至 现在转行互联网 做什么看起来都是那么困难 很多从业者
  • 有趣的数据结构算法3——单链表尾插法和头插法的实现

    有趣的数据结构算法3 单链表尾插法和头插法的实现 什么是单链表 头插法的实现 尾插法的实现 头插法实现代码 尾插法实现代码 GITHUB下载连接 以前学习C语言的时候 对于指针 链表什么的是最害怕的 但是现在 什么是单链表 单链表是一种链式
  • 在Visual Studio Code中使用CSSComb格式化CSS文件

    在Visual Studio Code中使用CSSComb格式化CSS文件 最近在使用Visual Studio Code 开始逐渐上手 发现非常好用 不管是在JS文件还是在HTML文件中 右键点击 都有 格式化文件 的菜单 帮助我们排版
  • linux查看服务端口号、查看端口(netstat、lsof)

    linux查看服务端口号 查看端口 netstat lsof netstat atulnp会显示所有端口和所有对应的程序 用grep管道可以过滤出想要的字段 a all 表示列出所有的连接 服务监听 Socket资料 t tcp 列出tcp
  • 配置docker阿里云镜像加速

    默认情况下docker安装镜像文件是从docker官方的镜像中心下载 https hub docker com 有时速度慢 可以通过配置docker阿里云镜像来加速 配置后 就从国内阿里云下载 注册阿里云用户 登录 gt 工作台 gt 产品
  • 200 ok 几种状态

    浏览器加载资源成功一般会有几种状态 200 ok 从原始服务器请求成功 200 ok from cache 200 ok from disk cache 200 ok from memory cache 304 not modified 向
  • mysql sql语句查询指定月份

    需求 根据输入年月 查询指定数据 方法1 SELECT FROM 表名 WHERE YEAR 列名 年份 AND MONTH 列名 月份 方法2 SELECT FROM 表名 WHERE date format 列名 Y m 2020 01
  • JDBC快速入门,mysql8.0版本+druid+spring jdbc使用,出现因版本错误的解决方法

    JDBC核心技术 JDBC概述 数据持久化 持久化 persistence 把数据保存到可掉电式存储设备中以供之后使用 大多数情况下 特别是企业级应用数据持久化意味着将内存中的数据保存到硬盘上加以 固化 而持久化的实现过程大多通过各种关系数
  • runaway

    runaway函数 这个程序是查看你所用的电脑中所分配的栈的大小 include
  • 解决Java从MySQL读取大量数据时卡…

    今天晚上突然有个服务无法启动 这个服务在启动的时候会从数据库中加载一些数据 查看日志 有开始加载的日志 但没有完成加载的日志 判断问题是在加载数据时卡住 用top查看进程 发现CPU占用为0 又怀疑可能是因为jvm内存不够 用jstat查看
  • js限制输入框字数

  • Ubuntu上配置VS Code调试C++

    直接使用GDB在Ubuntu上调试C code 有时不是很方便 这里介绍下在Ubuntu上通过Visual Studio Code调试C code操作步骤 通过CMake编译 安装所需依赖 1 在Ubuntu上安装Visual Studio
  • Qt学习之QMainWindow(一)QMainWindow简介

    详细的后续会讲到 这里重在理解过程 Qt中的顶层窗口称为MainWindow 属于类QMainWindow QMainWindow也是继承于QWidget 通过子类化QMainWindow可以创建一个应用程序的窗口 MainWindow的结
  • SpringBoot项目使用EasyExcel读取上传Excel

    SpringBoot项目使用EasyExcel读取上传Excel 1 EasyExcel简介 EasyExcel是一个基于Java的简单 省内存的读写Excel的开源项目 在尽可能节约内存的情况下支持读写百M的Excel EasyExcel
  • Mybatis的mapper.xml批量插入、修改sql

    今天要有个功能 要进行一批数据的插入和修改 为了不频繁调用数据库 所以想到了批量插入和修改 因为从毕业后 就没写过批量插入和批量修改 所以在这里记录一下 避免后续再遇到忘记怎么写了 批量插入 传入的参数是List lt 实体 gt list
  • 基于vue-element-ui开发Hproxy项目前端

    hproxy项目前端使用vue element admin框架 页面为hook列表 和一个添加hook页面 添加路由 编辑src router index js文件 在constantRoutes列表追加如下路由内容 path hproxy
  • 【OpenGL】机器人手臂的实现

    一 基本功能 实现了机器人的一只手臂 由上臂 下臂 五根手指共同组成 通过A S D F G键向上旋转 通过a s d f g键向下旋转 通过方向键left和right转向 通过up和down实现放缩 效果图如下 二 实现过程 1 实现手臂