机器人制作开源方案 | Delta型腿机器狗实现原地动作

1. 功能说明

本文示例将实现R322样机Delta型腿机器狗原地摆臂、原地圆形摆动、原地蹲起、原地踏步的功能。
原地摆臂
原地圆形摆动
原地蹲起
原地踏步

 2. 电子硬件

本实验中采用了以下硬件:
主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

SH-SR舵机扩展板
传感器近红外传感器
六轴陀螺仪
电池7.4v锂电池、11.1V动力电池

其它

电压显示器

电路连接说明:Delta型腿机器狗的电路连接方式可参考上文【R322】Delta型腿机器狗-全动作展示

3. 功能实现

编程环境:Arduino 1.8.0

下面提供一个Delta型腿机器狗原地动作(原地摆臂、原地圆形摆动、原地蹲起、原地踏步)的参考例程,具体实验效果可参考演示视频。

① 原地摆臂例程(parallel_dog_liftLeg.ino):

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-06-26 https://www.robotway.com/------------------------------*//*****Copyright 2017 Robot TIme摆臂例程*****/#include "Tlc5940.h"#include "tlc_servos.h"#include <math.h>#include "types.h"#include "config.h"// 相关函数声明/***** 红外相关函数 *****/void IRInit(); //红外初始化void enableIR(); //红外使能void disableIR(); //关闭红外void updateIR(); //红外避障更新动作/***** 平衡相关函数 *****/void switchAdjustStat(uint stat); //切换平衡调节模式 不调节/原地调节/行进间调节void readGyroSerial(); //读取陀螺仪串口消息void adjustAct(); //平衡调节动作/****** 腿部动作相关函数 *****/void setTurnLeftFlag(bool flag); //修改左转状态标志位void setTurnRightFlag(bool flag); //修改右转状态标志位void leg1(); //更新1号腿(左前)位置void leg2(); //更新2号腿(左后)位置void leg3(); //更新3号腿(右前)位置void leg4(); //更新4号腿(右后)位置bool calc(Point3d p, bool leg1, bool leg2, bool leg3, bool leg4); //逆解计算函数/***** 整机动作相关函数 *****/void dogReset(Point3d initPos, uint waitTime); //复位动作void dogInit(); //初始化动作void upDown(float x, float y, float z1, float z2, uint times); //蹲起动作void drawCircle(float ox, float oy, float z, float r, uint times); //原地圆形摆动动作void stepping(float x, float y, float z1, float z2, uint times); // 原地踏步动作void liftShoulder(uint height, uint times); //原地摆臂动作//动作周期计数器int cycleCount;//复位计数器void resetCycleCount(){cycleCount = -1;}void updateCycleCount(){cycleCount++;}//当前运动状态dogMode currentMode;//切换运动状态void setMode(dogMode mode){if (mode == currentMode) return;if (mode == DOG_MODE_TURN_LEFT){setTurnLeftFlag(true);setTurnRightFlag(false);} else if (mode == DOG_MODE_TURN_RIGHT){setTurnLeftFlag(false);setTurnRightFlag(true);} else {setTurnLeftFlag(false);setTurnRightFlag(false);}if (mode == DOG_MODE_BACK) //后退时关闭红外传感器{disableIR();} else if (mode == DOG_MODE_STOP) //静止后开始原地姿态调节{switchAdjustStat(ADJUST_STAT_LEG);dogReset({0, 0, Leg_Init_Z_Pos}, 200);}currentMode = mode;}void updateMode(){if (cycleCount == MOTION_TIMES + 1) setMode(DOG_MODE_BACK);if (cycleCount == 3 * MOTION_TIMES) setMode(DOG_MODE_LEFT);if (cycleCount == 4 * MOTION_TIMES) setMode(DOG_MODE_RIGHT);if (cycleCount == 5 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_FRONT);if (cycleCount == 6 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_BACK);if (cycleCount == 7 * MOTION_TIMES) setMode(DOG_MODE_LEFT_BACK);if (cycleCount == 8 * MOTION_TIMES) setMode(DOG_MODE_LEFT_FRONT);if (cycleCount == 9 * MOTION_TIMES) setMode(DOG_MODE_TURN_LEFT);if (cycleCount == 10 * MOTION_TIMES) setMode(DOG_MODE_TURN_RIGHT);if (cycleCount == 11 * MOTION_TIMES) setMode(DOG_MODE_STOP);}void setup(){//陀螺仪连接串口,波特率115200Serial.begin(115200);//舵机驱动板初始化Tlc.init(0);tlc_initServos();   // Note: this will drop the PWM freqency down to 50Hz.//红外传感器初始化IRInit();//大狗身体初始化dogInit();//原地摆臂动作10次后停止liftShoulder(40, 10);while(1);}void loop(){}

