计算机图形学OpenGL笔记

server/2024/9/23 7:32:15/

来自公众号:可计算离散整体几何结构

《可计算离散整体几何结构》(可视化)实验室出品
2.4.组合显示模式
2.4.1.组合模式基础
根据几种基本的显示模式,可以组合起来显示出更复杂的其他显示效
果。从而得到更多变的结果。组合的显示模式只需要调用相应的基本
显示模式函数,而不需要重写原来基本的显示代码。
在三维模型线条显示的时候,常常需要把线条设置为黑色或者灰色,
这样就可以更加清楚的显示线条。设置为黑色的代码如下所示:
public void DrawDarkWireFrame(TriMesh mesh)
GL.Polygonlode (laterialFace.FrontAndBack, Polygonllode.Line)
GL.LineWidth(GlobalSetting.DisplaySetting.LineWidth):
GL.Enable(EnableCap.CullFace):
OpenTK,Graphics,Color4 color = new OpenTK,Graphics.Color4(0.0f, 0.0f, 0.0f, 0. 0f).
OpenGLManager.Instance.SetColor(color):
DrawTriangles(mesh):
设置为灰色的代码如下所示:
public void DrawWireFrameGray(Trilesh mesh)
GL.Polygonode(MaterialFace.FrontAndBack, Polygonlode.Line):
GL.LineWidth(GlobalSetting.DisplaySetting.LineWidth):
o.,E12DLee1aD
2.21,C111F208
OpenGLlanager.Instance.SetColor (GlobalSetting.DisplaySetting.WifeFrameColor);
DrawTriangles(mesh):
两种颜色的效果图分别如下图所示:
黑色
灰色
0
1
图2-16:黑色和灰色线条效果
2.4.2.光滑面线条显示
光滑的线条(SmoothHiddenLine)显示是一种常见的显示方法。这样
的显示即可以看清楚三维模型的形状,也可以看到三维模型的点线面
构成。这种显示方法是把光滑面显示和线条显示两者组合起来得到的
显示效果。针对Flat,Smooth两种光滑面的渲染,分别有两种光滑
面线条显示组合方式。代码如下所示:
public void DrawSmoothHiddenLine(Trilesh mesh)
GL.Enable(EnableCap.PolygonOffsetFil1):
DrawSmoothShaded(mesh):
DrawWireFrameDark(mesh):
GL.Disable(EnableCap.PolygonOffsetFill):
public void DrawFlatHiddenLine(TriMesh mesh)
GL.Enable(EnableCap.PolygonOffsetFil1):
DrawFlat Shaded(mesh):
DrawWireFrameDark(mesh):
GL.Disable(EnableCap.PolygonOffsetFill):
得到的效果图如下所示:
光滑显示
光滑面线条光滑面显示
(Smooth)
(Flat)
图2-17:光滑面线条效果
在组合模式显示面和线条的时候,同一个三维模型被显示了两次,
次是用面填充方式,第二次只显示线条,两种方式叠加得到最终的显
示效果。两次显示的时候显示的都是同一个模型,因此位置都一样,
如果不进行特殊设置,会发生混合的现象,而不是线条显示在光滑表
面的结果。在 0penGL 中提供了 EnableCap.Polygon0ffsetFi11 设置可
以使线条显示的时候向外表面偏移一点,从而可以避免线条混合到光
面表面里面的现象。如下图所示,左边一列显示了线条设置为否的时
候,线条混合到模型表面的结果。后面是正常的显示结果。混合结果
的代码如下所示:
public void DrawSmoothHiddenLine(Trilesh mesh)
GL.Disable(EnableCap.PolygonOffsetFill):
DrawSnoothShaded(mesh)
DrawWireFrameDark(mesh)
无偏移
有偏移
图 2-18:线条偏移效果
2.4.3.法向方向显示
三维模型除了有点,线,面等基本元素,还有顶点法向和面的法向两
个法向。法向在三维模型的渲染上占有非常重要的作用。可以通过
0penGL来把法向绘制出来,从而可以看到三维模型法向的效果。
2
维模型顶点法向的绘制基本方法是以每个三维模型的顶点为起点,然
后绘制一个法向方向的线段,从而可以显示三维模型的法向。这个线
段的长度可以取三维模型所有三角形边长的平均值。顶点法向的示例
代码如下:
public void DrawVertexNormal(Trilesh mesh)
OpenGLManager.Instance.SetColor(GlobalSetting.DisplaySetting.NormalColor):
double avgLength= TriMeshUtil.ComputeEdgeAvgLength(mesh):
avgLength *= GlobalSetting.DisplaySetting.Wormallength:
foreach(Trilesh.Vertex item in mesh.Vertices)
Vector3D normal = item,Traits.Normal.Normalize()* avgLength
double x= item.Traits.Position.x;
double y=
item.Traits.Position.y.
double
item.Traits.Position.z;
Z二
GL,BBIDBPIUIOue,IIS,
GL.Vertex3(x,y,z):
GL,Vertex3(x+normal.x,y+normal.y,z+normal.z)
GL.End():
三维模型顶点法向显示如下图。图中红色的线条表示顶点的法向:
每个线条都从三角形的顶点出发,沿着法向进行显示。
图 2-19:顶点法向显示
三维模型面的法向显示,需要先计算三维模型的中心,然后以中心为
起点,以面的法向为方向,绘制一个线段。代码如下所示:
public void DrawFaceNormal(Trilesh mesh)
OpenGLlanager.Instance.SetColor(GlobalSetting.DisplaySetting.NormalColor):
double avgLength= TriMeshUtil.ComputeEdgeAvgLength(mesh):
avgLength *= GlobalSetting.DisplaySetting.NormalLength:
foreach(TriMesh.Face item in mesh.Faces)
double x=(item.GetVertex(0).Traits.Position.x+
item,GetVertex(1),Traits.Position.x +
item.GetVertex(2).Traits.Position.x)/3:
double y=
(item.GetVertex(0).Traits.Position.y +
item.GetVertex(1).Traits.Position.y+
item,GetVertex(2),Traits.Position.y)/3:
double z=
(item,GetVertex(0).Traits.Position.z +
item.GetVertex(1).Traits.Position.z+
item,GetVertex(2).Traits.Position.z)/3:
Vector3D normal= item,Traits.Normal.Normalize()* avgLength;
GL.Begin(Beginode.Lines);
GL.Vertex3(x,yz):
GL,Vertex3(x+normal.x,y+normal.y,z+ normal.z);
GL.End():
面法向的效果图如下所示,图中红色的线条表示面上的法向,每个红
色线条都从三角形面的中心开始,沿着法向的方向绘制。
e w tuetu te tat tu te ts
AL 1L 1t 11 1L1L
9MMTHTHTirN
图2-20:三角形面法向显示
2.4.4.主曲率方向显示
除了法向之外,每个顶点还有两个主曲率方向,这两个方向表示了顶
点曲率变化最大和最小的方向。主曲率方向绘制和顶点法向绘制类似
首先得到两个主曲率方向,然后从顶点出发,分别沿着两个主曲率方
向绘制一个线段。代码如下所示
public void DrawVertexPrincipleDirection(Trilesh mesh)
OpenGLManager.Instance.SetColor(GlobalSetting.DisplaySetting.NormalColor)
double avgLength= TrileshUtil.ComputeEdgeAvgLength(mesh):
avgLength *= GlobalSetting.DisplaySetting.NormalLength;
foreach (TriMesh.Vertex item in mesh.Vertices)
Vector3D maxnormal=
item,Traits.MaxCurvatureDirection.Normalize()* avgLength;
Vector3D minormal=
item.Traits,MinCurvatureDirection,Normalize()* avgLength.
double x= item.Traits.Position.x;
double y= item.Traits.Position.y:
double z= item,Traits.Position.z;
GL.laterial(laterialFace.Front,MaterialParameter.Diffuse,
GlobalSetting.DisplaySetting.FirstPricipalColor):
GL.Begin(Beginlode.Lines):
GL.Vertex3(x,y,z):
GL,Vertex3(x+maxnormal.x,y+ maxnormal.y,z+ maxnormal.z):
GL.End():
GL,Material (laterialFace.Front, MaterialParameter.Diffuse,
GlobalSetting.DisplaySetting.SecondPricipalColor);
GL.Begin(Begimlode.Lines):
GL.Vertex3(x,y,z):
GL.Vertex3(x+minormal.x,y+ mirnormal.y,z+ minormal.z):
GL.End():

        


