STM32旋转立方体

用STM32F429实现LCD屏幕驱动,显示旋转立方体。不是显示一个动画,而是根据点的坐标实时运算,显示在屏幕上。

要把一个三维坐标进行旋转,可以采用旋转矩阵的方式,旋转矩阵的用途也有很多,在此不一一列举。

以下为对x坐标进行旋转变换,原坐标左乘绕X轴旋转矩阵即可得出旋转之后的坐标,下面三个变换同理。



一个点需要进行三次矩阵点乘,一个正方体一共有8个点。旋转之后再选择一个坐标平面投影显示即可简单实现三维图形旋转变换的效果。

代码如下

以下代码仅仅展示3D立方体显示的计算过程,STM32驱动LCD屏幕等代码就不列举了。
文末有工程下载链接。

因为用到了大量的浮点数运算以及三角函数和矩阵运算,所以使用了ST官方的DSP库来提升运算速度。

#include "3D.h"
#include "bsp_lcd.h"
#include "arm_math.h"//ARM官方的DSP库
#define PI 3.1415926
#define XX 0.05
#define YY 0.05
#define ZZ 0.01float box[8][3]={{-80,-80,-80},{-80,80,-80},{80,80,-80},{80,-80,-80},{-80,-80,80},{-80,80,80},{80,80,80},{80,-80,80}};
float box_dis[8][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
int lineid[]={1,2,2,3,3,4,4,1,5,6,6,7,7,8,8,5,8,4,7,3,6,2,5,1};////arm_dot_prod_f32(pSrcA, pSrcB, 5, &result);点乘
void matconv1(float a[3],float b[3][3],float* out)//使用DSP库计算矩阵点乘
{float res0,res1,res2,aa[3],bb0[3],bb1[3],bb2[3];float bbb[3];for(int i=0;i<3;i++)aa[i]=a[i];for(int i=0;i<3;i++)bb0[i]=b[0][i];for(int i=0;i<3;i++)bb1[i]=b[1][i];for(int i=0;i<3;i++)bb2[i]=b[2][i];arm_dot_prod_f32(aa, bb0, 3, &res0);arm_dot_prod_f32(aa, bb1, 3, &res1);arm_dot_prod_f32(aa, bb2, 3, &res2);out[0]=res0;out[1]=res1;out[2]=res2;
}/*
arm_cos_f32(float32_t x)
arm_sin_f32(float32_t x)
*/
void rotation_matrix(float cube[8][3],float x,float y,float z,float cube_dis[8][3])//计算旋转矩阵并运算
{x/=PI;y/=PI;z/=PI;float cube_m[8][3];float point [8][3];float p[3];//绕三个轴的旋转矩阵float rz[3][3]={{arm_cos_f32(z),-arm_sin_f32(z),0},{arm_sin_f32(z),arm_cos_f32(z), 0},{0  ,     0  ,  1}};float rx[3][3]={{1    ,  0  , 0  },{0,arm_cos_f32(x),-arm_sin_f32(x)},{0,arm_sin_f32(x),arm_cos_f32(x)}};float ry[3][3]={{arm_cos_f32(y),0,arm_sin_f32(y)},{0   ,  1 ,    0},{-arm_sin_f32(y),0,arm_cos_f32(y)}};for(int i=0;i<8;i++){matconv1(cube[i],rx,p);matconv1(p,ry,p);matconv1(p,rz,p);for(int j=0;j<3;j++){point [i][j] = p[j];}}for(int i=0;i<8;i++){for(int j=0;j<3;j++){cube_dis[i][j] = point [i][j];}}
}
void Draw_Cube()//显示旋转正方体
{float x, y, z;x = 0;y = 0;z = 0;//初始化绕三个轴旋转的角度LCD_Clear(LCD_COLOR_BLACK); while(1){x = x + XX;y = y + YY;z = z + ZZ;//每次循环叠加旋转角度rotation_matrix( box, x, y, z,box_dis);//计算旋转矩阵并运算LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);//设置LCD显示颜色LCD_FillRect(100,20,300,300);//刷新用到的区域,刷成黑色,不要用全屏清屏,会卡顿for(int i=0;i<24;i+=2){   LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//设置画线的LCD颜色LCD_DrawLine(240+box_dis[lineid[i]-1][0],160+box_dis[lineid[i]-1][1],240+box_dis[lineid[i+1]-1][0],160+box_dis[lineid[i+1]-1][1]);}HAL_Delay(10);//画完线要显示停留一段时间再到上边去刷新   }
}

GIF帧率太低,实际效果很流畅:

整体工程连接

工程下载

STM32旋转立方体相关推荐

  1. 安卓学习笔记38:利用OpenGL ES绘制旋转立方体

    文章目录 零.学习目标 一.绘制图形基本步骤 二.绘制旋转立方体 (一)运行效果 (二)实现步骤 1.创建安卓应用[DrawRotatingCube] 2.建模:立方体类 - Cube 3.渲染:立方 ...

  2. 用webgl绘制一个彩色旋转立方体

    #用webgl绘制一个旋转立方体 ** 学习交流欢迎加群:789723098,博主会将一些demo整理共享 ** 今天给大家分享一个用webgl写的简单的三维场景:转动的交互式彩色立方体,其六个面的颜 ...

  3. html中3d哪个方向是x轴,详解用CSS绘制3D旋转立方体

    CSS3D旋转立方体绝对是能充分代表这些年CSS发展新高度的典型案例.从一种只是简单的颜色和尺寸渲染的标记符,CSS现在已经变成了一种能够创造出复杂的.具有艺术感染力的视觉效果的编程语言.动画效果的生 ...

  4. OpenGL-绘制旋转立方体

    OpenGL绘制旋转立方体. 编译环境 vs2015+glut 效果图: //By:ZHangFY #include <GL/glut.h>GLfloat rotate_angle1 = ...

  5. iOS OpenGL ES 旋转立方体

    思路 立方体有6个面,由于OpenGL es的特性,每个面只能有两个三角形组成,一个三角形有三个顶点,在不考虑使用顶点索引的情况下,一共需要36个顶点 立方体,需要开启深度测试和光源着色器 旋转立方体 ...

  6. 3d旋转立方体特效,可自由旋转,超强透视效果的html页面源码

    大家好,今天给大家介绍一款,3d旋转立方体特效,可自由旋转,超强透视效果的html页面源码 (图1).送给大家哦,获取方式在本文末尾. 图1 可以用鼠标自由全角度旋转(图2) 图2 代码完整,需要的朋 ...

  7. cube旋转立方体(Qt-OpenGL)

    cube旋转立方体(Qt-OpenGL) opengl坐标系 右手坐标系(Right-handed System) 按照惯例,OpenGL是一个右手坐标系.简单来说,就是正x轴在你的右手边,正y轴朝上 ...

  8. 计算机图形学 | 实验六:旋转立方体

    计算机图形学 | 实验六:旋转立方体 计算机图形学 | 实验六:旋转立方体 Z-缓冲 GLM函数库 PVM矩阵 PVM矩阵的使用 华中科技大学<计算机图形学>课程 MOOC地址:计算机图形 ...

  9. QT OpenGL基础学习——旋转立方体

    第一个QOpenGLWidget程序 学习内容: 1.创建OpenGL窗口: 2.创建并编写着色器程序: 3.为着色器程序装配顶点数据: 4.启动渲染管线进行绘图. 这部分知识我在该博主这里学习的 这 ...

  10. 【181113】C++ 实现可控的3D旋转立方体源代码

    VC++代码实现旋转立方体,没有使用DirectX.OpenGL,允许你拖动滑块改变旋转角度,也能让立方体围绕某一方向旋转,虽然功能不多,但是代码极具参考价值,像这类程序很能考验编程水平. 源码下载地 ...

最新文章

  1. 使用计算机的方式,电脑正确的使用方法
  2. Spring4.3+Webscket 实现聊天、消息推送详解之具体实现(三)
  3. 第一张信用卡,该选哪家的?
  4. 天聪公司研发成功第三代声纹识别算法
  5. 如何使用WindowsPerformanceToolKit对程序进行分析
  6. 如何启用Domino 8 的ODS磁盘结构
  7. HSQLDB数据库使用介绍
  8. C语言实训 --- 仓库管理系统(原代码)
  9. Music Collector Mac破解版——你身边的音乐收藏专家
  10. bootstrap个人简历毕业作品模板
  11. 小学生怎么做PPT?
  12. mo java_mojava和 high sierra系统区别?
  13. android 一个app启动另一个App的几种方法
  14. 手机怎么把证件照缩小到50K以下?手机修改图片大小方法
  15. 看看下边的问题你能够回答出来多少?
  16. 为什么国内搜索不到国外服务器网站?
  17. GStreamer教程-基础教程2:GStreamer概念
  18. RMAN-20005: target database name is ambiguous
  19. sift特征检测与匹配
  20. 如何用Python进行屏幕录制?

热门文章

  1. 北京大学2019年高等代数考研试题
  2. echart 三维可视化地图_ECharts实现三维可视化
  3. MySQL全文索引的坑 20211202
  4. Python 将中文大写数字转为阿拉伯数字
  5. ALFA | 临床基因组课程 人群频率数据库 新成员
  6. ThinkPad T480不拆电脑后盖更换键盘
  7. ORACLE 的 ADD_MONTHS函数常用来计算 上年同期
  8. 微信域名防屏蔽防封系统,轻松微信中域名网站被屏蔽被封的问题
  9. 解决Oracle进入实例账号,练习表的问题
  10. 计算机专业辐射,电脑辐射主要来源在哪——专业实测让你弄个明白