精易论坛

标题: 机械臂联动 [打印本页]

作者: 服毒自尽    时间: 2025-2-7 19:40
标题: 机械臂联动
本帖最后由 服毒自尽 于 2025-2-8 10:34 编辑

用gdiplus实现的机械臂联动效果,还可以优化,特别时闪烁问题,颈椎有点痛,暂时就先这样吧!
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
画布GP图形  
图像GP图像  
图片字节集4 
坐标坐标F4 
句柄整数型  
旋转角度整数型4 
初始角度整数型4 
旋转中心坐标F4 
当前关节整数型  
记录当前关节整数型  
角度增减整数型  
位置坐标F4 
长度双精度小数型4 
线程句柄整数型  
跳出逻辑型  
刷新画面逻辑型  

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
Gdiplus初始化 ()
初始化数据 ()
图片 [1]#a1  ' ------------------------
图片 [2]#a2
图片 [3]#a3  ' 方便后期调用
图片 [4]#a4  ' ------------------------
当前关节 = 4
长度 [2]求平方根 (求平方 (取绝对值 (旋转中心 [1].x - 旋转中心 [2].x)) + 求平方 (取绝对值 (旋转中心 [1].y - 旋转中心 [2].y)))  ' ------------------------
长度 [3]求平方根 (求平方 (取绝对值 (旋转中心 [2].x - 旋转中心 [3].x)) + 求平方 (取绝对值 (旋转中心 [2].y - 旋转中心 [3].y)))  ' 四个关节两两之间的距离,用于计算旋转后关节的坐标
长度 [4]求平方根 (求平方 (取绝对值 (旋转中心 [3].x - 旋转中心 [4].x)) + 求平方 (取绝对值 (旋转中心 [3].y - 旋转中心 [4].y)))  ' ------------------------
图像.创建自像素格式 (画板1.宽度, 画板1.高度, #像素格式_32bppARGB )  ' 有足够大的空间,防止图片旋转后超出边缘
画布.创建自图像 (图像)  ' 为后面图片绕点旋转创建矩阵提供条件
显示画面 ()
启动线程 (&子程序1, , 线程句柄)
子程序名返回值类型公开备 注
子程序1  
判断循环首 (跳出 = )
如果真 (刷新画面 = )
当前关节 = 记录当前关节
更新关节 (角度增减)
延时 (50)

判断循环尾 ()
子程序名返回值类型公开备 注
初始化数据  
坐标 [1].x = 710  ' ------------------------
坐标 [1].y = 470  ' 图片1的左边与顶边边距
坐标 [2].x = 490  ' ------------------------
坐标 [2].y = 254  ' 图片2的左边与顶边边距
坐标 [3].x = 527  ' ------------------------
坐标 [3].y = 214  ' 图片3的左边与顶边边距
坐标 [4].x = 759  ' ------------------------
坐标 [4].y = 228  ' 图片4的左边与顶边边距
位置 = 坐标  ' 用于移动图片
旋转中心 [1].x = 555  ' ------------------------
旋转中心 [1].y = 400  ' 关节1的坐标
旋转中心 [2].x = 555  ' ------------------------
旋转中心 [2].y = 275  ' 关节2的坐标
旋转中心 [3].x = 807  ' ------------------------
旋转中心 [3].y = 277  ' 关节3的坐标
旋转中心 [4].x = 1021  ' ------------------------
旋转中心 [4].y = 540  ' 关节4的坐标
初始角度 [2] = 90  ' 夹子的初始角度
初始角度 [3] = 179  ' 小臂的初始角度
初始角度 [4] = 231  ' 大臂的初始角度
[attach]1358869[/attach]
子程序名返回值类型公开备 注
求平方双精度小数型 
参数名类 型参考可空数组备 注
双精度小数型
返回 (值 × 值)
子程序名返回值类型公开备 注
更新关节  
参数名类 型参考可空数组备 注
角度整数型
变量名类 型静态数组备 注
弧度双精度小数型 
计次整数型 
偏移坐标F 
变量循环首 (当前关节, 2, -1, 计次)
旋转角度 [计次] = 旋转角度 [计次] - 角度  ' 增加或减小关节旋转角度
弧度 (初始角度 [计次] + 旋转角度 [计次]) × #pi ÷ 180  ' 角度转弧度
偏移.x = 旋转中心 [计次 - 1].x
偏移.y = 旋转中心 [计次 - 1].y
旋转中心 [计次 - 1].x = 旋转中心 [计次].x + 长度 [计次] × 求余弦 (弧度)  ' 计算上一旋转中心的x坐标例如坐标[2]的上一个就是坐标[1],使关节具有联动效果
旋转中心 [计次 - 1].y = 旋转中心 [计次].y + 长度 [计次] × 求正弦 (弧度)  ' 计算上一旋转中心的y坐标例如坐标[2]的上一个就是坐标[1],使关节具有联动效果
偏移.x = 旋转中心 [计次 - 1].x - 偏移.x
偏移.y = 旋转中心 [计次 - 1].y - 偏移.y
位置 [计次 - 1].x = 位置 [计次 - 1].x + 偏移.x
位置 [计次 - 1].y = 位置 [计次 - 1].y + 偏移.y
变量循环尾 ()
显示画面 ()
子程序名返回值类型公开备 注
显示画面  
变量名类 型静态数组备 注
计次整数型 
画板1.清除 (, , , )
计次循环首 (4, 计次)
当前关节 = 计次  ' 触发联动
判断 (计次 = 1 计次 > 当前关节)
句柄 = 载入图片 (图片 [计次])  ' 由于该图片不需要进行变换操作,所以直接载入
画板1.画图片 (句柄, 坐标 [计次].x, 坐标 [计次].y, , , )
句柄 = 载入图片 (渲染画面 (计次))  ' 由于该图片需要进行变换操作,所以先进行变换操作再载入
画板1.画图片 (句柄, 0, 0, , , )
卸载图片 (句柄)
计次循环尾 ()
画板1.画笔颜色 = #红色
画板1.画直线 (旋转中心 [1].x, 旋转中心 [1].y, 旋转中心 [2].x, 旋转中心 [2].y)  ' --------------------------------------
画板1.画直线 (旋转中心 [2].x, 旋转中心 [2].y, 旋转中心 [3].x, 旋转中心 [3].y)  ' 先连接关节的坐标再画关节,避免线被画到圆上
画板1.画直线 (旋转中心 [3].x, 旋转中心 [3].y, 旋转中心 [4].x, 旋转中心 [4].y)
画板1.画笔颜色 = #蓝色
画板1.画椭圆 (旋转中心 [1].x - 5, 旋转中心 [1].y - 5, 旋转中心 [1].x + 5, 旋转中心 [1].y + 5)  ' --------------------------------------
画板1.画椭圆 (旋转中心 [2].x - 5, 旋转中心 [2].y - 5, 旋转中心 [2].x + 5, 旋转中心 [2].y + 5)  ' 画圆表示关节
画板1.画椭圆 (旋转中心 [3].x - 5, 旋转中心 [3].y - 5, 旋转中心 [3].x + 5, 旋转中心 [3].y + 5)
画板1.画椭圆 (旋转中心 [4].x - 5, 旋转中心 [4].y - 5, 旋转中心 [4].x + 5, 旋转中心 [4].y + 5)
子程序名返回值类型公开备 注
渲染画面字节集 
参数名类 型参考可空数组备 注
关节整数型
变量名类 型静态数组备 注
位图GP位图 
部件字节集 
矩阵GP矩阵 
计次整数型 
画布.清除 ()  ' 将gp图形定义为程序集变量,避免频繁的创建与销毁,所以要在此处清除上一次的数据
图像.清除 ()  ' 将gp图像定义为程序集变量,避免频繁的创建与销毁,所以要在此处清除上一次的数据
位图.创建自字节集 (图片 [关节])  ' 创建一个gp位图,用于下面进行旋转变换操作
矩阵.创建 ()  ' 创建一个gp矩阵,用于下面使用旋转变换操作的功能
矩阵.旋转在 (旋转角度 [关节], 旋转中心 [当前关节], )  ' 变换操作
画布.变形置矩阵 (矩阵)  ' 将变换操作应用到图形上
画布.画图像 (位图, 位置 [关节].x, 位置 [关节].y)  ' 得到变换操作的结果
部件 = 图像.保存到字节集 ( #图像格式_PNG )  ' 获得变换操作后的图片数据
位图.销毁 ()
矩阵.销毁 ()
返回 (部件)
子程序名返回值类型公开备 注
__启动窗口_将被销毁  
跳出 = 真
画布.销毁 ()
图像.销毁 ()
关闭线程句柄 (线程句柄)
Gdiplus关闭 ()
子程序名返回值类型公开备 注
_按钮1_鼠标左键被按下逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
记录当前关节 = 2  ' 指定关节,以此关节为旋转中心
角度增减 = -1
刷新画面 = 真
子程序名返回值类型公开备 注
_按钮1_鼠标左键被放开逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
刷新画面 = 假
子程序名返回值类型公开备 注
_按钮2_鼠标左键被按下逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
记录当前关节 = 2  ' 指定关节,以此关节为旋转中心
角度增减 = 1
刷新画面 = 真
子程序名返回值类型公开备 注
_按钮2_鼠标左键被放开逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
刷新画面 = 假
子程序名返回值类型公开备 注
_按钮3_鼠标左键被按下逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
记录当前关节 = 3  ' 指定关节,以此关节为旋转中心
角度增减 = -1
刷新画面 = 真
子程序名返回值类型公开备 注
_按钮3_鼠标左键被放开逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
刷新画面 = 假
子程序名返回值类型公开备 注
_按钮4_鼠标左键被按下逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
记录当前关节 = 3  ' 指定关节,以此关节为旋转中心
角度增减 = 1
刷新画面 = 真
子程序名返回值类型公开备 注
_按钮4_鼠标左键被放开逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
刷新画面 = 假
子程序名返回值类型公开备 注
_按钮5_鼠标左键被按下逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
记录当前关节 = 4  ' 指定关节,以此关节为旋转中心
角度增减 = -1
刷新画面 = 真
子程序名返回值类型公开备 注
_按钮5_鼠标左键被放开逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
刷新画面 = 假
子程序名返回值类型公开备 注
_按钮6_鼠标左键被按下逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
记录当前关节 = 4  ' 指定关节,以此关节为旋转中心
角度增减 = 1
刷新画面 = 真
子程序名返回值类型公开备 注
_按钮6_鼠标左键被放开逻辑型 
参数名类 型参考可空数组备 注
横向位置整数型
纵向位置整数型
功能键状态整数型
刷新画面 = 假


i支持库列表   支持库注释   
EThread多线程支持库

2.JPG (64.64 KB, 下载次数: 0)

2.JPG

_20250207_222311.gif (31.56 KB, 下载次数: 0)

我这里运行起来是这样的,没有优化,所以会闪烁

我这里运行起来是这样的,没有优化,所以会闪烁

模块.zip

2.27 MB, 下载次数: 11, 下载积分: 精币 -2 枚


作者: quary    时间: 2025-2-7 19:44
666666666666666666
作者: 1184798949    时间: 2025-2-7 20:24
感谢分享
作者: cqcc    时间: 2025-2-7 20:25
这个确实有点牛
作者: 像神一样飘渺    时间: 2025-2-7 20:31
这个确实有点牛
作者: 算法艺术家    时间: 2025-2-7 20:32
gdiplus大佬
作者: 服毒自尽    时间: 2025-2-7 20:44
最近在做一个动画编辑器,由于涉及到骨骼问题,所以先用这个试试水,之前开源的所有源码都属于副产品,不过由于GPU不支持训练大模型,所以动作捕捉部分卡住了,慢慢来吧!
作者: 283688410    时间: 2025-2-7 20:46
谢谢分享
作者: preference    时间: 2025-2-7 20:50
6666666666666666666666666
作者: oushg79    时间: 2025-2-7 20:52

作者: cqcc    时间: 2025-2-7 20:55

这是啥情况?

作者: 服毒自尽    时间: 2025-2-7 20:57
重点看更新关节部分和渲染画面部分,
更新关节的地方牵涉到了下面的图片旋转,由于不是通常的绕中心点旋转,所以坐标的计算是重中之重,坐标计算出现误差就会导致图片旋转后偏离旋转点。后面的渲染部分呢!要注意gp图形的宽度,最小得以图片的对角线为宽高的正方形,不然图片旋转后可能会有一个或者几个角跑到外面去
作者: 风景好靓    时间: 2025-2-7 22:05
谢谢分享
作者: cqcc    时间: 2025-2-7 22:54
能不能把模块一起分享
作者: XJxaiojing    时间: 2025-2-8 01:19
666666666666666
作者: 豆豆灰常开心    时间: 2025-2-8 07:11
感谢楼主分享!
作者: 查过    时间: 2025-2-8 07:15
感谢分享,很给力!~
作者: wuqingg    时间: 2025-2-8 08:34

作者: qq977352880    时间: 2025-2-8 10:30
来赚个积分,感谢分享。

作者: 胖子葛格    时间: 2025-2-8 10:31
感谢大神分享!
作者: 服毒自尽    时间: 2025-2-8 10:36
有张图片有点问题已经更新了,模块已打包  
作者: mood100    时间: 2025-2-8 14:34
这个是干嘛用的

作者: cqcc    时间: 2025-2-8 22:51
我怎么用你的模块,还是不行呢?
作者: year1970    时间: 2025-2-9 09:29
感谢分享
作者: cqcc    时间: 2025-2-9 18:38
我是啥也没改,直接下载打开运行,用的你的模块,还是不行,跟上次我发的图一样!
作者: cqcc    时间: 2025-2-9 18:38
我是啥也没改,直接下载打开运行,用的你的模块,还是不行,跟上次我发的图一样!
作者: cqcc    时间: 2025-2-13 19:24
jixiebi.e (1.58 MB, 下载次数: 0)

修改了一下,他的底座跟着跑是怎么回事?

作者: cqcc    时间: 2025-2-14 07:25
那句排除代码没理解,就是大于那个判断吧?
作者: cqcc    时间: 2025-2-15 17:58
本帖最后由 cqcc 于 2025-2-15 18:07 编辑

但是是一的时候就直接画出来了,为何大于1的时候,底座还会跟着旋转呢?如果排除了,就看不到底座,他会一直闪烁,不按鼠标他就看不到底座。
作者: 服毒自尽    时间: 2025-2-26 00:31
本帖最后由 服毒自尽 于 2025-2-26 00:49 编辑

请问请问亲
作者: 服毒自尽    时间: 2025-2-26 00:34
服毒自尽 发表于 2025-2-26 00:31
.版本 2
.支持库 EThread

部分算法更新,动画更流畅,不再闪烁
作者: 服毒自尽    时间: 2025-2-26 00:47
发帖还不熟练,这是源码

a.JPG (82.82 KB, 下载次数: 0)

a.JPG

jixiebi.zip

483.1 KB, 下载次数: 4, 下载积分: 精币 -2 枚

售价: 1 枚 精币  [记录]






欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4