http://www.ppmy.cn/server/107403.html

相关文章

抽奖系统PHP源码开源二开版带完整后台

该程序可以作为活动氛围活动气氛的烘托作用,活动游戏而已! 抽奖系统源码是一个以php MySQL进行开发的手机抽奖系统源码。用途:适合做推广营销、直播、粉丝抽奖。 功能介绍: 1、后台可以设置每个抽奖用户的抽奖次数,后台添加设置…

XTuner微调个人小助手认知实战

1 微调前置基础 本节主要重点是带领大家实现个人小助手微调,如果想了解微调相关的基本概念,可以访问XTuner微调前置基础。 2 准备工作 环境安装:我们想要用简单易上手的微调工具包 XTuner 来对模型进行微调的话,第一步是安装 XTun…

【C++】14.类型转换

我们常见的类型转化有: 1. 内置类型转化内置类型 2. 内置类型转化自定义类型 3. 自定义类型转化内置类型 4. 自定义类型转化自定义类型 本篇博客就是针对上述转化进行讲解…… 一、内置类型转化内置类型 我们知道在C语言中支持浮点型向整型的隐式类型转化&#x…

AI绘画工具 Stable Diffusion【插画转绘】:建筑 | 风景| 人像照片的插画转绘制作教程,照片秒变插画风格图片!

大家好,我是画画的小强 关于Stable Diffusion 的插画转绘,今天给大家分享一种制作方法。我们先看一下效果图。 一. 图片转插画的制作方法 本期教程我们将使用AI绘画工具Stable Diffusion,关于SD的安装和入门使用可以看看我的往期入门教程…

React——useRef()

useRef 是 React 的一个 Hook,用于在组件的整个生命周期内持久化保存数据。主要有以下几个用途: 存储对 DOM 节点的引用:通过给 DOM 元素添加 ref 属性来直接访问实际的 DOM 节点。这常用于需要直接操作 DOM 时,比如管理焦点、文本…

【软件】常用软件教程一:码云(Gitee)使用方法

文章目录 一、简介二、创建远程仓库三、配置SSH公钥四、同步 Gitee 仓库内容到本地五、本地新建文件并同步至 Gitee六、删除远程仓库中的指定文件七、常见代码 一、简介 Git 是一种分布式版本控制系统,用于跟踪和管理代码的变更。它是由 Linus Torvalds 创建的&…

Redis key的过期时间和永久有效

Redis key的过期时间和永久有效 设置键的过期时间 1. **使用 EXPIRE 命令**: EXPIRE 命令用于设置一个键的过期时间(以秒为单位)。 **语法**:shellEXPIRE key seconds **示例**:shellEXPIRE mykey 60 上述命令将 …

[Algorithm][综合训练][比那名居的桃子][chika和蜜柑][礼物的最大价值]详细讲解

目录 1.比那名居的桃子1.题目链接2.算法原理详解 && 代码实现 2.chika和蜜柑1.题目链接2.算法原理详解 && 详细讲解 3.礼物的最大价值1.题目链接2.算法原理详解 && 代码实现 1.比那名居的桃子 1.题目链接 比那名居的桃子 2.算法原理详解 && …