MFC按方向键旋转立方体线框
Author: W
我想让三维的正方体线框可以通过按键盘方向键旋转起来,我把这个分成两步:一 绘制立方体线框;二 几何变换让其旋 转。

一,绘制立方体线框:

立方体共有六个表面,八个顶点, 每个表面有四个顶点
假定正方体中心位于三维坐标系原点,边长2a
可以写出立方体的顶点表(CP3 P[8],每个点的三维坐标)
可以写出立方体的面表 (每个面的四个顶点对应的索引号 四个面 CFacet F[4],索引号int pIndex[4] )

  1. 在CTestView里添加函数 ReadPoint() 读入立方体点表
    void CTestView::ReadPoint()//点表 { //顶点的三维坐标(x,y,z),立方体边长为2a double a=160.0; P[0].x=-a;P[0].y=-a;P[0].z=-a; P[1].x=+a;P[1].y=-a;P[1].z=-a; P[2].x=+a;P[2].y=+a;P[2].z=-a; P[3].x=-a;P[3].y=+a;P[3].z=-a; P[4].x=-a;P[4].y=-a;P[4].z=+a; P[5].x=+a;P[5].y=-a;P[5].z=+a; P[6].x=+a;P[6].y=+a;P[6].z=+a; P[7].x=-a;P[7].y=+a;P[7].z=+a; }

2.在CTestView里添加函数 ReadFacet() 读入立方体面表

void CTestView::ReadFacet()//面表 { //面的顶点数和面的顶点索引 F[0].pIndex[0]=4; F[0].pIndex[1]=5; F[0].pIndex[2]=6; F[0].pIndex[3]=7;//前面 F[1].pIndex[0]=0; F[1].pIndex[1]=3; F[1].pIndex[2]=2; F[1].pIndex[3]=1;//后面 F[2].pIndex[0]=0; F[2].pIndex[1]=4; F[2].pIndex[2]=7; F[2].pIndex[3]=3;//左面 F[3].pIndex[0]=1; F[3].pIndex[1]=2; F[3].pIndex[2]=6; F[3].pIndex[3]=5;//右面 F[4].pIndex[0]=2; F[4].pIndex[1]=3; F[4].pIndex[2]=7; F[4].pIndex[3]=6;//顶面 F[5].pIndex[0]=0; F[5].pIndex[1]=1; F[5].pIndex[2]=5; F[5].pIndex[3]=4;//底面 }

注:需要在CTestView的构造函数中调用ReadPoint() 和ReadFacet()读入点面和面表

3.在CTestView 里添加DrawGraph() 绘制立方体线框
循环访问立方体的每个表面(for (int nFacet=0;nFacet<6;nFacet++))
顶点循环,根据面的索引号F[nFacet].pIndex 找到每个顶点,对其做二维投影
连接二维投影点,闭合多边形线框

void CTestView::DrawGraph(CDC* pDC)//绘制立方体线框 { CPoint ScreenP[4]; //二维投影点 for(int nFacet=0;nFacet<6;nFacet++)//面循环 { for(int nPoint=0;nPoint<4;nPoint++)//顶点循环 { ScreenP[nPoint].x=P[F[nFacet].pIndex[nPoint]].x; //第nPoint个二维投影点=第nFacet个面的第nPoint个索引号找到的点的横坐标 ScreenP[nPoint].y=P[F[nFacet].pIndex[nPoint]].y; } pDC->MoveTo(ScreenP[0].x,ScreenP[0].y); pDC->LineTo(ScreenP[1].x,ScreenP[1].y); pDC->LineTo(ScreenP[2].x,ScreenP[2].y); pDC->LineTo(ScreenP[3].x,ScreenP[3].y); pDC->LineTo(ScreenP[0].x,ScreenP[0].y);//闭合多边形 } }

