植物百科网
当前位置: 首页 农业百科

怎么看出图纸是交点法还是线元法(着色原理面法线)

时间:2023-05-24 作者: 小编 阅读量: 5 栏目名: 农业百科

法线在着色中起着核心作用。我们将在稍后解释这一现象的原因。另一种说法是,物体表面任何给定点的亮度取决于此处法线与光线方向之间的角度。此问题解决方案的复杂性因几何类型而异。与三角面垂直的矢量很容易通过三角面的两边叉积得到。三角网格的法线也可以在三角形的顶点上定义,在这种情况下,我们称之为顶点法线。如果两个矢量垂直,则结果为0。

法线(Normal)在着色(Shading)中起着核心作用。在本文中我们将介绍法线的基本概念,了解面法线和顶点法线的不同作用,并学习基于面法线和顶点法线的不同着色技术。

每个人都知道,如果我们将物体指向光源,物体就会变得更亮。物体表面的方向在它反射的光量(因此它看起来像多亮)中起着重要的作用。此方向可由物体表面任意一点P的法线N(Normal)表示:

请注意上图 中,当光线方向和法线方向之间的角度增加时,球体的亮度是如何降低的。我们将在稍后解释这一现象的原因。现在只需要记住:

  • 我们所说的法线(我们用大写字母表示)N是垂直于点P处表面切线的向量。换句话说,要计算P点的法线,我们需要在P点画出切线,然后找到垂直于切线的适量。
  • 物体表面一个点的亮度取决于该点处的表面法线与光线方向的关系。另一种说法是,物体表面任何给定点的亮度取决于此处法线与光线方向之间的角度。

现在的问题是,我们如何计算这个法线?此问题解决方案的复杂性因几何类型而异。球体的法线通常很容易找到。如果我们知道球体表面点的位置和球体中心的位置,则此处的法线可以通过如下简单代码得到:

Vec3f N = P - sphereCenter;

如果对象是Mesh网格,则每个三角形定义了一个面,垂直于这个面的向量就是三角面上的任何一个点的法线。与三角面垂直的矢量很容易通过三角面的两边叉积得到。请记住,v1 * v2 = -v2 * v1。因此,边的选择将影响法线方向。如果你按逆时针顺序声明三角形顶点,则可以使用以下代码:

Vec3f N = (v1-v0).crossProduct(v2-v0);

如果三角形位于 xz 平面中,则法线应为 (0,1,0),而不是(0,-1,0):

a上面给出的计算法线的方法就得到 面法线,因为在整个平面上法线都是相同的,无论你选择哪一点。三角网格的法线也可以在三角形的顶点上定义,在这种情况下,我们称之为 顶点法线 。顶点法线用于一种被称为平滑着色(Smooth Shading)的技术,我们将在后面部分介绍。现在,让我们聚焦于面法线。

在程序中如何以及何时计算表面需要着色的点的法线并不重要。重要的是,当你即将对点进行着色时,手头有这些信息。在本节的几个程序中,我们进行了一些基本的着色,我们在每一个几何类中都实现了一个特别的方法 getSurfaceProperties() 来计算交叉点的法线和其他变量(如纹理坐标),我们将在此课程的稍后部分讨论这些变量。以下是球体和三角网格的 getSurfaceProperties() 的实现代码:

class Sphere : public Object {... public:...void getSurfaceProperties(const Vec3f &hitPoint,const Vec3f &viewDirection,const uint32_t &triIndex,const Vec2f &uv,Vec3f &hitNormal,Vec2f &hitTextureCoordinates) const{hitNormal= Phit - center;hitNormal.normalize();...}... };class TriangleMesh : public Object {... public:void getSurfaceProperties(const Vec3f &hitPoint,const Vec3f &viewDirection,const uint32_t &triIndex,const Vec2f &uv,Vec3f &hitNormal,Vec2f &hitTextureCoordinates) const{// face normalconst Vec3f &v0 = P[trisIndex[triIndex * 3]];const Vec3f &v1 = P[trisIndex[triIndex * 31]];const Vec3f &v2 = P[trisIndex[triIndex * 32]];hitNormal = (v1 - v0).crossProduct(v2 - v0);hitNormal.normalize();...}... };

简单着色效果:面比率/Facing Ratio

现在,我们知道如何计算物体表面一个点的法线,已经有足够的信息来创建一个简单的着色效果,面比率 ,即 Facing Ratio。此技术计算待着色点的法线和查看方向的点积。计算查看方向也非常简单。当使用射线跟踪(Ray Tracing)方法时,查看方向就是与表面P点相交的光线的相反方向,在不使用射线跟踪时,还可以通过从表面上的点P跟踪到眼睛E的线来找到查看方向:

Vec3f V = (E - P).normalize(); // or -ray.dir if you use ray-tracing

请记住,如果两个向量平行并指向同一方向,则其点积返回 1,当两个向量相互垂直时则点积返回 0。如果向量指向相反的方向,则点积为负值,但如果我们使用此时的点积结果,颜色值就是负的,这时我们需要将结果压缩为 0:

float facingRatio = std::max(0, N.dotProduct(V));

当法线和矢量V指向同一方向时,点积返回1。如果两个矢量垂直,则结果为 0。如果我们使用这种简单的技术来着色框架中心的球体,那么球体的中心将是白色的,当远离中心时,球体会变暗,如下图所示:

Vec3f castRay(const Vec3f &orig, const Vec3f &dir,const std::vector<std::unique_ptr<Object>> &objects,const Options &options) {Vec3f hitColor = options.backgroundColor;float tnear = kInfinity;Vec2f uv;uint32_t index = 0;Object *hitObject = nullptr;if (trace(orig, dir, objects, tnear, index, uv, &hitObject)) {Vec3f hitPoint = origdir * tnear; // shaded pointVec3f hitNormal;Vec2f hitTexCoordinates;// compute the normal of the point of we want to shadehitObject->getSurfaceProperties(hitPoint, dir, index, uv, hitNormal, ...);hitColor = std::max(0.f, hitNormal.dotProduct(-dir)); // facing ratio}return hitColor; }

恭喜!你刚刚了解了第一种着色技术。现在让我们来了解一个更逼真的着色方法,它将模拟光对漫射物体的影响。但在了解这种方法之前,我们首先需要介绍和学习光的概念。

平面着色 vs. 平滑着色

三角面网格的问题在于它们不能表示完全光滑的表面(除非三角面非常小)。如果我们想要将刚才描述的Facing Ratio技术应用于多边形网格,我们需要计算射线相交的三角形的法线,并计算面法线和查看方向的点积。此方法的问题在于,它使对象具有以下图像中所示的面片化外观,这就是该方法被称为 平面着色(Flat Shading)的原因。

如前几次所述,只需计算矢量 v0v1 和矢量 v0v2 的叉积,即可找到三角面的法线,其中 v0、v1 和 v2 表示三角形的顶点。为了解决这个问题,Henri Gouraud在1971年引进了被称为 平滑着色 (Smooth Shading)的方法。此技术背后的理念是在多边形网格的表面产生连续阴影,尽管网格所代表的对象并不是连续的,因为它是从平面(多边形或三角形)集合中构建的。为此,Gouraud引入了顶点法线的概念。思路很简单,我们不计算或存储三角面的法线,而是为网格的每个顶点存储一个法线,法线的方向由三角网格的基础平滑表面决定。当我们想要计算三角面上一个点的颜色时不使用面法线,而是通过线性插值三角形的顶点法线性地插值,使用点的重心坐标来计算"伪平滑"法线值。该技术如下图所示:

顶点法线在三角形顶点上定义。你可以看到,它们是垂直于三角面网格对应的原始光滑底层表面。有时三角形网格不是从光滑的表面直接转换来的,那么顶点法线必须实时计算。当没有平滑的表面时,存在多种计算顶点法线的技术,但我们不会在本文中研究这一点。现在你可以使用Maya或Blender等软件为你完成此工作(在Maya中,你可以选择多边形网格,并在"Normals"菜单中选择"Soften Edges"选项)。

事实上,从实用和技术的角度来看,每个三角形都有3个顶点法线。这意味着三角网的顶点法线总数实际上等于三角形的数量乘以 3。在某些情况下,2个或更多三角形共享的顶点上定义的顶点法线相同(指向同一方向),但可以通过设置其指向不同的方向来实现不同的效果(例如,你可以构造表面的伪硬边)。

只要我们知道三角形的顶点法线,三角形上的某个点的重心坐标以及三角形索引,那么插值计算三角形表面任何点的法线就很简单。无论是栅格化还是射线追踪都可以提供这些信息。顶点法线由 3D建模 程序生成,然后,它们被导出到几何文件中,其中包含了三角形连接信息、顶点位置和三角形纹理坐标。我们需要做的就是结合点的重心坐标和三角形顶点法线计算这个点的法线(下面的17-20行):

void getSurfaceProperties(const Vec3f &hitPoint,const Vec3f &viewDirection,const uint32_t &triIndex,const Vec2f &uv,Vec3f &hitNormal,Vec2f &hitTextureCoordinates) const {// face normalconst Vec3f &v0 = P[trisIndex[triIndex * 3]];const Vec3f &v1 = P[trisIndex[triIndex * 31]];const Vec3f &v2 = P[trisIndex[triIndex * 32]];hitNormal = (v1 - v0).crossProduct(v2 - v0);#if 1// compute "smooth" normal using Gouraud's technique (interpolate vertex normals)const Vec3f &n0 = N[trisIndex[triIndex * 3]];const Vec3f &n1 = N[trisIndex[triIndex * 31]];const Vec3f &n2 = N[trisIndex[triIndex * 32]];hitNormal = (1 - uv.x - uv.y) * n0uv.x * n1uv.y * n2; #endif// doesn't need to be normalized as the N's are normalized but just for safetyhitNormal.normalize();// texture coordinatesconst Vec2f &st0 = texCoordinates[trisIndex[triIndex * 3]];const Vec2f &st1 = texCoordinates[trisIndex[triIndex * 31]];const Vec2f &st2 = texCoordinates[trisIndex[triIndex * 32]];hitTextureCoordinates = (1 - uv.x - uv.y) * st0uv.x * st1uv.y * st2; }

请注意,这只是看起来表面光滑。如果你看看下面图像中的多边形球体,仍然可以看到面片的轮廓,即使表面看起来光滑。该技术的确改善了三角网状的外观,但不能完全解决面片化问题。解决这个问题的唯一办法是使用 细分表面(subdivision surface),我们将在另一篇文章中讨论这一技术。此外,将光滑表面转换为三角网状时增加使用的三角形数量当然也可以使这一问题得到改善。


原文链接:http://www.bimant.com/blog/shading-normals/

    推荐阅读
  • 突触名词解释(突触是什么意思)

    突触名词解释突触是指一个神经元的冲动传到另一个神经元或传到另一细胞间的相互接触的结构。突触是神经元之间在功能上发生联系的部位,也是信息传递的关键部位。在光学显微镜下,可以看到一个神经元的轴突末梢经过多次分支,最后每一小支的末端膨大呈杯状或球状,叫做突触小体。这些突触小体可以与多个神经元的细胞体或树突相接触,形成突触。从电子显微镜下观察,可以看到,这种突触是由突触前膜、突触间隙和突触后膜三部分构成。

  • 《守望先锋》对战局影响大招top一览 守望先锋对局战绩

    今天小编要为大家带来的是玩家“黑呦酱”分享的《守望先锋》对战局影响大招top一览,感兴趣的玩家赶紧一起来看看吧!守望先锋大招分为四类,控制类,自身BUFF类,辅助类以及伤害类,由于伤害类大部分使用大招时,本体无法进行有效杀伤,且控制类及自身BUFF类需要其他技能的配合,so,此间因素也要加入考量。

  • 运动后喝黑咖啡还能燃脂吗 运动时喝黑咖啡会加快燃脂吗?

    2、运动过程中身体脂肪会加速燃烧,从而具有一定减肥作用;而黑咖啡热量比较小,加上其中含有大量的咖啡因以及维生素、纤维素物质,适量喝可以促进人体肠胃蠕动,加速脂肪代谢分解,对减肥具有促进作用。

  • 斯威汽车质量怎么样(斯威质量好不好)

    2018年6月起,斯威“品质特工队”以四大火炉的重庆作为起点,途径海南、吐鲁番、格尔木三地,历时近一年进行了数十万公里极限环境适应性试验。极端干燥高温环境下,常见车内温度往往会狂飙到60℃以上,而在斯威G01的车厢里,却始终能够保持清新凉爽的状态。一整套严酷考验下来,斯威G01的性能表现完全得以充分认证。这样一算,斯威G01差不多完成了近百万公里的专业级严酷考验。

  • 春天兰花怎么养 春天兰花怎么养浇水

    白墨兰花哪个品种最好白墨兰花是墨兰的珍贵变异品种假鳞茎椭圆形,已有数百年栽培历史,流传至今,不下十数个品种,它叶色莹润、体态优雅、幽香静远、且抗病,白墨兰花比较好的品种一般分企剑和软剑两个品系。什么兰花开花最香兰花品种很多,按花香来排,在兰花界春兰居首,惠兰次之,随后便是建兰、墨兰和寒兰,春兰的花香味最正宗,持久性也极强。

  • 奔驰e300l前进挡总共有几个(你看了奔驰22款E300L升级这套原厂HUD抬头显示效果觉得怎么样)

    从行车安全的角度来考虑,加装一台HUD是非常有必要的。HUD的全称是HeadUpDisplay,中文翻译过来就是抬头显示器。今天星骏汇小陈通过以上的产品配件图了解,我们看到这台奔驰22款E300L升级HUD抬头显示所需要更换的配件有,抬显仪器,高配仪表盖板,高配仪表电脑,雨量传感器,空调管升级HUD抬头显示把仪表台上的那一块盖板换掉,换成高配的预留好显示器孔位的盖板,装上显示器,从而使仪表显示的内容投射到挡风玻璃上面。

  • 儿童葫芦丝表演(通城千人共奏葫芦丝)

    儿童葫芦丝表演香城都市报讯 10月27日,通城县隽水中学参加湖北省“黄鹤杯”美育节节目视频录制现场,七、八年级千名学生,同奏乐曲《龙的传人》。该校相关负责人介绍,本学期,每天下午预备铃响5分钟,七、八年级各班集体合奏葫芦丝。丝竹声声,已渐成校园一道靓丽的风景线。近年来,该校贯彻落实社会主义核心价值观,注重未成年人思想道德建设,坚持开设中华传统和特色民族特色教育课程,促进学生“德智体”全面发展。

  • 鸡娃时代孩子的成长之道(与其1岁就开始鸡娃)

    出生时大脑发育已经完成25%,1岁完成了50%,3岁完成了60%,6岁达到90%。现在小学虽然是零基础入学,取消了统一考试,但是它对学生的要求并没有降低。吃够了佛系养娃的亏,橙子家的老二断然不肯再佛系养了。北京卫视于2018年摄制的纪录片《起跑线》中,有一个7岁的北京女孩令人印象深刻。她的家庭,在北京三环内有一套房,一辆车。妈妈认为,孩子从小培养兴趣,靠的是父母的指引。

  • 环氧树脂的作用与用途(环氧树脂有什么作用与用途)

    环氧树脂的作用与用途具有优良的物理和电绝缘性能,强度高、收缩性低,耐腐蚀以及有高绝缘的优势,所以被称为万能胶。电器、电机绝缘封装件的浇注。从常压浇注、真空浇注已发展到自动压力凝胶成型。长时间接触胶水时,有人会有细微的皮肤过敏和细微瘙痒疼痛的情况,建议在运用时戴上防护手套,如果出现了这样的情况,需要用酒精擦洗,然后用清水冲洗干净。

  • 明月曾照江东寒剧情(明月曾照江东寒剧情介绍)

    明月曾照江东寒剧情剧情简介:美少女战清泓是武林副盟主战破敌之女,从小被父亲禁止涉及江湖事。十年一期的武林大会即将来临,战清泓瞒着家人偷跑下山,立志夺取武林盟主之位。战清泓与温宥也开始互生情愫,奈何最终被世俗礼法所阻碍。与此同时,江湖上风起云涌,战清泓发现自己自幼背诵的家训竟是人人趋之若鹜的第一神功《鹤羽剑法》。