自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(78)
  • 收藏
  • 关注

原创 【gmsh源码阅读】OCC对象绑定tag及获取几何与网格映射关系

打开其代码,发现其原理很简单,就是用OCC提供的对象拓扑遍历类TopExp_Explorer遍历体、面、边、点,给其一个唯一的Tag,并记录到对应的map中。2. 将gmsh作为库使用时,可以用gmsh::model::occ::importShapesNativePointer直接导入。1. gmsh::model::occ::getEntities:获取几何对象的tag及维度。2. gmsh::model::mesh::getNodes:获取几何实体对应的节点。

2024-01-28 21:52:09 611

原创 【OCC学习23】使用Draw探索OCC API 【完结】

1. 在Draw中写Tcl/Tk脚本建模,找出感兴趣的命令2. 查找命令对应的代码有两种方法仅供参考:3. 提取代码到自己应用中

2024-01-25 17:33:56 451

原创 【gmsh源码阅读】gmsh在windows下使用CMake + Visual Studio 2022编译

一直以为gmsh在windows下编译会比较麻烦,尝试一下发现还比较顺利。虽然关闭了OpenMP,一些依赖库没有配置,最终gmsh还是能正常跑起来的。这种编译作为release版本可能不合适,只是用于研究gmsh的原理还是可以的。

2024-01-22 09:43:09 549

原创 【OCC学习22】如何在c++程序中集成OCC Draw的所有命令

写了一段最短的集成OCC Draw命令的Demo,C++程序中可自由地运行Tcl/Tk脚本了。里面的代码都参考OCC Draw中的核心逻辑。

2024-01-22 09:41:19 419 1

原创 【OCC学习21】修改OCC Draw代码实现启动时自动执行pload ALL

Draw在运行时是两个线程协同配合完成的,一个负责命令的执行,一个负责处理用户的输入,将输入变成命令,交给执行线程处理。OCC Draw在启动时可以按需加载需要的命令,不过大部分情况下我是直接执行pload ALL加载所有模块,简单粗暴。但每次都执行感觉很烦,所以直接修改其源码,让其启动时自动执行pload ALL。其原理是定期读取用户输入,如果读到数据就写入console_command,并将console_semaphore标记成HAS_CONSOLE_COMMAND。一、Draw运行流程。

2024-01-13 10:38:55 391

原创 【OpenGL/WebGL】Shader中如何获取摄像机视口的宽高

一般的WebGL或OpenGL开发框架都会将摄像机的投影矩阵传入Shader当中。根据投影矩阵即可获得视口的长宽。在有些需求中,物体的大小是随着摄像机的视口的大小而变化的。如下图中,蓝色小方块,随着不断放大,其大小有个最大值,并不会无限放大。这种实现的原理是在Shader中,不断根据摄像机近平面尺寸大小改变其面片的坐标,让其尺寸有最大值。具体这个视口的长宽怎么影响面片的坐标需要根据具体的需求进行编码。本文只讨论正交相机的视口获取,透视相机的获取稍微复杂一点点。R、L–投影平面左右边界的X坐标。

2023-12-17 22:28:36 181

原创 【Web端CAD/CAE文字标注】webgl+canvas 2d实现文字标注功能

Canvas是HTML5提供的元素,用于在网页上绘制图形,其支持2D与WebGL两种模式。webgl擅长3D交互式图形的渲染,常用于游戏、3D模型、GIS、医学图像等领域。本文介绍的其实是对3D模型的标注,是将3D与2D进行结合,各自实现擅长的事。其核心原理是在网页视图区同时放置两个Canvas,底层canvas使用WebGL,上层canvas使用2d分别绘制,两层canvas叠加实现最终效果。本文介绍如何在WebGL中实现文字的显示,对于如何在OpenGL中实现请绕路。

2023-11-29 10:17:33 402

原创 利用叉积计算向量的旋向及折线段的拐向