4.双缓冲
CTestView类的OnDraw函数调用双缓冲函数DoubleBuffer(),双缓冲函数DoubleBuffer()中调用DrawGraph()函数
向内存中绘制立方体线框模型
void CTestView::DoubleBuffer(CDC* pDC)//双缓冲 { CRect rect;//定义客户区矩形 GetClientRect(&rect);//获得客户区的大小 pDC->SetMapMode(MM_ANISOTROPIC);//pDC自定义坐标系 pDC->SetWindowExt(rect.Width(),rect.Height());//设置窗口范围 pDC->SetViewportExt(rect.Width(),-rect.Height());//设置视区范围,x轴水平向右,y轴垂直向上 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//客户区中心为原点 CDC memDC;//内存DC memDC.CreateCompatibleDC(pDC);//创建一个与显示pDC兼容的内存memDC CBitmap NewBitmap,*pOldBitmap;//内存中承载的临时位图 NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图 pOldBitmap=memDC.SelectObject(&NewBitmap);//将兼容位图选入memDC memDC.FillSolidRect(rect,pDC->GetBkColor());//按原来背景填充客户区,否则是黑色 memDC.SetMapMode(MM_ANISOTROPIC);//memDC自定义坐标系 memDC.SetWindowExt(rect.Width(),rect.Height()); memDC.SetViewportExt(rect.Width(),-rect.Height()); memDC.SetViewportOrg(rect.Width()/2,rect.Height()/2); rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); DrawGraph(&memDC);//向memDC绘制图形 pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);//将内存memDC中的位图拷贝到显示pDC中 memDC.SelectObject(pOldBitmap);//恢复位图 NewBitmap.DeleteObject();//删除位图 memDC.DeleteDC();//删除memDC }

二,通过键盘方向键旋转立方体
由于使用了双缓冲,因此程序支持动画和交互操作
向CTestView添加WM_KEYDOWN的消息映射函数OnKeyDown后 使用三维几何变换实现绕x轴和绕y轴的旋转
需要添加三维变换类CTransform3
需要在CTestView头文件里添加一个CTransform3类的对象tran 通过对象调用成员函数
需要在CTestView的构造函数中对绕x轴和y轴的旋转角Alpha Bate初始化为0,同时调用CTransform3类的对象tran的函数SetMatrix(CP3,ptNumber) tran.SetMatrix(P,8);把顶点坐标和顶点个数传给CTransform3类
在消息映射函数OnKeyDown中 调用tran.RotateX(Alpha) 和 tran.RotateX(Bate) 实现不同按键下不同方向的变换

MFC按方向键旋转立方体线框相关推荐

  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. jquery改变css,改变style
  2. PHP连接mysql数据库
  3. 在sqlplus中操作blob和clob
  4. UVA10843——Anne\'s game
  5. Jmeter 使用脚本 生成html测试报告
  6. “双十一”Guitar Pro 带你高姿态过光棍节
  7. [BZOJ2118] 墨墨的等式(最短路)
  8. 网络安全系统性学习路线「全文字详细介绍」
  9. 3个极品在线PDF转换成WORD服务网站,比软件给力!
  10. android车载导航测试,嘟嘟车心安卓车载导航开箱体验
  11. LED透明屏为什么能透明?实现原理
  12. unity3d 地面印花_Unity3D 中的贴花效果
  13. LeCo-83.删除排序链表中的重复元素
  14. uniapp上下滑屏切换支持视频和图片轮播实现,类似抖音效果
  15. 【笔记】python中常见的函数(一)
  16. Bakkt能否开启下一轮牛市?这篇「Bakkt专访」一窥究竟
  17. android之壁纸相关
  18. 深度讲解linux中strstr()函数
  19. loadrunner压测过程常出现错误和处理方法
  20. I5 4590 台式机安装黑苹果再次入坑记(2019.12.23)

热门文章

  1. 云计算的运营方式有这三种
  2. 基于图书管理系统的需求分析之可行性分析安全需求分析系统需求分析
  3. 搜狗商业数据库自动化运维平台
  4. 机器学习-基于Logistic回归和Sigmoid函数的分类
  5. flag计算机领域的意思,flag是什么意思
  6. PLC系统调试的步骤
  7. 暑期实践第二十九天 2022-8-1
  8. 如何剪裁证件照大小?2寸证件照片怎么制作?
  9. 快速开发大热风潮之下 这免费的羊毛不来薅薅?
  10. 电脑开机自检怎么取消