② 原地圆形摆动例程(parallel_dog_drawCircle.ino):

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-06-26 https://www.robotway.com/------------------------------*//*****Copyright 2017 Robot TIme原地圆形摆动例程*****/#include "Tlc5940.h"#include "tlc_servos.h"#include <math.h>#include "types.h"#include "config.h"// 相关函数声明/***** 红外相关函数 *****/void IRInit(); //红外初始化void enableIR(); //红外使能void disableIR(); //关闭红外void updateIR(); //红外避障更新动作/***** 平衡相关函数 *****/void switchAdjustStat(uint stat); //切换平衡调节模式 不调节/原地调节/行进间调节void readGyroSerial(); //读取陀螺仪串口消息void adjustAct(); //平衡调节动作/****** 腿部动作相关函数 *****/void setTurnLeftFlag(bool flag); //修改左转状态标志位void setTurnRightFlag(bool flag); //修改右转状态标志位void leg1(); //更新1号腿(左前)位置void leg2(); //更新2号腿(左后)位置void leg3(); //更新3号腿(右前)位置void leg4(); //更新4号腿(右后)位置bool calc(Point3d p, bool leg1, bool leg2, bool leg3, bool leg4); //逆解计算函数/***** 整机动作相关函数 *****/void dogReset(Point3d initPos, uint waitTime); //复位动作void dogInit(); //初始化动作void upDown(float x, float y, float z1, float z2, uint times); //蹲起动作void drawCircle(float ox, float oy, float z, float r, uint times); //原地圆形摆动动作void stepping(float x, float y, float z1, float z2, uint times); // 原地踏步动作void liftShoulder(uint height, uint times); //原地摆臂动作//动作周期计数器int cycleCount;//复位计数器void resetCycleCount(){cycleCount = -1;}void updateCycleCount(){cycleCount++;}//当前运动状态dogMode currentMode;//切换运动状态void setMode(dogMode mode){if (mode == currentMode) return;if (mode == DOG_MODE_TURN_LEFT){setTurnLeftFlag(true);setTurnRightFlag(false);} else if (mode == DOG_MODE_TURN_RIGHT){setTurnLeftFlag(false);setTurnRightFlag(true);} else {setTurnLeftFlag(false);setTurnRightFlag(false);}if (mode == DOG_MODE_BACK) //后退时关闭红外传感器{disableIR();} else if (mode == DOG_MODE_STOP) //静止后开始原地姿态调节{switchAdjustStat(ADJUST_STAT_LEG);dogReset({0, 0, Leg_Init_Z_Pos}, 200);}currentMode = mode;}void updateMode(){if (cycleCount == MOTION_TIMES + 1) setMode(DOG_MODE_BACK);if (cycleCount == 3 * MOTION_TIMES) setMode(DOG_MODE_LEFT);if (cycleCount == 4 * MOTION_TIMES) setMode(DOG_MODE_RIGHT);if (cycleCount == 5 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_FRONT);if (cycleCount == 6 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_BACK);if (cycleCount == 7 * MOTION_TIMES) setMode(DOG_MODE_LEFT_BACK);if (cycleCount == 8 * MOTION_TIMES) setMode(DOG_MODE_LEFT_FRONT);if (cycleCount == 9 * MOTION_TIMES) setMode(DOG_MODE_TURN_LEFT);if (cycleCount == 10 * MOTION_TIMES) setMode(DOG_MODE_TURN_RIGHT);if (cycleCount == 11 * MOTION_TIMES) setMode(DOG_MODE_STOP);}void setup(){//陀螺仪连接串口,波特率115200Serial.begin(115200);//舵机驱动板初始化Tlc.init(0);tlc_initServos();   // Note: this will drop the PWM freqency down to 50Hz.//红外传感器初始化IRInit();//大狗身体初始化dogInit();//原地做圆形摆动10周后停止drawCircle(0, 0, -120, 60, 10);while(1);}void loop(){}

