我想做一个类似于ProE,Catia的三维软件,在MFC的SDI中打开并显示一个CAD模型。现在我能够画出图形,也可以通过鼠标单击选择面片。
方法是判断全部面片gluProject到二维面后,鼠标点所落在的三角面片中,哪个zbuffer最小的方法。但是我想要通过鼠标框选面片时,再用这个方法就要对所框选的每一个像素做一次类似于点选的操作,效率非常的低。我看Opengl本身可以自动消隐掉背后的面,有没有办法加一个判断,如果选中的面是被消隐掉的,就跳过呢?或者各位大牛,有没有什么办法能后效率高一些实现这个功能呢?PS:我所存的是三角面片。

解决方案 »

  1.   

    你的视角的法向量与消隐的面的法向量的点积为正数(说明同向),那么,这个面就不应该被选中!
    当然,前提是你的数据结构里面,要方便求面的法向量!这个在半边结构为基础的CAD中经常用!
      

  2.   

    我定义了一个大数组,存储每个面的x,y,z坐标及法向而且也可以随时计算法向不太明白如果法矢经过modelview矩阵转换之后(平移旋转缩放),是怎样变的,如何判断其值愿听指教
      

  3.   

    好了,结题吧,最近太忙.
    我现在的算法是按照图形相交的算法, 判断相交部分哪个面在上的.
    具体方法是:
    1.根据鼠标框选的大小,申请一个含有两个变量的结构体类型的二维数组(其实是一维),数组每个单元的第一个变量的初始值为10000(深度),第二个为-1(面序号);
    2.依次判断面片,并与鼠标框相交,以此计算每个相交范围内点的深度,如果该点的深度小于存储值,则深度改变,并且将该面需要存入.
    3.把所有面序号提取出来,可能有重复的,做一次检查,排除之.经过测试, 2G内存,E5200 CPU下打开1000000个面片左右大小的文件, 框选的平均耗时为1-2秒.基本满意, 感谢楼上的解答.