`
schi
  • 浏览: 200971 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Get Reversed Normal Faces(获取反法线面) [原理]

阅读更多
Get Reversed Normal Faces(获取反法线面),我只是说明了一下我的思维路线,没涉及到任何实现原理,现在我可以跟大家分享一下,我具体是怎么做的。

实际上我并没有去开发算法来判断面的正反面,而是使用了opengl里的不可见面算法。

什么是不可见面
例如我们有两物体A和B,它们的某一部分重叠了,A在前B在后,那么我们只能看到B的一部分,如果B看不见的那部分也显示出来是没有任何意义的,这一部分的面就是不可见的。

判断不可见面的算法有不少,我使用的是最简单的,就是通过计算面的法线和相机【眼睛】的角度,如果角度大于180(应该是,我不太记得了),那就是不可见的面。

但这个算法并不能直接用来判断法线面的正反,因为就算是没有反向法线面对物体也会有不可见面。而且如果反向法线的面如果刚好就在物体的背面,它就变成了可见面了。如果你仔细分析反向法线的面就能知道它的边是硬边。

当时我就是这么做的,但实际的情况是非常复杂的,如果你模型有一大片连续的或是断断续续的面是反向法线的,就不行了,只能检测到一小部分的面是反向法线的,因为连续的反向法线面中间的面的边是软边。

之后呢,我就想尝试其它的不可见面对算法,可是都是非常难懂的算法,后来我又做了些修改,我不记得都怎么改了,因为我改的那些版本已经丢失了,我也是在几个月前才知道,他们一直在用第一个版本,就是硬边判断的版本。

那到底要怎么做才能完美的获取反法线面。
其实使用判断不可见面的算法是可以的,只是不能对三维模型来使用,因为实际上的模型非常复杂。但对于平面模型来说就显而易见了。
所以正确的做法应该是这样:
  • 先定一个相机视图,不能是三维的相机视图,必须是二维的相机视图
  • 然后将模型以uv的排列进行投影,就是把三维模型,在上面定的视图中进行uv的映射,来得到平面的模型,同时要注意不能有uv重叠,因为投影出来的模型也会重叠
  • 使用判断不可见面的算法找出不可见面,这时的不可见面就只有两种结果,如果你的相机视图是看着模型的正面,它们就是反法线面

uv重叠也是可以的,我忘了上面的不可见面的算法是很简单的,它并不会去处理重叠的部分,只处理背面的面,就是背向眼睛的面
分享到:
评论
2 楼 schi 2014-05-10  
啊,我太傻了,都想到使用uv了,可以有更简单的方法,只要把uv当成xz,然后算出w(y)就行了啊
1 楼 schi 2014-02-11  
我也是今天才偶然想到的,我以后可能用不着了,所有分享给有需要的人。

相关推荐

Global site tag (gtag.js) - Google Analytics