折线段的拐向判断方法可以直接由向量叉积的性质推出。均垂直的单位向量,theta是两向量的夹角。由叉积定义,两向量叉积的模是原点o、为边的四边形的面积。叉积一个非常重要的性质是可以通过其模。的符号便可确定折线的拐向。叉积的w长度可以解释成以。为边的平行六面体的体积。

2023-11-22 13:56:50 147

原创 【FastCAE源码阅读9】鼠标框选网格、节点的实现

FastCAE的框选逻辑过于简单,只是demo阶段,实际的CAE软件的拾取逻辑要远比这复杂。

2023-11-14 22:11:30 766

原创 【FastCAE源码阅读8】调用gmsh生成网格

FastCAE使用gmsh进行网格划分,划分的时候直接启动一个新的gmsh进程,个人猜测这么设计是为了规避gmsh的GPL协议风险。

2023-11-13 16:04:07 573

原创 【FastCAE源码阅读7】视图方向切换按钮实现原理

具体的Python代码在Python模块的py文件夹下的MainWindow.py文件中。这几个按钮都是调用的setView方法,只是入参不同而已。发现最后调用vtkRenderer的ResetCamera()方法就实现了适应窗口。其他视图调整是直接操作摄像机,指定其Up轴、位置及焦点实现的。其具体实现只是根据入参不同调用不同的方法。继续跟踪代码,发现setView具体实现在graphWindowBase.cpp文件中。

2023-11-10 22:54:06 372

原创 【FastCAE源码阅读6】C++与Python的集成,实现相互调用

分析FastCAE代码之前先看看C++与Python如何相互调用的。

2023-11-08 14:29:50 274

原创 【FastCAE源码阅读5】使用VTK实现鼠标拾取对象并高亮

其中当拾取模式是点的时候,使用vtkPointPicker,如果拾取成功返回点的id及对应的Actor(一个Actor可能包含多个点)。注意当拾取线的时候,需要提高拾取Tolerance,不然线很难拾取到。另外要注意的是,当拾取线的时候,面Actor是拾取不到的,同样当拾取面的时候,线Actor也是拾取不到。拾取对象是在PropPickerInteractionStyle类实现的,该类是vtkInteractorStyleRubberBandPick的子类,重写原来的鼠标处理函数。拾取对象之后,会发出。

2023-11-06 16:01:29 1078

原创 【FastCAE源码阅读4】VTK OrientationMarkerWidget方向标记组件的使用

SetInteractor:设置鼠标、键盘交互类vtkRenderWindowInteractor的实例,相当于将该组件与外设关联起来。- SetOutlineColor: 该组件支持鼠标移动其位置,移动的时候会有一个边框,这个是设置这个边框的颜色。- InteractiveOff:关闭鼠标交互移动其位置,所以这里设置OutlineColor没用用处。- SetOrientationMarker:控制该组件的样式,是使用箭头还是立方体。- SetViewport:用于设置改组件的位置及大小。

2023-11-06 09:38:41 234

原创 lerna + vite + typescript 多库,多应用共存项目脚手架模板

这个项目使用lerna管理,具体工程打包使用Vite,编译也很简单,三个工程可统一打包,sourcemap、d.ts都有,有需要的拿走不谢。最近想把多个代码仓进行合并,形成一个大的代码仓,需要将各个库以及应用放在一个项目下,统一打包管理。在网上找了一圈,没有找到合适的脚手架模板。

2023-11-03 16:19:13 191

原创 【FastCAE源码阅读3】几何模型显示:从OCC对象到VTK对象

从几何到显示还是比较麻烦的,需要将几何对象转换成渲染对象,设计几何建模、离散化、图形显示,阅读本文需了解一些基本的OCC、VTK编程。

2023-11-03 14:59:38 860

原创 【vtk学习笔记4】基本数据类型

