Opencascade 可视化--创建视图分析(二)

2024-03-26 23:40

本文主要是介绍Opencascade 可视化--创建视图分析(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、创建视图

创建一个Opencascade视图,过程如下:

代码逻辑如下:

Handle(Aspect_DisplayConnectionaDisplayConnection = new Aspect_DisplayConnection();

if (GetGraphicDriver().IsNull())

{

GetGraphicDriver() = new OpenGl_GraphicDriver(aDisplayConnection);

}

--- 创建图形系统驱动

myViewer = new V3d_Viewer(GetGraphicDriver());

myView = myViewer->CreateView();

--- 创建V3d_View

Handle(WNT_Windowwind = new WNT_Window((Aspect_Handlehwnd);

--- 根据已有窗口句柄,创建原生窗口

myView->SetWindow(wind);

---- 捆绑原生窗口

二、源码分析

2.1 创建图形系统OpenGl_GraphDriver

OpenGl_GraphDriver 通过EGL(EGL是地产原生窗口与Khronos渲染API(例如OpenGL ES,OpenVG等)之间的接口)建立OpenGl与原生窗口系统(例如:微软Windows,MacOS,Linux XServer)的联系、创建绘制上下文。OpenGl_GraphDriver的初始化函数(为了便于理解,去掉了一些不关键代码):

Standard_Boolean OpenGl_GraphicDriver::InitContext()

{

myEglDisplay = (Aspect_Display )eglGetDisplay (EGL_DEFAULT_DISPLAY);

------ 建立本地系统和 OpenGL ES 的连接

   EGLint aVerMajor = 0; EGLint aVerMinor = 0;

   eglInitialize ((EGLDisplay )myEglDisplay, &aVerMajor, &aVerMinor)

---- 初始化

   myEglConfig = chooseEglSurfConfig ((EGLDisplay )myEglDisplay);

---- chooseEglSurfConfig对eglChooseChofig进行了封装,作用是确定Surface(绘制区域)

的配置。

   EGLint* anEglCtxAttribs = NULL;

   eglBindAPI (EGL_OPENGL_API) != EGL_TRUE

      ---- 绑定OpenGl

myEglContext = eglCreateContext (myEglDisplay, myEglConfig, EGL_NO_CONTEXT, anEglCtxAttribs);

--- 创建EGL上下文

  myIsOwnContext = Standard_True;

  return Standard_True;

}

2.2 创建视图V3d_View

创建V3d_View的主要逻辑在V3d_View构造函数中,主要做两件事情:1. 调用驱动创建与OpenGl关联的代理子对象Openl_View;2.初始化相机等。

V3d_View构造函数:

V3d_View::V3d_View (const Handle(V3d_Viewer)& theViewer, const V3d_TypeOfView theType)

{

myView = theViewer->Driver()->CreateView (theViewer->StructureManager());

--- 创建OpenGl_View

Handle(Graphic3d_Camera) aCamera = new Graphic3d_Camera();

   aCamera->SetFOVy (45.0);

   aCamera->SetIOD (Graphic3d_Camera::IODType_Relative, 0.05);

   aCamera->SetZFocus (Graphic3d_Camera::FocusType_Relative, 1.0);

   aCamera->SetProjectionType ((theType == V3d_ORTHOGRAPHIC)

     ? Graphic3d_Camera::Projection_Orthographic

    : Graphic3d_Camera::Projection_Perspective);

SetCamera (aCamera);

--- 初始化相机

}

驱动为V3d_View创建代理对象OpenGl_View:

Handle(Graphic3d_CView) OpenGl_GraphicDriver::CreateView

(const Handle(Graphic3d_StructureManager)& theMgr)

{

Handle(OpenGl_View) aView = new OpenGl_View (theMgr, this, myCaps, &myStateCounter);

  myMapOfView.Add (aView);

     ---- 创建OpenGl_View

}

2.3创建原生窗口WNT_Window

比较简单,不在此罗列。

2.4 捆绑原生窗口

捆绑原生窗口,本质上是为其代理子对象OpenGl_View捆绑原生窗口:

void V3d_View::SetWindow (const Handle(Aspect_Window)&  theWindow,

                          const Aspect_RenderingContext theContext)

{

myView->SetWindow (theWindow, theContext);

---- OpenGl_View 设置窗口

......

}

OpenGl_View 捆绑原生窗口主要做3事情:1. 创建一个渲染窗口捆绑原生窗口;2. 创建工作空间;3.初始化纹理环境。

void OpenGl_View::SetWindow (const Handle(Aspect_Window)& theWindow,

                             const Aspect_RenderingContext theContext)

{

myWindow = myDriver->CreateRenderWindow (theWindow, theContext);

--- 创建渲染窗口OpenGl_Window,绑定原生窗口

myWorkspace = new OpenGl_Workspace (this, myWindow);

--- 创建工作空间,OpenGl_Workspace 实现渲染图元、维护状态的方法。

initTextureEnv (myWorkspace->GetGlContext());

--- 初始化纹理环境

}

2.4.1创建一个渲染窗口捆绑原生窗口

Handle(OpenGl_Window) OpenGl_GraphicDriver::CreateRenderWindow

(const Handle(Aspect_Window)&  theWindow,

const Aspect_RenderingContext theContext)

{

 return new OpenGl_Window (this, theWindow, theContext, myCaps, aShareCtx);

}

OpenGl_Window::OpenGl_Window(...)

{

#if defined(HAVE_EGL)

EGLDisplay anEglDisplay = (EGLDisplay )theDriver->getRawGlDisplay();

   EGLContext anEglContext = (EGLContext )theDriver->getRawGlContext();

EGLConfig  anEglConfig  = (EGLConfig  )theDriver->getRawGlConfig();

anEglSurf = eglCreateWindowSurface

(anEglDisplay,

anEglConfig,

(EGLNativeWindowType )myPlatformWindow->NativeHandle(),--- 原生窗口句柄

NULL);

---- 创建屏幕渲染区:EGL窗口

myGlContext = new OpenGl_Context (theCaps))

myGlContext->Init

(

(Aspect_Drawable )anEglSurf,

(Aspect_Display )anEglDisplay,

(Aspect_RenderingContext )anEglContext, isCoreProfile

);

---- 创建OpenGl_Context(OpenGl上下文),并初始化:调用eglMakeCurrent,把EGL 上下设置为当前上下文;调用::glGetString (GL_VENDOR)检查当前OpenGL版本等信息。

Init();

--- 渲染窗口初始化

#endif

}

上下文初始化

OpenGl_Context::init(isCoreProfile)

{

GLint aMajor = 0, aMinor = 0;

     glGetIntegerv (GL_MAJOR_VERSION, &aMajor);

glGetIntegerv (GL_MINOR_VERSION, &aMinor);

...

--- 检索版本,确认当前版本支持情况。

myVendor = (const char* )::glGetString (GL_VENDOR);

--- 检索开发者

glGetIntegerv (GL_CONTEXT_PROFILE_MASK, &aProfile);

glGetIntegerv (GL_MAX_DRAW_BUFFERS,      &myMaxDrawBuffers);

glGetIntegerv (GL_MAX_COLOR_ATTACHMENTS, &myMaxColorAttachments);

glGetIntegerv (GL_MAX_TEXTURE_SIZE, &myMaxTexDim);

glGetIntegerv (GL_MAX_TEXTURE_UNITS, &myMaxTexUnitsFFP);

glGetIntegerv (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &myMaxTexCombined);

glGetIntegerv (GL_MAX_VIEWPORT_DIMS, aMaxVPortSize);

glGetIntegerv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &myAnisoMax);

glGetIntegerv (GL_MAX_SAMPLES, &myMaxMsaaSamples);

glGetIntegerv (GL_MAX_SAMPLES, &myMaxMsaaSamples);

glGetIntegerv (GL_MAX_COLOR_TEXTURE_SAMPLES, &aNbColorSamples);

glGetIntegerv (GL_MAX_DEPTH_TEXTURE_SAMPLES, &aNbDepthSamples);

glGetIntegerv (GL_STEREO, &aStereo);

glGetIntegerv (GL_MAX_CLIP_PLANES, &myMaxClipPlanes);

--- 确定当前OpenGl支持特性

}

渲染窗口初始化

void OpenGl_Window::Init()

{

Activate();

--- 把上下文设为当前上下文

const Standard_Integer aViewport[4] = { 0, 0, myWidth, myHeight };

myGlContext->ResizeViewport (aViewport);

--- 修改视口大小

glDisable (GL_DITHER);

--- 关闭颜色抖动

glDisable (GL_SCISSOR_TEST);

--- 关闭裁剪测试

glMatrixMode (GL_MODELVIEW);

--- 指定GL_MODELVIEW 为当前矩阵

}

2.4.2 创建工作空间

OpenGl_Workspace::OpenGl_Workspace

(OpenGl_View* theView, const Handle(OpenGl_Window)& theWindow)

{

myGlContext = theWindow->GetGlContext()

myGlContext->core11fwd->glPixelStorei (GL_UNPACK_ALIGNMENT, 1);

--- 设置像素对齐方式

myGlContext->core11ffp->glLightModeli ((GLenum )GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

--- 设置光照模式

myGlContext->core11fwd->glHint (GL_POINT_SMOOTH_HINT, GL_FASTEST);

--- 指定反走样点的采样质量

    if (myGlContext->caps->ffpEnable)

    {

        myGlContext->core11fwd->glHint (GL_FOG_HINT, GL_FASTEST);

--- 指定雾化计算的精度

}

myGlContext->core11fwd->glHint (GL_LINE_SMOOTH_HINT,    GL_FASTEST);

--- 指定反走样线段的采样质量

myGlContext->core11fwd->glHint (GL_POLYGON_SMOOTH_HINT, GL_FASTEST);

--- 指定反走样多边形的采样质量

}

这篇关于Opencascade 可视化--创建视图分析(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_43403488/article/details/124896559
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/850249

相关文章

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File