③ 原地蹲起例程(parallel_dog_updown.ino):

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-06-26 https://www.robotway.com/------------------------------*//*****Copyright 2017 Robot TIme原地蹲起例程*****/#include "Tlc5940.h"#include "tlc_servos.h"#include <math.h>#include "types.h"#include "config.h"// 相关函数声明/***** 红外相关函数 *****/void IRInit(); //红外初始化void enableIR(); //红外使能void disableIR(); //关闭红外void updateIR(); //红外避障更新动作/***** 平衡相关函数 *****/void switchAdjustStat(uint stat); //切换平衡调节模式 不调节/原地调节/行进间调节void readGyroSerial(); //读取陀螺仪串口消息void adjustAct(); //平衡调节动作/****** 腿部动作相关函数 *****/void setTurnLeftFlag(bool flag); //修改左转状态标志位void setTurnRightFlag(bool flag); //修改右转状态标志位void leg1(); //更新1号腿(左前)位置void leg2(); //更新2号腿(左后)位置void leg3(); //更新3号腿(右前)位置void leg4(); //更新4号腿(右后)位置bool calc(Point3d p, bool leg1, bool leg2, bool leg3, bool leg4); //逆解计算函数/***** 整机动作相关函数 *****/void dogReset(Point3d initPos, uint waitTime); //复位动作void dogInit(); //初始化动作void upDown(float x, float y, float z1, float z2, uint times); //蹲起动作void drawCircle(float ox, float oy, float z, float r, uint times); //原地圆形摆动动作void stepping(float x, float y, float z1, float z2, uint times); // 原地踏步动作void liftShoulder(uint height, uint times); //原地摆臂动作//动作周期计数器int cycleCount;//复位计数器void resetCycleCount(){cycleCount = -1;}void updateCycleCount(){cycleCount++;}//当前运动状态dogMode currentMode;//切换运动状态void setMode(dogMode mode){if (mode == currentMode) return;if (mode == DOG_MODE_TURN_LEFT){setTurnLeftFlag(true);setTurnRightFlag(false);} else if (mode == DOG_MODE_TURN_RIGHT){setTurnLeftFlag(false);setTurnRightFlag(true);} else {setTurnLeftFlag(false);setTurnRightFlag(false);}if (mode == DOG_MODE_BACK) //后退时关闭红外传感器{disableIR();} else if (mode == DOG_MODE_STOP) //静止后开始原地姿态调节{switchAdjustStat(ADJUST_STAT_LEG);dogReset({0, 0, Leg_Init_Z_Pos}, 200);}currentMode = mode;}void updateMode(){if (cycleCount == MOTION_TIMES + 1) setMode(DOG_MODE_BACK);if (cycleCount == 3 * MOTION_TIMES) setMode(DOG_MODE_LEFT);if (cycleCount == 4 * MOTION_TIMES) setMode(DOG_MODE_RIGHT);if (cycleCount == 5 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_FRONT);if (cycleCount == 6 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_BACK);if (cycleCount == 7 * MOTION_TIMES) setMode(DOG_MODE_LEFT_BACK);if (cycleCount == 8 * MOTION_TIMES) setMode(DOG_MODE_LEFT_FRONT);if (cycleCount == 9 * MOTION_TIMES) setMode(DOG_MODE_TURN_LEFT);if (cycleCount == 10 * MOTION_TIMES) setMode(DOG_MODE_TURN_RIGHT);if (cycleCount == 11 * MOTION_TIMES) setMode(DOG_MODE_STOP);}void setup(){//陀螺仪连接串口,波特率115200Serial.begin(115200);//舵机驱动板初始化Tlc.init(0);tlc_initServos();   // Note: this will drop the PWM freqency down to 50Hz.//红外传感器初始化IRInit();//大狗身体初始化dogInit();//原地蹲起10次后停止upDown(0, 0, -160, -90, 10);while(1);}void loop(){}