数据对象是数据的集合,数据对象表现的数据是可以被可视化管线处理的数据,只有当数据对象被组织成一种结构后,才能被VTK提供的可视化算法处理。单元类型决定了点集里点的顺序,点的个数是单元是大小Size。拓扑结构描述了对象的构成形式,几何结构表述对象的空间位置关系。VTK里的所有数据结构形式都是从vtkDataObject派生出来,但在实际的应用中,没有直接使用vtkDataObject来实例化数据对象,而是根据具体的可视化数据选用具体的子类实现。属性数据是组织结构数据的补充,可以是空间某点的位移值,温度值等。

2023-11-02 18:13:32 420

原创 【vtk学习笔记3】智能指针

当一个对象的引用数减少到0时,就意味着该对象不再被使用,可以被垃圾收集器回收。如果两个对象互相引用,即使它们都不再被其他对象引用,它们的引用数也不会减少到0。函数MyFunction()的返回值是通过复制的方式,将数据赋予调用的变量,因此改数据的引用计数保持不变,而且函数里的myObject不会被删除。当一个对象不再被引用时,这个对象就可以被系统安全地删除,以便回收其占用的内存空间。VTK中的智能指针类为vtkSmartPointer,继承自vtkSmartPointerBase,可以看到是一个类模板。

2023-10-31 22:54:04 347

原创 【vtk学习笔记2】vtk编程中的基本对象与可视化管线

数据可视化一般需要一个数据源,可以来说具体的算法,如有限元、边界元等,也可以是测量数据,如医学检测数据等。这些基础数据经过变换处理,变成计算机图形流水线支持的数据,最后显示到屏幕上。

2023-10-29 16:56:07 211

原创 【vtk学习笔记1】编译安装vtk9.2.6,运行官方例子

编译的话执行All Build项目,安装需要在INSTALL项目上右键,在弹出菜单上选择“仅用于项目”->“仅生成INSTALL”即可。目前从VTK官网只能下载最新的RC版或者以前的老版本,我是在github上下载的vtk9.2.6 tag版本。主要注意配置VTK安装的路径、是否支持QT,需要的话正确配置Qt5Config.cmake文件所在的路径。将源码下载下来后,在其目录执行cmake-gui,配置vtk的安装目录即可生成VS项目。官网提供了很多例子,包含源码及CMakeLists.txt文件。

2023-10-28 23:33:59 589

原创 【Overload游戏引擎细节分析】PBR材质Shader---完结篇

Overload也提供了这种材料,借助贴图可以实现非常真实的材质效果。下面这个例子的贴图来自LearnOpenGL,大家可以自己去下载。这个PBR Shader整体上与LearnOpenGL中的理论一致,看完LearnOpenGL之后再看这个Shader就比较简单了。PBR基于物理的渲染可以实现更加真实的效果,其Shader值得分析一下。但PBR需要较多的基础知识,不适合不会OpenGL的朋友。顶点着色器基本与standard材质一致,这里就不再分析了,具体可看。二、PBR Shader分析。

2023-10-27 14:05:07 1779 2

原创 【Overload游戏引擎细节分析】standard材质Shader

Blinn-Phong光照模型,又称为Blinn-phong反射模型(Blinn–Phong reflection model)或者 phong 修正模型(modified Phong reflection model),是由 Jim Blinn于 1977 年在文章中对传统 phong 光照模型基础上进行修改提出的。它是一个经验模型,并不完全符合真实世界中的光照现象,但由于实现起来简单方便,并且计算速度和得到的效果都还不错,因此在早期被广泛的使用。Shader是实现材质的核心,下面分析其代码。

2023-10-25 18:28:26 1385 1

原创 【Overload游戏引擎细节分析】Lambert材质Shader分析

Lambert是非常简单的漫反射模型,Shader代码很好理解。

2023-10-21 23:41:46 1662

原创 CMake编译运行VTK官方例子出现:(vtkCommonColor.dll)处引发的异常: 0xC0000005: 读取位置 0x000000DB9B100000 时发生访问冲突

