在
Get Reversed Normal Faces(获取反法线面),我只是说明了一下我的思维路线,没涉及到任何实现原理,现在我可以跟大家分享一下,我具体是怎么做的。
实际上我并没有去开发算法来判断面的正反面,而是使用了opengl里的不可见面算法。
什么是不可见面?
例如我们有两物体A和B,它们的某一部分重叠了,A在前B在后,那么我们只能看到B的一部分,如果B看不见的那部分也显示出来是没有任何意义的,这一部分的面就是不可见的。
判断不可见面的算法有不少,我使用的是最简单的,就是通过计算面的法线和相机【眼睛】的角度,如果角度大于180(应该是,我不太记得了),那就是不可见的面。
但这个算法并不能直接用来判断法线面的正反,因为就算是没有反向法线面对物体也会有不可见面。而且如果反向法线的面如果刚好就在物体的背面,它就变成了可见面了。如果你仔细分析反向法线的面就能知道它的边是硬边。
当时我就是这么做的,但实际的情况是非常复杂的,如果你模型有一大片连续的或是断断续续的面是反向法线的,就不行了,只能检测到一小部分的面是反向法线的,因为连续的反向法线面中间的面的边是软边。
之后呢,我就想尝试其它的不可见面对算法,可是都是非常难懂的算法,后来我又做了些修改,我不记得都怎么改了,因为我改的那些版本已经丢失了,我也是在几个月前才知道,他们一直在用第一个版本,就是硬边判断的版本。
那到底要怎么做才能完美的获取反法线面。
其实使用判断不可见面的算法是可以的,只是不能对三维模型来使用,因为实际上的模型非常复杂。但对于平面模型来说就显而易见了。
所以正确的做法应该是这样:
- 先定一个相机视图,不能是三维的相机视图,必须是二维的相机视图
- 然后将模型以uv的排列进行投影,就是把三维模型,在上面定的视图中进行uv的映射,来得到平面的模型,同时要注意不能有uv重叠,因为投影出来的模型也会重叠
- 使用判断不可见面的算法找出不可见面,这时的不可见面就只有两种结果,如果你的相机视图是看着模型的正面,它们就是反法线面
uv重叠也是可以的,我忘了上面的不可见面的算法是很简单的,它并不会去处理重叠的部分,只处理背面的面,就是背向眼睛的面
分享到:
相关推荐
在给定的“lena-reversed.rar”压缩包中,我们探讨的是如何在MATLAB环境下对著名的Lena图像进行灰度反转。 首先,MATLAB是一种强大的数值计算和可视化工具,特别适合于图像处理任务。在MATLAB中,有一系列内置的...
#include "stdafx.h" #include "iostream" #include "fstream" #include "algorithm" #include "string" #include "vector" #include "cmath" using namespace std; int main(int argc, char* argv[]) ...
在使用reversed()函数时需要注意的事项包括:确保输入序列是可迭代的(列表、元组、字符串等),并且要理解reversed()返回的是一个迭代器,如果需要多次获取反向序列,则必须多次调用reversed()函数。此外,如果对...
2. `sum_reversed(a, b)`:这个函数接收两个整数a和b,首先分别调用`reverse_integer(a)`和`reverse_integer(b)`,得到它们的反置数,然后将这两个反置数相加得到sum,最后调用`reverse_integer(sum)`计算sum的反置...
有些时候,程序需要进行反向遍历,此时可通过 reversed() 函数,该函数可接收各种序列(元组、列表、区间等)参数,然后返回一个“反序排列”的法代器,该函数对参数本身不会产生任何影响。 在交互式解释器中,测试...
UID_CP_WriteID_Reversed.cpp
使用Python内置函数reversed() for i in reversed(arr): pass reversed返回的是迭代器,所以不用担心内存问题。 方法二 使用range()倒序 for i in range(len(arr) - 1, -1, -1): pass 方法三 先使用list自带的...
1. **信号采集**:首先,我们需要生成或获取一个代表时间反转目标的信号。这可能是一个声波、光波或其他形式的波动信号。在MATLAB中,我们可以使用内置的函数如`sin`、`cos`或`randn`来创建这样的信号。 2. **信号...
#### 二、`reversed(seq)`的实现原理 当调用`reversed()`函数时,它实际上是通过以下步骤来实现逆序功能的: 1. **创建迭代器**:`reversed()`内部首先检查传入的对象是否支持迭代。 2. **反向遍历**:对于支持...
**Kotlin编程原理详解** Kotlin,由JetBrains公司开发,是一种现代、静态类型的编程语言,主要用于Java虚拟机(JVM)以及Android平台。自2017年被Google宣布为Android开发的首选语言以来,Kotlin在移动开发领域迅速...
这里主要讨论的是`sort()`、`sorted()`、`reverse()`和`reversed()`四个函数的区别和用法。 首先,`sort()`函数是Python列表的一个内建方法,只适用于可变对象如列表。它没有返回值,而是直接在原列表上进行排序...
本话题“reversed link v2”聚焦于双向链表的反转操作,这是一个常见的编程问题,尤其在Java编程中。双向链表与单向链表不同,它允许节点在两个方向上都有指针,这使得前向和后向遍历变得容易。现在,我们将深入探讨...
添加对反向排序列表支持的 polyfill。 看: 只需将脚本包含在任何页面中(在 DOM 加载结束时或之后),它就会自动使 'reversed' 属性在有序列表上工作(该... 如果你想要一个使用 jQuery 的版本,你可以从获取代码。
Python的切片功能强大,可以方便地获取字符串的一部分。要逆序字符串,可以使用步长为-1的切片操作。例如: ```python string = "Hello, World!" reversed_string = string[::-1] print(reversed_string) ``` ...
此接口用于获取车辆的历史轨迹数据,其重要请求参数与车辆CAN数据查询接口基本相同,主要是`did`、`gpsEndTime`、`pageSize`、`pageType`、`reversed`、`startRowKey`、`gpsStartTime`、`token`和`vin`。...
本章节主要聚焦于中性样品的反相色谱(Reversed-Phase Chromatography,RPC)与正相色谱(Normal-Phase Chromatography,NPC)的应用。 反相色谱是HPLC中最常用的分离模式,尤其适用于大多数常规样品。RPC的分离...
Python中的`reversed()`函数是一个内置的迭代工具,它能够将序列对象的元素顺序反转,生成一个新的可迭代对象。这个可迭代对象可以被用于for循环或者其他需要迭代的情况,以反向遍历序列的元素。 1. **反转序列** ...
极偶反接偏磁式磁阻电机(Polar Opposite Reversed-Biased Magneto-Resistance Motor,简称PORBM)是一种创新的电机设计,它结合了磁阻效应和电磁原理,提高了电机的性能和能效。磁阻效应是指在磁场作用下,某些材料...