④ 原地踏步例程(parallel_dog_stepping.ino):

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-06-26 https://www.robotway.com/------------------------------*//*****Copyright 2017 Robot TIme原地蹲起例程*****/#include "Tlc5940.h"#include "tlc_servos.h"#include <math.h>#include "types.h"#include "config.h"// 相关函数声明/***** 红外相关函数 *****/void IRInit(); //红外初始化void enableIR(); //红外使能void disableIR(); //关闭红外void updateIR(); //红外避障更新动作/***** 平衡相关函数 *****/void switchAdjustStat(uint stat); //切换平衡调节模式 不调节/原地调节/行进间调节void readGyroSerial(); //读取陀螺仪串口消息void adjustAct(); //平衡调节动作/****** 腿部动作相关函数 *****/void setTurnLeftFlag(bool flag); //修改左转状态标志位void setTurnRightFlag(bool flag); //修改右转状态标志位void leg1(); //更新1号腿(左前)位置void leg2(); //更新2号腿(左后)位置void leg3(); //更新3号腿(右前)位置void leg4(); //更新4号腿(右后)位置bool calc(Point3d p, bool leg1, bool leg2, bool leg3, bool leg4); //逆解计算函数/***** 整机动作相关函数 *****/void dogReset(Point3d initPos, uint waitTime); //复位动作void dogInit(); //初始化动作void upDown(float x, float y, float z1, float z2, uint times); //蹲起动作void drawCircle(float ox, float oy, float z, float r, uint times); //原地圆形摆动动作void stepping(float x, float y, float z1, float z2, uint times); // 原地踏步动作void liftShoulder(uint height, uint times); //原地摆臂动作//动作周期计数器int cycleCount;//复位计数器void resetCycleCount(){cycleCount = -1;}void updateCycleCount(){cycleCount++;}//当前运动状态dogMode currentMode;//切换运动状态void setMode(dogMode mode){if (mode == currentMode) return;if (mode == DOG_MODE_TURN_LEFT){setTurnLeftFlag(true);setTurnRightFlag(false);} else if (mode == DOG_MODE_TURN_RIGHT){setTurnLeftFlag(false);setTurnRightFlag(true);} else {setTurnLeftFlag(false);setTurnRightFlag(false);}if (mode == DOG_MODE_BACK) //后退时关闭红外传感器{disableIR();} else if (mode == DOG_MODE_STOP) //静止后开始原地姿态调节{switchAdjustStat(ADJUST_STAT_LEG);dogReset({0, 0, Leg_Init_Z_Pos}, 200);}currentMode = mode;}void updateMode(){if (cycleCount == MOTION_TIMES + 1) setMode(DOG_MODE_BACK);if (cycleCount == 3 * MOTION_TIMES) setMode(DOG_MODE_LEFT);if (cycleCount == 4 * MOTION_TIMES) setMode(DOG_MODE_RIGHT);if (cycleCount == 5 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_FRONT);if (cycleCount == 6 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_BACK);if (cycleCount == 7 * MOTION_TIMES) setMode(DOG_MODE_LEFT_BACK);if (cycleCount == 8 * MOTION_TIMES) setMode(DOG_MODE_LEFT_FRONT);if (cycleCount == 9 * MOTION_TIMES) setMode(DOG_MODE_TURN_LEFT);if (cycleCount == 10 * MOTION_TIMES) setMode(DOG_MODE_TURN_RIGHT);if (cycleCount == 11 * MOTION_TIMES) setMode(DOG_MODE_STOP);}void setup(){//陀螺仪连接串口,波特率115200Serial.begin(115200);//舵机驱动板初始化Tlc.init(0);tlc_initServos();   // Note: this will drop the PWM freqency down to 50Hz.//红外传感器初始化IRInit();//大狗身体初始化dogInit();//原地蹲起10次后停止upDown(0, 0, -160, -90, 10);while(1);}void loop(){}

