1.用Python和OpenGL探索数据可视化(三维篇)- 创建三维坐标轴类和立方体类
2.Directx11/12添加imgui踩坑记
3.imgui适合界面开发吗 imgui是码解什么
4.Qt的替代方案分析(持续更新)
5.Unity IMGUI TreeView简单探索(一)
6.OpenGL学习之旅(6)---imgui库使用
用Python和OpenGL探索数据可视化(三维篇)- 创建三维坐标轴类和立方体类
本系列文章讲解使用Python与OpenGL 4.5进行数据可视化开发,确保您的码解计算机支持OpenGL 4.5版本,建议阅读《准备工作(一)Windows下检测显卡和OpenGL信息》以确认兼容性。码解继续参阅《准备工作(二)配置Windows下VS Code + Python + OpenGL开发环境》以完成所需开发环境的码解设置。
上一节我们通过立方体学习了OpenGL的码解变换矩阵与模型矩阵。紧接着在《用Python和OpenGL探索数据可视化(三维篇)- 你好,码解股票涨停前的信号源码坐标轴》一节中我们绘制了三维坐标轴。码解立方体与坐标轴是码解三维图形绘制中常见的元素,因此我们将在本节中通过代码重构将它们转化为专门类,码解以便后续的码解重复使用。
开始VS Code,码解使用File菜单下的码解“Open Folder”功能,打开D:\pydev\pygl并进入common文件夹,码解新建一个名为shaders的码解子文件夹。将basic文件夹下的码解shaders子文件夹中的axes.vs、axes.fs、cube.vs、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探索数据可视化(基础篇)- 你好,矩形!》;.《用Python和OpenGL探索数据可视化(基础篇)- 完善pygl增加索引缓存对象EBO》;.《用Python和OpenGL探索数据可视化(基础篇)- 你好,纹理!》;.《用Python和OpenGL探索数据可视化(基础篇)- 完善pygl增加OpenGL二维纹理对象》;.《用Python和OpenGL探索数据可视化(基础篇)- 细说纹理环绕》;.《用Python和OpenGL探索数据可视化(基础篇)- 细说纹理过滤》;.《用Python和OpenGL探索数据可视化(基础篇)- 处理键盘和鼠标事件》;.《用Python和OpenGL探索数据可视化(三维篇)- 你好,坐标轴》;.《用Python和OpenGL探索数据可视化(三维篇)- 用立方体体验模型矩阵》。
Directx/添加imgui踩坑记
尝试在DX/中集成ImGui,经过一番摸索后终于搞定,现将遇到的坑点整理如下:
在DX上添加ImGui,首先需要下载ImGui源码,确保包含必要的头文件。在D3DApp.h中添加相应的附加include和头文件。之后,让ImGui能够处理窗口消息,参考官方样例添加代码,确保在初始化ImGui后调用。将ImGui的初始化代码放置在D3DCreateDevice执行之后,避免因找不到Device而引发错误。在GameApp.cpp的DrawScene方法中绘制ImGui界面,完成基本集成。
运行后可能会遇到未解析的外部符号、错误代码等问题,解决方法是确保ImGui文件与项目一起被编译,将ImGui文件添加到项目中即可。
对于将ImGui代码放入GameApp.cpp或D3DApp.cpp中的差异,虽然两者均能正常运行,但将代码放入D3DApp.cpp中时可能会出现闪烁现象,具体原因尚不明了,期待高手解答。
在成功搞定DX后,DX的集成变得相对简单。初始代码基于DX龙书第6章绘制盒子的示例进行调整。步骤与DX类似,关键在于确保ImGui与设备上下文的正确交互,以及对mSrvHeap的恰当处理。
整体集成工作花费时间不多,关键在于理解ImGui与底层渲染框架的交互机制。所有涉及的代码修改和优化结果已整理至特定仓库中,方便后续参考。
此外,推荐观看某油管up主关于ImGui原理及在DX中集成的视频教程,该视频已翻译并上传至B站,虚警概率源码对深入理解ImGui的使用和原理提供了宝贵指导。
imgui适合界面开发吗 imgui是什么
适合。ImGUI又称为Dear ImGui,它是与平台无关的C++轻量级跨平台图形界面库,没有任何第三方依赖,可以将ImGUI的源码直接加到项目中使用,也可以编译成dll。ImGUI使用DX或者OpenGL进行界面渲染,对于画面质量要求较高。
Qt的替代方案分析(持续更新)
尽管Qt在C++开发中扮演着重要的角色,尤其在解决跨平台难题上表现出色,提供了一站式的前端和后端工具,但并非所有情况下都必须依赖它。对于C++初学者,Qt确实能作为入门捷径,其源码和例程展示了高水准的编程规范,但长期使用后,可能需要寻找替代品以提升自身技能或应对特定场景。
选择替代Qt的库时,应考虑图像界面库的需求。除了Qt,还有Chromium Embedded Framework、CEGUI、Enlightenment、FLTK、GTK、Ultimate++、wxWidgets和imgui等选择。对于hybrid架构,electron、flutter和Compose Multiplatform Framework也是选项。然而,最佳选择并非固定,技术选型需依据实际成本和场景需求,如桌面应用、移动应用、云端内容展示、实时通信等。
Qt确实能覆盖多种场景,如桌面应用的UI设计、高刷新率的移动应用、云端内容驱动的界面等,但针对不同项目类型,如专注于特定平台或特定功能的筹码估值源码团队,可能有其他更适合的库。例如,对于嵌入式开发,Qt的跨平台能力可能显得过于庞大。
随着技术的不断发展,Qt之外的选项也在增多,如Dear ImGui,它可能在某些场景下成为Qt的有力竞争者。Qt与C++的紧密结合使其难以被替代,但随着市场和技术的变化,开发者需要灵活选择以适应不断变化的需求。
Unity IMGUI TreeView简单探索(一)
因为感觉可能即将要用上了,因为我想做个魔兽地图编辑器触发编辑器的那种树状的编辑器,但并不是完全照搬,就是参考一下树的结构。
因为那个对话框我没找到有啥接口,能让它挡住整个界面的输入,除非它关闭,我又不想在EditorWindow里自己另外实现一个嵌套窗口,嗯,所以做点妥协。参数也在树结构里好了。
这篇文章就简单记录一下简单探索的得到的内容,在寻找解决问题的路上努力,以及最后自我麻痹的过程吧。
首先需要继承TreeView这个类才能进行开始,那个TreeViewState直接new就行。
搞定之后调用一遍Reload。然后你在Window的OnGUI那边提供Rect参数并调用它的绘制方法就好啦!
在那之前你的类必须实现BuildRoot方法,在你搞定之后调用一下SetupParentsAndChildrenFromDepths这个方法,它的作用是根据depth关系去设定节点(TreeViewItem)之间的父子关系。
与之对应的还有SetupDepthsFromParentsAndChildren,根据depth设定父子关系,具体情况具体使用了。
另外,不管是Reload还是打开关闭折叠,都会去调用BuildRows。区别就是前者连BuildRoot也会调用BuildRows是根据Root去生成一个List给TreeView使用用作画面渲染,每当结构发生改变的时候,都得重新构造一遍。
所以当你Add或者Remove等导致树结构发生改变的时候,直接调用Reload,不要有心理负担。短信源码解析
我去看过源码,直接调用TreeViewItem的AddChild方法在显示方面上是会有出问题的,你还得去处理层级问题,以及调用它的SetExpanded false然后true。因为你不调用的话,他就不会刷新结构,你新加的节点他就会看不见。至少我觉得挺离谱的,说不定我误解了他的设计也说不定。关键的东西全给private或internal了,也没看到接口放出来(如果有大佬知道的话可以告诉我一下呀,反射就免了!)
你可能在想,我可以直接调用BuildRows呀!没用的,TreeView内部的那个controller还是dataSource根本就没同步到,在下一帧就会报错。
无论你怎么改通过GetRows拿到的列表的结构也没屁用。还是老老实实像官方一样直接粗暴的Reload。(如果有更好的方法谁愿意这么干呢?)
说实话我只是不想因为层级变动就直接重新生成整个结构,或者你直接将list缓存起来,判断一下啥也不做也行,但我强迫症犯了。
我浪费了很多时间去寻找解决方案,最后还是放弃了。最后打算参考官方的那个TreeViewWithTreeModel的做法。
反正本来就是为了给某些结构做可视化显示嘛…就用这些理由麻痹自己钻牛角尖的心吧。
基本上一些基础的使用光是看文档或者官方示例就能明白要怎么用了,所以我有点懒得写…
诸如改名操作,拖拽操作,双击项,右键项(Context,一般拿来弹个ContextMenu用)
增(TreeViewItem.AddChild)删(TreeViewItem.children.Remove)查(TreeView.FindItem FindRows)改啊啥的…
简单随便看两眼,有需要再去查文档,没必要全部硬塞进去。有空就看看官方怎么做的好了,先有点本事了能用得起来,以后再追求那些。
官网的阅读案例顺序比较推荐从
Simple Tree Window
Transform Hierarchy
Custom Row Heights
Multi Columns
看起
先看他们的window看个大概,再有啥想知道的不懂的看view的实现。
以上我说到的那些,诸如“下一帧”的这些全是我主观看法,没去验证,酌情阅读吧。
如果有什么更好的方法也希望有大佬能够指出来,感激不尽。
(百度了大半年搜的文章全部都避开了RemoveChild和AddChild来写,很棒~)
(另外预览怎么把我的排版全干掉了……?罢了)
OpenGL学习之旅(6)---imgui库使用
在OpenGL学习之旅的第六部分,我们将探索如何将imgui库集成到我们的项目中,为OpenGL程序增添交互性。首先,我们从GitHub上克隆imgui库的源码,并确保将其编译成动态库以便于链接至可执行程序。在CMakeLists.txt文件中,我们需添加编译imgui库中源文件的路径,同时确保链接到glfw库和opengl库。
在我们的main函数中,包含imgui头文件后,我们进行初始化。随后,在渲染循环中创建imgui窗口帧,并显示默认窗口。在渲染部分,我们需要更新imgui窗口,以实现动态交互。最后,在程序结束时释放imgui资源。
通过imgui窗口,我们可以动态调试3D空间变换。首先定义用于动态调试的变量,如旋转轴和旋转角度,以及平移向量,用于调整透视投影变换中的视场角。在渲染循环中,将这些变量添加至imgui窗口中,以便用户能够实时观察3D变换效果。运行程序后,用户能够通过调节参数,如帧率,动态观察3D空间变换。
本文总结了使用imgui进行动态调试参数的流程,并提供了main.cpp与CMakeLists.txt的完整源码。
UE5使用Slate进行UI开发与编辑器拓展(一):Slate简介
深入了解UE的Slate框架,其设计哲学旨在解决现有UI框架的局限性,旨在为开发人员提供更为灵活、高效、且无需学习额外语言的解决方案。Slate旨在实现简化UI开发与编辑器拓展的目标,其设计基于MVC架构,允许开发者直接通过Widget(视图)与Model(模型)的绑定来更新View(视图),从而减少对传统的Controller(控制器)的依赖。这一设计允许Widget在自身功能中同时扮演View和Control的角色,提高了开发效率。
Slate的另一个关键优势在于它不需要程序员学习额外的语言,而是直接使用C++进行编程,这在一定程度上对编程习惯而言是一种便利。对于不倾向于学习描述UI的脚本语言的开发者而言,这是一项显著的优势。
对比IMGUI(ImGui),一个广受开发者喜爱的可视化调试UI框架,Slate提供了更为全面的支持,不仅适合作为游戏中的UI框架,也能够为编辑器提供支持,满足不同场景的需求。IMGUI以其简洁的界面、强大的功能和易用性著称,特别适合于快速原型制作和开发团队的协作,但其在视觉表现和游戏性能方面的局限性使其难以满足所有场景的需求。Slate在性能上具有优势,特别是在底层框架中,这一点对于游戏开发尤为重要。
在准备Slate的学习环境时,需要下载源码版的UE引擎,并创建一个特定的项目,例如命名为"SlateLearning"的程序。通过全局替换文件名和内容,以及运行相关生成脚本,可以设置好开发环境。使用集成开发环境(IDE)如Rider或Visual Studio打开项目文件,即可开始在干净且高效的工作环境中学习和使用Slate。
至此,Slate的学习环境已准备完毕,接下来可以着手深入探索Slate的特性和功能,开启UE UI开发与编辑器拓展的学习之旅。
Piccolo引擎源码笔记-反射系统
反思系统在游戏引擎中的应用与实现
在游戏开发中,反射系统提供了一种强大的机制,允许程序在运行时获取和修改对象的属性和行为。它在引擎中主要实现两点:一是展示游戏对象的组件及其属性;二是通过键盘编辑改变值,直接作用于游戏,无需重新编译。这一机制有助于开发者进行无缝的组件管理与调试。
在实现中,游戏引擎通过自动生成的反射文件来描述游戏对象的组件信息。以Transform组件为例,该文件详细记录了位置、缩放、旋转等信息及其对应字段名。这些信息组织为类函数、字段函数、方法函数和数组函数的元组,方便进行封装和调用。
实现过程涉及多个模块的协同工作,包括序列化、资源加载与ImGui等。序列化模块通过模板函数实现对各种数据类型的读取,而资源加载模块负责管理关卡中对象的加载过程。在加载过程中,通过反射系统读取组件信息,并通过映射函数将其与对应的类函数关联。这使得组件的序列化和反序列化过程得以实现。
在编辑器部分,通过Tick驱动的机制,引擎实时更新游戏状态。编辑器通过获取当前选中对象及其组件信息,利用反射系统直接操作组件的属性,实现字段的实时修改与应用。这种机制避免了繁琐的重新编译过程,极大地提高了开发效率。
在处理编辑器中的字段修改时,通过反射系统提供的功能,开发者可以直接在编辑器中通过键盘输入修改字段值。这一过程不涉及事件机制的调用,而是通过直接修改对象的字段实现。通过将字段值传递给ImGui::InputFloat()函数,实现字段值的实时更新与显示。这一实现方式简化了编辑器的使用流程,提高了开发效率。
总的来说,游戏引擎中的反射系统通过封装组件信息、实现组件属性的动态获取与修改,为开发者提供了一种高效、灵活的组件管理机制。结合序列化、资源加载与编辑器等模块,形成了一个完整的动态调整与管理游戏对象与组件的框架。通过反思系统,开发者可以更专注于游戏逻辑与创意的实现,而将组件管理与调试等任务交由引擎自动处理,从而提升开发效率与游戏质量。
用Python和OpenGL探索数据可视化(实践篇)- 三维动力学曲线数据可视化
在科学和工程领域,探索动力学问题时,数据可视化成为关键。研究对象随时间变化的状态,需要记录、处理大量物理量,通过建立数学模型,预测未来状态。数据以二维或三维曲线形式可视化,便于理解整体趋势和差异。洛伦兹吸引子,由爱德华·洛伦兹研究气候问题发现,是著名的三维动力学曲线之一,常被称为“蝴蝶效应”。在本文中,我们将利用Python和OpenGL探索洛伦兹吸引子的可视化。
洛伦兹吸引子由复杂的数学公式生成,显示在三维空间中的曲线形状类似蝴蝶翅膀。洛伦兹在年的研究文章中指出,对于具有有界解的系统,非周期解对于小修改通常不稳定,导致初始状态差异迅速扩大。文章中的公式产生“蝴蝶效应”的视觉形象,洛伦兹吸引子因此得名。
为了使用OpenGL绘制洛伦兹吸引子,首先需要准备支持OpenGL 4.5的电脑环境。设置Windows下的开发环境,包括VS Code、Python和OpenGL的相关配置。在shaders子文件夹下创建着色器文件(.vs和.fs),分别负责顶点着色和片段着色。编写代码定义着色器逻辑,包括选择参数值以匹配洛伦兹论文中的原始数据。
利用Python进行计算,定义两个初始状态接近的点,使用洛伦兹方程逐步绘制曲线轨迹。轨迹以球体表示,蓝色和绿色分别代表两条曲线。开始时,两条曲线几乎重叠,仅显示一个蓝色球。随着轨迹的展开,曲线开始分离,显现为两个球体。通过鼠标操作,可以旋转、放大、缩小洛伦兹吸引子,以及隐藏或显示坐标轴和网格。任意时刻点击重置,可恢复初始设置。
代码实现过程涉及多个文件,包括shaders、lorenz.py和main.py等,具体代码不在此处列出。源代码已上传至Gitee仓库,读者可访问查阅。此外,一系列文章提供了从基础到实践的逐步指导,覆盖Python和OpenGL的数据可视化开发,包括窗口、OpenGL、ImGui、小不点、三角形、矩形、纹理、键盘和鼠标事件、坐标轴、立方体、照相机、光照模型、地球模型等主题。通过这些资源,可以系统地学习和实践数据可视化的开发。
2024-11-30 11:11
2024-11-30 10:44
2024-11-30 10:08
2024-11-30 09:42
2024-11-30 09:22
2024-11-30 09:15