0x00007FFACB4DA7D0 (vtkCommonColor-9.2.dll)处(位于 CylinderExample.exe 中)引发的异常: 0xC0000005: 读取位置 0x000000DB9B100000 时发生访问冲突。原来我配置的VTK库都是release的,在Debug模式下运行会出现这个问题。如果想debug模式运行,请配置vtk debug模式编译出来的d.lib库。这个问题让我很头疼,检查项目配置感觉也没问题。无意间Debug模式切换到Release竟然解决了。

2023-10-20 22:55:47 208

原创 【cmake】cmake生成Visual Studio工程后的INSTALL项目使用

想安装编译产物,需右键INSTALL工程,在弹出的菜单中,选择“仅用于项目”->“仅生成INSTALL”,会安装编译产物。这个INSTALL项目是为安装编译产物,作用类似于make install。其使用与其他工程并不相同。很多开源项目使用CMake生成Visual Studio工程后会有INSTALL项目。今天编译安装VTK,找这个功能半天,希望对大家有帮助。

2023-10-20 22:09:29 941

原创 【Overload游戏引擎细节分析】鼠标键盘控制摄像机原理

Overload的摄像机控制实现在类CameraController中,其有三个个方法HandleCameraPanning、HandleCameraFPSMouse、HandleCameraOrbit、HandleCameraZoom是鼠标控制摄像机的平移、绕自身转动、绕特定点转动、缩放。OvMaths::FVector3::Forward是固定矢量(0,0,1),其与m_cameraRotation相乘获取当前摄像机的Z轴,也叫Forward量,或可称为摄像机的指向。这个函数实现摄像机绕自身原点转动。

2023-10-20 11:00:37 6268 3

原创 OpenGL/WebGL用点绘制有立体感的小球

点默认绘制的是一个正方形,要想变成圆形,需要丢弃一部分像素。本文实现一个将网格绘制成一个个球形,并有一定的立体感特效,希望对大家有帮助。衰减因子可以自己根据距离等规则进行调整。

2023-10-17 10:44:37 265

原创 【Overload游戏引擎细节分析】视图投影矩阵计算与摄像机

本文只罗列公式,不做具体的推导。OpenGL本身没有摄像机(Camera)的概念,但我们为了产品上的需求与编程上的方便,一般会抽象一个摄像机组件。摄像机类似于人眼,可以建立一个本地坐标系。相机的位置是坐标原点,摄像机的朝向Forward是摄像机看的方向,再给定向上的Up轴即可建立本地坐标系。然后,可以通过矩阵将世界坐标系的物体变换到摄像机坐标系中,这个矩阵称为视图矩阵。通过改变摄像机的本地坐标系,可以产生场景漫游的效果。

2023-10-16 11:16:41 1550 1

原创 【Overload游戏引擎细节分析】四元数公式到代码

威廉·汉密尔顿于1843年发明了四元数,作为一种允许对向量进行乘法和除法、旋转和拉伸的方法。四元数是有四个数,由一个标量和一个向量组成的复数。

2023-10-11 18:06:15 125

原创 【Overload游戏引擎细节分析】从视图投影矩阵提取视锥体及overload对视锥体的封装

overoad代码中包含一段有意思的代码,可以从视图投影矩阵逆推出摄像机的视锥体,本文来分析一下原理。

2023-10-08 17:44:03 1534

原创 【Overload游戏引擎细节分析】编辑器对象鼠标拾取原理

先获取以下鼠标位置。先绑定FrameBuffer,使用glReadPixels读取像素,注意图片格式是RGB,跟初始化FrameBuffer进行的设置一致,这些细节都得注意,玄机很多。其实帧缓存的设置都是固定格式的代码,套路基本一样,先用伪代码串一下。Overload使用的是渲染id到纹理,其实现需借助OpenGL的帧缓冲FrameBuffer,所以要先了解一下OpenGL的帧缓冲。Overload中鼠标拾取是先将物体的id渲染到纹理中,根据鼠标位置读取这张图上的对应的像素值,之后解码获取对象的id。

