1.用Python和OpenGL探索数据可视化(三维篇)- 创建三维坐标轴类和立方体类
2.三维力导向图绘制(1)—假·三维力导向图
3.科学可视化软件介绍 – Polyscope
4.诚心求助朋友教我用VB绘画 三维立体图形
用Python和OpenGL探索数据可视化(三维篇)- 创建三维坐标轴类和立方体类
本系列文章讲解使用Python与OpenGL 4.5进行数据可视化开发,确保您的制源计算机支持OpenGL 4.5版本,建议阅读《准备工作(一)Windows下检测显卡和OpenGL信息》以确认兼容性。绘制继续参阅《准备工作(二)配置Windows下VS Code + Python + OpenGL开发环境》以完成所需开发环境的源码设置。
上一节我们通过立方体学习了OpenGL的维图变换矩阵与模型矩阵。紧接着在《用Python和OpenGL探索数据可视化(三维篇)- 你好,制源-127源码坐标轴》一节中我们绘制了三维坐标轴。绘制立方体与坐标轴是源码三维图形绘制中常见的元素,因此我们将在本节中通过代码重构将它们转化为专门类,维图以便后续的制源重复使用。
开始VS Code,绘制使用File菜单下的源码“Open Folder”功能,打开D:\pydev\pygl并进入common文件夹,维图新建一个名为shaders的制源子文件夹。将basic文件夹下的绘制shaders子文件夹中的axes.vs、axes.fs、cube.vs、linux内核virtio源码cube.fs文件复制至common文件夹的shaders文件夹。
在common文件夹中新建axeshelper.py文件,并在其中输入相应代码。同样地,创建cube.py文件并输入对应代码。接着,在common文件夹中建立__init__.py文件,并在其中输入必要的代码。
在basic文件夹中新建一个名为cube_app_v1.py的文件,并在其中输入相应的代码。点击VS Code右上角的三角形图标以运行代码,此时会呈现预期的结果。
借助坐标轴的辅助,图形变换变得清晰且有趣。通过本系列文章中的源代码资源,您可以进一步探索和实践Python与OpenGL的苹果手机源码模仿数据可视化开发。
参考系列文章:1.《用Python和OpenGL探索数据可视化(基础篇)- 你好,窗口!》;2.《用Python和OpenGL探索数据可视化(基础篇)- 你好,OpenGL!》;3.《用Python和OpenGL探索数据可视化(基础篇)- 你好,ImGui!》;4.《用Python和OpenGL探索数据可视化(基础篇)- 你好,小不点!》;5.《用Python和OpenGL探索数据可视化(基础篇)- 重构代码“你好,小不点!”》;6.《用Python和OpenGL探索数据可视化(基础篇)- “你好,线段!”》;7.《用Python和OpenGL探索数据可视化(基础篇)- 重构代码组织OpenGL核心对象包pygl》;8.《用Python和OpenGL探索数据可视化(基础篇)- 你好,三角形!》;9.《用Python和OpenGL探索数据可视化(基础篇)- 改进OpenGL程序Program类》;.《用Python和OpenGL探索数据可视化(基础篇)- 你好,矩形!ub账号源码》;.《用Python和OpenGL探索数据可视化(基础篇)- 完善pygl增加索引缓存对象EBO》;.《用Python和OpenGL探索数据可视化(基础篇)- 你好,纹理!》;.《用Python和OpenGL探索数据可视化(基础篇)- 完善pygl增加OpenGL二维纹理对象》;.《用Python和OpenGL探索数据可视化(基础篇)- 细说纹理环绕》;.《用Python和OpenGL探索数据可视化(基础篇)- 细说纹理过滤》;.《用Python和OpenGL探索数据可视化(基础篇)- 处理键盘和鼠标事件》;.《用Python和OpenGL探索数据可视化(三维篇)- 你好,坐标轴》;.《用Python和OpenGL探索数据可视化(三维篇)- 用立方体体验模型矩阵》。
三维力导向图绘制(1)—假·三维力导向图
本周实现了一个三维的力导向图。总结绘制方法如下。
力导向图对数据可视化人员并不陌生,例如在echarts示例中:
echarts.baidu.com/examp...
力导向图有以下特点:
echarts示例中仅配置了“斥力”参数,而d3示例则可自定义画面中心位置和力量衰减系数。然而,随着关系复杂度的增加,节点间的连线易交叉,观感不佳。为了改善这一情况,我构想了三维力导向图。尽管echarts新版本提供了三维关系图,拉高建仓源码大全但不支持拖拽或旋转,渲染效果欠佳,因此决定自造一个轮子。
接下来,让我们回顾二维力导向图的实现。以d3为例:
创建模拟并绑定数据后,数据发生了变化:
console.log(nodes[0])
console.log(edges[0])
原始数据新增了几个属性,其意义清晰。这些属性值实时更新,在数据绑定后开始模拟。tick事件绑定的回调函数会在每次属性更新时被调用,此时可根据属性值调整图形位置,类比于模型与视图的关系。
了解d3的力导向图原理后,我们发现它提供了一个力学模拟器用于计算位置,而画面渲染可使用其他方式。因此,我们修改渲染方式为three.js。
此修改后,已能显示三维画面。当前功能仅支持展示,暂无拖拽功能。
为支持拖拽,需研究二维拖拽实现方法。图形节点的fx、fy属性表示固定位置,在计算布局时优先于普通坐标,模拟器仅更新x/y坐标,故可利用fx/fy坐标强制定位。
三维视图中,需让节点球体支持拖拽。一个方法是引入DragControls插件,THREE的拖拽插件,用于节点操作。此外,还需引入TrackballControls用于三维视角查看。创建控件,处理DragControls的拖拽事件,更新TrackballControls。至此,实现可正常拖拽的假·三维力导向图。
至此,二维力导向图改造为三维完成。可任意变换相机视角,支持拖拽,但所有节点和边实质上仍在一个平面内。后续文章将讲解制作真·三维力导向图的方法。
源码链接:
运行示例:
科学可视化软件介绍 – Polyscope
Polyscope
Polyscope是一个轻量级通用三维可视化库、数据查看器和用户交互界面。它适用于三维数据,如网格和点云等。通过编程方式首先注册数据,然后即可通过编程或动态图形用户界面快速生成信息丰富、美观的可视化图形。
Polyscope官网地址:polyscope.run
GitHub源代码地址:github.com/nmwsharp/pol...
Polyscope于年3月首次发布到开源社区,最新的版本是年1月发布的v2.1.0。
使用Python语言时,可通过pip命令安装Polyscope:pip install Polyscope
以下是一些Polyscope提供的可视化截图和案例,供参考:polyscope.run
观看两小段体绘制切面的视频:此处省略链接
了解更多科学可视化软件,可参考以下系列文章:《科学可视化软件介绍 – VisIt》、《科学可视化软件介绍 – Inviwo》等。
Polyscope官网提供详细的文档和教程,可帮助用户快速上手。更多关于Polyscope的信息和案例,请访问官网:polyscope.run
诚心求助朋友教我用VB绘画 三维立体图形
vb里绘制线框的立体图形很简单,用到投影算法即可。
所谓投影算法就是把三维空间里的xyz映射成xy的一种方法,网上查一下“投影算法”关键字就能找到公式。
比如场景里有八个点,它们都各自有xyz坐标,在投影成xy以后,再按照一定顺序用Line连接线即可。再结合上Sin和Cos还能让图形旋转。但一般来说我们习惯的三维图像还涉及光、颜色、纹理填充,这就比较麻烦了。还得有消隐算法……
总之如果打算自己弄得化很复杂,想提高运算效率建议学习一下 DirectX SDK,有VB版的。
3D投影2D计算公式是这样的
P( f ):(x, y, z)==>( f*x / z + XOrigin, f*y / z + YOrigin )
其中f是“焦点距离”,它表示从观察者到屏幕的距离,一般在到之间。XOrigin和YOrigin是屏幕中心的坐标。
再给你些对与3D旋转和缩放的矩阵,矩阵转化成公式即可。
二维坐标系公式。
二维笛卡儿坐标系的平移等式。
t( tx, ty ): ( x, y ) ==> ( x + tx, y + ty )
二维笛卡儿坐标系的缩放等式。
s( k ): ( x, y ) ==> ( kx, ky )
旋转等式:
r( q ): ( x, y ) ==> ( x cos(q) - y sin(q), x sin(q) + y cos(q) )
三维坐标系公式。
平移公式:
t( tx, ty, tz ): ( x, y, z ) ==> ( x + tx, y + ty, z + tz )
平移(tx, ty, tz)的矩阵
| 1 0 0 0 |
| 0 1 0 0 |
| 0 0 1 0 |
| tx ty tz 1 |
缩放公式:
s( k ): ( x, y, z ) ==> ( kx, ky, kz )
缩放(sx, sy, sz)的矩阵
| sx 0 0 0 |
| 0 sy 0 0 |
| 0 0 sz 0 |
| 0 0 0 1 |
旋转公式(围绕Z轴):
r( q ): ( x, y, z ) ==> ( x cos(q) - y sin(q), x sin(q) + y cos(q), z )
绕X轴旋转角q的矩阵
| 1 0 0 0 |
| 0 cos(q) sin(q) 0 |
| 0 -sin(q) cos(q) 0 |
| 0 0 0 1 |
绕Y轴旋转角q的矩阵:
| cos(q) 0 -sin(q) 0 |
| 0 1 0 0 |
| sin(q) 0 cos(q) 0 |
| 0 0 0 1 |
绕Z轴旋转角q的矩阵:
| cos(q) sin(q) 0 0 |
|-sin(q) cos(q) 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |