计算机图形学OpenGL笔记

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

《可计算离散整体几何结构》(可视化)实验室出品
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():

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值