2023-10-07 10:29:44 1499

原创 【Overload游戏引擎细节分析】UBO与SSBO的封装

这里使用到了glUniformBlockBinding函数,这个函数主要是显示指定BUO的索引,可以保证多个不同的Shader程序之间UBO的索引是一样的,但需要在调用glLinkProgram之前调用。由于uniform变量的位置是着色器链接时候产生的,因此它在应用程序中获得的索引会有变化。但在Overload引擎中,调用这个方法是在调用glProgram之后调用的,而且索引值使用的是GetBlockLocation获取的,这也是UBO在Shader的默认索引值,所以这个方法应该是可以删除的。

2023-10-05 18:44:04 926

原创 【Overload游戏引擎细节分析】画场景栅格的Shader分析

从中看出,先将面片平移到视点的前方,使得三角形始终在视锥体范围内,同时将三角形进行缩放,总的尺寸缩放到10000。然后使用m_gridMaterial材质进行绘制。所谓的材质就是Shader的封装。最后再绘制坐标轴的三条线。Overload Editor启动之后,场景视图中有栅格线,这个在很多软件中都有。刚开始我猜测它应该是通过绘制线实现的。阅读代码发现,这个栅格的几何网格只有两个三角形面片组成的正方形,使用特使Shader绘制出来的。

2023-10-04 22:48:58 1793 1

原创 【gmsh源码阅读】边的网格划分流程

在有限元分析中,梁、桁架是一维单元,由线划分而来,同时线的网格划分也是面网格划分的基础。在划分面之前,需要先将其边界换分。如下图,矩形板进行网格划分之前,需要对四个边界进行划分,生成若干节点,以这些节点为基础生成三角形或四边形单元。我们需要了解一段曲线在微分几何中,一般用参数方程来表示,参数有取值范围,0代表曲线的起点,1代表终点。gmsh划分曲线的代码在文件meshGEdge.cpp中实现的,其入口是void meshGEdge::operator()(GEdge *ge)函数。

2023-06-12 22:51:41 988

原创 【gmsh源码阅读】源码阅读环境设置

我的gmsh源码阅读环境是VS Code + Remote SSH配置的。gmsh的编译都在Ubuntu Server上完成的,本地Windows上VSCode阅读代码及调试。2. 本地Windows配置Remote SSH。做完以上配置本地即可debug了。

2023-06-11 22:11:58 379

原创 opencacade.js的使用

opencascade.js是一个很有意思的项目,它将occ通过webassembly技术,使occ能在浏览器端运行。2. 长期存活对象可将其注册到FinalizationRegistry上,等js进行gc的时候自动回调delete。1. 拉去opencascde.js的docker镜像。2. 编写配置文件,指定需要暴露的类,指定emcc的编译参数。4. 在ts或js中初始化模块,参考官方案例。1. 函数局部对象可直接调用delete。

2023-05-12 23:55:00 994 2

原创 WebGL2.0:渲染到纹理

webgl渲染到纹理代码总结

2023-03-04 23:17:38 618

原创 babylon.js源码修改及测试方法

解决编译与测试即可对babylonjs进行定制化开发。

2023-02-28 22:07:19 382

原创 tsconfig.json中files使用正则,VSCode会找不到第三方库类型

解决的办法也很简单。files中指定每个ts文件的相对路径,这样没增加减少一个文件都得修改一次。这么写编译没问题,但使用VSCode的时候,会显示找不到第三方的符号。

2022-11-23 14:21:20 328

原创 OpenGL使用渲染到纹理实现鼠标拾取对象

在设计软件中,常有鼠标拾取对象的功能。其实现有多种方法,本文介绍使用OpenGL离屏渲染实现鼠标拾取的方法。

2022-11-23 12:10:42 898

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除