原地动作-程序源代码资料详见 Delta型腿机器狗-原地动作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/72822.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

很突然、很惊艳,马斯克公布:特斯拉人形机器人

????????关注后回复 “进群” &#xff0c;拉你进程序员交流群???????? 来源丨新智元&#xff08;ID&#xff1a;AI_era&#xff09; 8月20日&#xff0c;特斯拉AI日终于开始了&#xff01;马斯克和一众技术高管不仅介绍了特斯拉汽车数据处理、超级计算机Proje…

机器人能帮助缝制 T 恤吗?机器可以取代人力吗?

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 机器可以打印纺织品、裁剪织物和折叠衣服。但是很难训练它们像人类一样快速准确地缝制。 英国《经济学人》2015年的一篇文章指出&#xff0c;尽管多个生产流程已实现自动化&#xff0c;但全球依旧有数百…

一些好书推荐给大家

推荐一&#xff1a;《荆棘鸟》 作者&#xff1a;[澳]考琳麦卡洛 有一个传说&#xff0c;关于一只鸟&#xff0c;它一生只唱歌一次&#xff0c;比地球上任何其他生物都更甜美。从它离开巢穴开始&#xff0c;它就开始寻找那棵荆棘树&#xff0c;直到找到它想要的东西才肯罢休。…

1月好书推荐-8本值得读的好书,让你受益终生

当我们第一遍读一本好书的时候&#xff0c;我们仿佛觉得找到了一个朋友&#xff1b;当我们再一次读这本书的时候&#xff0c;仿佛又和老朋友重逢。——伏尔泰 2018年一下就过去了&#xff0c;是不是后悔没有做一些有意义的事情&#xff0c;比如没有多读几本好书&#xff1f; 2…

Unity制作二次元卡通渲染角色材质——2、色阶化光影的多种做法对比

Unity制作二次元材质角色 回到目录 大家好&#xff0c;我是阿赵。 这里继续讲二次元角色渲染。之前说过&#xff0c;最基本的卡通渲染&#xff0c;包含了色阶化光影和描边二个元素。所以这里先来说一下色阶化光影的多种做法对比。 一、光照模型和色阶化的说明 从上一篇文章里…

二次元单页导航 HTML模板源码

介绍&#xff1a; 我从玖梦博客搬砖下载的&#xff0c;源码有个小问题 缺一个" 我已经修复了&#xff0c;链接什么的我懒得改了&#xff0c;直接原图上来 随机背景图&#xff0c;感觉还可以&#xff0c;如果不喜欢可以在自己修改 网盘下载地址&#xff1a; http://kekew…

二次元的登录界面

今天还是继续坚持写博客&#xff0c;然后今天给大家带来比较具有二次元风格的登录界面&#xff0c;也只是用html和css来写的&#xff0c;大家可以来看看&#xff01; 个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &…

Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

Unity制作二次元材质角色 回到目录 大家好&#xff0c;我是阿赵。 这里继续讲二次元角色材质的制作。这次是讲头部的做法。 1、脸部 之前在分析资源的时候&#xff0c;其实已经发现了这个模型的脸部法线有问题&#xff0c;导致在做光照模型的时候&#xff0c;脸部很奇怪。 把f…

二次元HTML导航页网站源码

