zoukankan      html  css  js  c++  java
  • OpenCASCADE Face Normals

    OpenCASCADE Face Normals

    eryar@163.com

    Abstract. 要显示一个逼真的三维模型,其顶点坐标、顶点法向、纹理坐标这三个信息必不可少。本文主要介绍如何在OpenCASCADEDraw中显示出曲面的法向量,通过使用相关命令,来方便地对曲面的法向进行检查。

    Key Words. Face, Surface, Normals

    1. Introduction

    曲面上点的法向量对于三维显示程序来说是一个重要的数据,他的正确与否直接影响曲面对光照的反应进而影响显示效果。如下图所示为同一个球的三维显示,不同的法向得到的显示效果是不同的。

     

    对于OpenGL来说,提供了接口glNormal()来设置法向量。关于OpenCASCADE中更多曲面法向量计算及相关信息,可以参考原来写的blog:

    Topology and Geometry in OpenCascade-Face

    Surface Normal Vector in OpenCascade

    Surface Normal Averaging

    从这些文章中可以看出,与一般显示引擎不同的是,OpenCASCADE对于通过造型算法构造的模型,由于其内在的精确参数方程的表示,可以精确计算出曲面上任意点处的法向量。而不用像一般的显示引擎那样,通过计算平均法向类似的算法来处理顶点法向。

    2. Face Normals

    OpenCASCADE早期版本的Draw Test Harness中提供了normals命令,可以将曲面的法向显示出来。

    命令用法如下:

    normals shape [Length {10}] [-NbAlongU {1}] [-NbAlongV {1}] [-UseMesh] [-print], display normals

    通过相应的参数可以设置法线箭头的长度、沿曲面参数UV方向显示法向的数量、是否显示网格的法向及是否打印在Draw的命令窗口中。下面通过显示一个圆柱体各个面的法向来说明命令的用法。命令列出如下:

    axo

    pcylinder c 10 20

    normals c

    fit

    首先使用命令axo打开一个二维轴测视图。

    再使用命令pcylinder创建一个半径10,高度20的圆柱体;

    使用命令normals来用默认参数显示出圆柱的法向;

    使用fit命令来缩放二维轴测视图。

     

    其中红色表示法线方向与显示的方向一致,蓝色表示法向与显示的方向相反。由于这个二维轴测视图不能任意旋转、缩放,没有三维视图方便,所以OpenCASCADE又提供了一个在三维视图中显示曲面法向的命令vnormals,相关参数设置与normals一致。所以下面主要在三维视图中来对这几个参数的用法进行说明。其中vnormals命令用法如下:

    Displays/Hides normals calculated on shape geometry or retrieved from triangulation

    vnormals Shape [{on|off}=on] [-length {10}] [-nbAlongU {1}] [-nbAlongV {1}] [-nbAlong {1}]

                    :        [-useMesh] [-oriented {0}1}=0]

    当使用默认参数来显示上面的圆柱体的法向时,直接输入命令:vnormals c

     

    因为在三维视图中使用箭头来表示法向的方向,所以不用颜色来区分方向的正反。由上图可见,底面的法向正确的应该要反向。默认参数只显示的TOPO面中的几何面的法向,没有考虑TOPO面的方向。通过参数-oriented使命令显示法向时考虑TOPO面的方向,即最终显示用的法向方向。命令为:

    vnormals c -oriented

     

    上面每个面上只显示了一个法向,对于圆柱面很明显一个法向不够。可以通过参数-nbAlong等来设置曲面在参数UV方向法向的个数。

     

    对于显示数据即三角网格顶点的法向可以通过参数-useMesh来指定。这个用法可以方便地检查网格数据的顶点及顶点法向。

    显示一个螺旋桨模型面的法向:

    还可以通过设置参数on-length来设置法向的显示与不显示,及法向的显示长度,这里就不细说了,读者可以自己测试。

    3. Conclusion

    综上所述,OpenCASCADEDraw Test Harness中封装了显示面法向的命令normalsvnormals。通过使用这些命令可以方便地来检查面的法向是否正确。尤其是参数-useMesh来显示网格中的法向功能,对于模型的显示网格数据中的顶点法向的检查很有帮助。通过查找相关命令实现的源码,可以方便地找到相关功能实现的源码,这也是开源的一个优势。

  • 相关阅读:
    java语言程序设计与数据结构(基础版)第三章**3.4
    贪心练习:阿里巴巴与十四大盗————背包问题
    贪心练习最优装载问题
    贪心训练均分纸牌Noip2002
    排队打水问题(信息学奥赛一本通贪心算法)
    PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串
    PAT甲题题解-1039. Course List for Student (25)-建立映射+vector
    PAT甲题题解-1038. Recover the Smallest Number (30)-排序/贪心,自定义cmp函数的强大啊!!!
    PAT甲题题解-1037. Magic Coupon (25)-贪心,水
    PAT甲题题解-1036. Boys vs Girls (25)-找最大最小,大水题
  • 原文地址:https://www.cnblogs.com/opencascade/p/Face_Normals.html
Copyright © 2011-2022 走看看