简介&#xff1a; 二次元HTML导航页网站源码,非常好看的一款单页源码&#xff0c;感兴趣的同学可以看看&#xff01; 网盘下载地址&#xff1a; http://kekewl.org/p6BqAjZzdqL0 图片&#xff1a;

【有手就会系列】四步通过文字生成二次元小姐姐图片

首先fork项目&#xff0c;启动环境选择16G的A100显卡&#xff0c;直接点击运行加载模型&#xff0c;接着就到了生成小姐姐的时候啦 你需要设置想生成的小姐姐的描述&#xff0c;由于模型是通过英文训练的&#xff0c;所以建议中文翻译成英文输入&#xff0c;填入你想要的描述 不…

wordpress二次元主题

几款开源的wordpress二次元主题&#xff0c;演示地址可到Github查看。 boxmoe Github&#xff1a;https://github.com/baomihuahua/boxmoe-dove- Kratos Github&#xff1a;https://github.com/seatonjiang/kratos Sakura Github&#xff1a;https://github.com/mashiroz…

记一次添加桌面二次元人物的经历

VScode的一个自定义背景插件 事情是这样的&#xff1a; 前两天上课的时候&#xff0c;看到老师VScode背景有个二次元人物&#xff1a; 作为一名二刺猿爱好者&#xff0c;当然要想搞一个&#xff0c;于是找到插件&#xff1a; 肯定不能满足于这默认背景的吧&#xff0c;于是找…

二次元动漫人物脚部的画法

“脚”画不好的原因是&#xff0c;长度和粗细的比例平衡。相反&#xff0c;如何知道了平衡的方法的话&#xff0c;那么人的身体一定可以画好。这次就对于脚的画法进行详细的讲解吧~ 为了画好漫画&#xff0c;人物的脚部往往都是不能避免的部位。虽然脸和上半身可以画得很好&am…

用Paddle自动生成二次元人物头像

用Paddle自动生成二次元人物头像 想画出独一无二的动漫头像吗&#xff1f;不会画也没关系&#xff01;只需要输入一些随机数让卷积神经网络为你画出精致并且独一无二的动漫头像&#xff01; 同时本项目也是绝佳的学习DCGAN的例子&#xff0c;通过趣味解读深入浅出地了解GAN的魔…

【TA】Unity角色二次元风格渲染

NRMToonLitSample Author : 文若 我的Demo地址 &#xff1a; NRMToonLitSample 学习视频地址 &#xff1a; Kerry大佬的 技术美术实战培训课程——卡通人物渲染方案 文章目录 NRMToonLitSample1. 模型贴图基本信息2. 基础渲染效果2.1 基础shader Toon2.2 光照模型效果第一步&am…

Fiora一款二次元的Web多人在线网络聊天系统

源码介绍 Fiora是一款偏二次元的Web多人在线聊天应用&#xff0c;使用Node.js、Mongodb、Socket.io和React编写&#xff0c;使用起来还行&#xff0c;挺简洁的&#xff0c;这里水个搭建教程&#xff0c;有兴趣的可以玩玩。 源码功能 好友&#xff0c;群组&#xff0c;私聊&a…

Unity制作二次元卡通渲染角色材质——1、资源分析

Unity制作二次元材质角色 回到目录 大家好&#xff0c;我是阿赵。 开始制作二次元角色材质之前&#xff0c;我觉得应该是先分析一下&#xff0c;我手上拿到的这个角色模型资源&#xff0c;总共有哪些信息是我们能用的。 所以这篇文章我不会分享具体的Shader&#xff0c;但我感觉…

WPF 3D 贴图: 为你的二次元老婆们做个3D画廊

文章目录 WPF3D系列为你的二次元老婆们做个3D画廊 WPF3D系列 &#x1f48e;WPF 3D初步|源码 新建一个立方体并调整视角相机控制&#xff1a;位置和视角的调节 &#x1f48e;键盘控制|源码&#x1f48e;鼠标控制|源码 &#x1f48e;为你的二次元老婆们做个3D画廊|源码&#x1f…