Unity 3D 内建着色器源码剖析(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-09 10:47:45

点击下载

作者:熊新科

出版社:人民邮电出版社有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Unity 3D 内建着色器源码剖析

Unity 3D 内建着色器源码剖析试读:

前言

本书的定位与适合的读者

本书不是一本3D图形编程入门书,也不是一本Unity 3D着色器编程入门书。本书的定位是“Unity 3D着色器代码分析教程+Unity 3D着色器编程参考手册”。因此,本书的目标读者应具有一定的图形编程知识:有一定的Unity 3D开发经验;学习过基础的Direct 3D/OpenGL图形编程,如知道顶点、纹理和着色器的概念与作用;了解矩阵乘法、四元数和坐标系变换等数学概念。

本书是为下面3类读者撰写的。你在阅读本书之前,阅读过Unity 3D自带的或者第三方编写的着色器代码,依样画葫芦地修改过,对大部分代码知道其实现的功能,但又有很多细节不明白;或者你已经能写一些Unity 3D ShaderLab代码了,但还不清楚Unity 3D提供的内置着色器库可以提供多少现有的工具代码;抑或你因工作需要,要把Unity 3D提供的着色器进行精简改造以适应自己的项目,对千头万绪的细节感到困难。本书有助于解决这些读者的痛点。本书所剖析的着色器代码版本

本书所剖析的Unity 3D内置着色器代码版本是2017.2.0f3,读者可以从Unity 3D官网下载这些着色器代码。这些代码以名为builtin_shaders-2017.2.0f3.zip的压缩包的形式提供,解压缩后,内有4个目录和1个license.txt文件,介绍如下。

目录CGIncludes存放了37个扩展名为cginc的文件,两个扩展名为glslinc的文件。这些文件就是Unity 3D提供的内置着色器的头文件。本书将重点剖析表0-1中头文件的实现。表0-1 头文件文件名功能描述AutoLight.cginc提供了一系列用来计算阴影的宏和函数HLSLSupport.对HLSL着色器语言用宏进行封装cgincLighting.cginc对lambert、Phong、Blinn-Phong等光照模型进行封装UnityCG.cginc提供了大量着色器在开发时会用到的工具函数和宏UnityGBuffer.提供了用于延迟渲染的与G-Buffer操作相关的函数和宏cgincUnityGlobalIllumi提供了用于进行全局光照计算的工具函数nation.cgincUnityImageBased提供了“基于图形照明”的相关操作的工具函数Lighting.cgincUnityInstancing.提供了使用GPU(图形处理器)多例化技术时用到的宏cgincUnityLightingCom提供了全局光照计算所需要的结构体的定义mon.cgincUnityMetaPass.提供了与元渲染通路信息相关的函数和着色器变量cgincUnityPBSLighting提供了基于物理着色所需要的光照计算函数,可用于外观着色.cginc器UnityShaderUtiliti提供了把物体从模型空间变换到裁剪函数的工具函数es.cgincUnityObjectToClipPosUnityShaderVaria提供了进行着色器开发时由引擎底层传递给着色器程序的着色bles.cginc器变量UnityShadowLibr提供了计算阴影时用到的宏和工具函数ary.cgincUnityStandardBR提供了标准着色器中用到的和BRDF(bidirectional reflectance DF.cgincdistribution function,双向反射分布函数)计算相关的工具函数UnityStandardCo标准着色器用到的一些开关配置信息nfig.cgincUnityStandardCor标准版的标准着色器的顶点和片元着色器的实现文件e.cgincUnityStandardCor提供了标准版的标准着色器的顶点/片元入口函数eForward.cgincUnityStandardCor提供了简化版的标准着色器的顶点/片元入口函数eForwardSimple.cgincUnityStandardInp标准着色器用到的一些顶点输入结构信息和输入计算函数ut.cgincUnityStandardMet标准着色器中元渲染通路的实现a.cgincUnityStandardSh标准着色器中阴影投射渲染通路的实现adow.cgincUnityStandardUtil标准着色器中一些辅助用工具函数的实现s.cginc

目录DefaultResources存放了Unity 3D引擎内置的简单着色器。

目录DefaultResourcesExtra提供了大量渲染效果的着色器实现,Mobile子目录下的shader文件就是移动平台下的漫反射效果、粒子系统、法线贴图和光照图效果的实现。本书将详细剖析该目录下的Standard.shader文件,即标准着色器的实现。

目录Editor中唯一的文件是StandardShaderUI.cs。该段代码是当材质文件使用了标准着色器时,材质对应的inspector界面的实现。

文件license.txt用于说明Unity 3D开发公司对这些着色器代码的版权。本书内容和建议阅读方式

既然本书的定位是“Unity 3D着色器代码分析教程+Unity 3D着色器编程参考手册”,那么读者需要按照一定的阅读顺序才能达到最佳的阅读效果。对于初中级读者,可先从第1章开始精读。第1章对当前主流的渲染流水线进行阐述,讲述顶点处理阶段、光栅化阶段、片元处理与输出合并阶段这三大处理阶段的实现。这三大处理阶段是主流渲染流水线都必须实现的阶段。

1.1节概述了渲染流水线,讲述了主流渲染流水线的各个阶段,以及各个阶段的操作。1.2节介绍顶点处理阶段。首先详细讲述顶点的组织方式、坐标系的确定方式,然后对把顶点从模型空间变换至世界空间、从世界空间变换至观察空间、从观察空间变换到裁剪空间所用到的各个变换矩阵进行详细说明,最后分析Unity 3D中这些矩阵的封装代码,让读者在懂得使用这些矩阵的同时能知其然且知其所以然。1.3节介绍光栅化阶段,对其中的各个子阶段进行详细的数学推导说明。光栅化阶段是由硬件实现不可编程的,对它进行详细的数学说明也是为了让读者深入了解其原理,在开发工作中能够从底层去理解渲染流水线的机制。今后读者如果工作中需要用到其他的3D引擎,能融会贯通且更快地上手。1.4节介绍片元处理与输出合并阶段。其中,片元处理子阶段就是片元着色器的内容;输出合并子阶段也是由硬件实现不可编程的,但流水线提供了若干功能函数以对它进行控制。该节重点讲述输出合并中的深度值操作和Alpha值操作,以及Unity 3D为这两个操作所提供的控制函数。

精读完第1章后,可接着通读第2章。第2章主要从物理学的角度阐述图形渲染中本质的问题,即光的能量传递与分布问题。其中,2.1节和2.2节是学习基于物理渲染的前置知识,里面所阐述的各个物理量和它们的数学关系是阅读第10章与第11章的基础;2.3节讲述计算机如何对颜色进行数学建模,而该节则是理解2.4节中颜色空间的基础;2.4节重点讲述计算机图形学中关于“伽马校正”的内容,阅读完该节后,相信读者在工作中碰到“画面颜色总是不对且偏暗”的问题时,能理解它产生的缘由并能解决之。

第3章对Unity 3D特有的外观着色器进行分析,阐述外观着色器和传统的顶点/片元着色器之间的关系。Unity 3D的内置着色器代码中大量使用了着色器多样体,因此同一套着色器能够被编译到各个不同的硬件平台,了解着色器多样体的原理是剖析Unity 3D内置着色器代码所必需的。因此,3.4节详细分析这些着色器多样体的原理和使用方法。如果读者已经熟悉该章内容,可以跳过它。

因为Unity 3D是一个跨平台引擎,所以在Unity 3D内置着色器代码中要时刻考虑通用性问题。尤其是在开发手机游戏时,开发环境通常是Windows/Mac平台,而运行环境多是Android/iOS平台。因此,一套着色器代码起码要支持开发和运行两种不同的环境。不同的平台下使用的着色器语言也有所不同。虽然Unity 3D着色器推荐以Cg语言作为前端的开发语言,但是Unity 3D会在后台将Cg语言代码编译为目标平台的最佳运行语言的字节码。例如,在Windows平台上最佳运行语言是HLSL,而Android/iOS平台上则是OpenGL ES。Unity 3D着色器语言提供了一系列消除平台和开发语言差异性的机制。3.5节和3.6节会阐述这些机制。

Unity 3D提供了大量的通用工具函数和一些由引擎底层在运行期赋值的着色器变量。无论是Unity 3D内置着色器或者第三方编写的着色器,都大量使用了这些预定义的通用工具函数和着色器变量。这些通用工具函数集中在UnityCG.cginc文件中,着色器变量则定义在UnityShader Variables.cginc文件中。第4章重点剖析这两个文件的实现,尤其讲述UnityCG.cginc文件中工具函数的实现原理。开发者在编写自己的着色器时,如果碰到一些要实现的功能,不妨先查阅该章,看看Unity 3D引擎是否已经提供了已有的实现。同时,因为Unity 3D内置着色器自身也大量使用了这两个文件中的内容,所以本书其他章节中也大量交叉引用了该章内容,读者在阅读剖析着色器代码的章节时,也应经常查看该章内容。

Unity 3D内置着色器大量使用了GPU多例化技术。Unity 3D在UnityInstancing.cginc文件中提供了使用GPU多例化技术要用到的宏。第5章讲述GPU多例化技术的实现原理,并剖析UnityInstancing.cginc文件中Unity 3D引擎对它的封装实现。

Unity 3D有两种渲染方式:一种是前向渲染,另一种是延迟渲染。Unity 3D提供的标准着色器文件Standard.shader中有这两种渲染方式的实现。第6章讲述前向渲染和延迟渲染的基本原理,以及Unity 3D对延迟渲染的一些实现细节。

图形渲染的两大主题是光照和阴影的计算。Unity 3D引擎除了支持光源对物体的照明计算(即直接照明)之外,还支持物体之间的光照效果,即间接照明。两者统称为全局照明。第7~9章讲述Unity 3D的全局光照和阴影计算原理。其中,7.7节从数学原理出发,重点阐述球谐光照原理和Unity 3D对它的封装实现。Unity 3D提供了大量完成光照计算和阴影计算的工具函数与宏,无论是第三方着色器还是引擎内置着色器都会大量使用到它们。这些函数与宏分别在UnityShadow Library.cginc文件和AutoLight.cginc文件中定义。第8章和第9章详细剖析这两个文件的实现。如果开发者在自己编写的着色器中需要实现某功能,或者在阅读第三方着色器代码时碰到这些文件中定义的函数和宏,可以查阅这两章。

近年来,能够产生更为逼真效果的基于物理的光照模型开始广泛应用在各大3D引擎中。第10章分析若干简单的光照模型,并从数学和物理原理上分析基于Cook-Torrance模型的光照模型的实现。Standard.shader文件则是基于物理光照模型的着色器的实现。第11章详细分析Standard.shader文件的实现,以及实现Standard.shader时要用到的分布在UnityStandardInput.cginc、UnityStandard Utils.cginc等文件中的工具宏和函数。

第12章是着色器编程实战案例。该章将使用Unity 3D着色器,在不使用任何纹理贴图的方式下,利用带符号距离场技术,通过片元着色器绘制一个名为“星夜之海”的动态场景。版式约定

代码段的格式如下。//文本块最左侧有一条竖线,表明这是一个代码块//代码中的行状注释用“//”符号开头//块状注释用“/**/”符号包含。代码中的Cg语言关键字加粗显示float3 a = float3(1.0,1.0,1.0);float3 b = float3(2.0,1.0,1.0);float3 c = dot(a,b);

原始代码中,原本是在一行中定义的,但由于纸面篇幅所限,会做一些换行处理。为了保持代码的严谨性,原始代码中的一些宏定义原本是没有转行声明符“\”的,在本书中会加上,例如:#if defined(UNITY_COMPILER_HLSLCC) && !defined(SHADER_API_GLCORE) #define UNITY_DECLARE_TEX3D_FLOAT(tex) Texture3D_float tex;\ SamplerState sampler##tex

上面的代码中,第二行末尾的“\”符号在原始代码中是不存在的。为了排版需要,把原来在一行的语句段分写成两行。在Cg语言中定义一个宏时,换行时要加上“\”符号。

本书引用的原始代码中,出于排版和剖析说明的原因,在保证不改变代码逻辑的前提下,会对原始代码做版面上的调整。例如,在原始文件中原本是书写成一行的代码,可能会变成多行书写;原来代码没有注释的地方,可能会在书中加上注释;原本有英文注释的地方,可能会换上中文注释。但为了便于读者对照着原始文件阅读本书,本书中引用的原始代码段所在原始文件中的名字、所在目录,以及在原始文件中的起始行和结束行都会在前面加上注释说明,如下所示。// 所在文件:UnityGlobalIllumination.cginc// 所在目录:CGIncludes// 从原文件第44行开始,至第49行结束inline void ResetUnityLight(out UnityLight outLight){ outLight.color = half3(0, 0, 0); outLight.dir = half3(0, 1, 0); //任意设置一个光线输出方向,不为空即可 outLight.ndotl = 0; //数据项未使用}提交勘误

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们,邮箱为zhangtao@ptpress.com.cn。

如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。关于异步社区和异步图书“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。异步社区微信服务号第1章 实时3D渲染流水线1.1 概述

在计算机体系结构中,管线(pipeline)可以理解为处理数据的[1]各个阶段和步骤。3D渲染流水线(render pipeline)接收描述三维场景的数据内容,经过若干阶段的处理,将其以二维图像的形式输出。渲染流水线有多种,本章讨论的是基于光栅器插值(rasterizer interpolation)的实时3D渲染流水线。

目前主流的实时3D渲染流水线有Direct 3D和OpenGL。这两种流水线在具体的实作上大体相同,但细节上的差异也很明显。因为Unity 3D是一个跨平台引擎,所以本章讨论的渲染流水线也不局限于某一家具体的实作,而是讨论各个实作共同的阶段和机制。在深入探讨时,也会分析Direct3D与OpenGL的差异。

渲染流水线一般可以分为如下阶段:顶点处理(vertex processing)、光栅化(rasterization)、片元处理(fragment processing)和输出合并(output merging)。顶点处理阶段对存储在顶点缓冲区(vertex buffer)中的各顶点执行各种操作,如坐标系变换等。光栅化阶段对由顶点构成并变换到裁剪空间(clip space)的多边形进行扫描插值,将这些多边形转换成一系列的片元集合。片元[2](fragment)是指一组数据值,这些数据最终用于对颜色缓冲区[3](color buffer)中的像素(pixel)颜色值、透明值,以及深度缓冲区(depth buffer)中的深度值进行更新。片元处理阶段对各个片元进行操作,确定每个片元的最终颜色值和透明值。输出合并阶段则是对片元与颜色缓冲区中的像素进行比较或合并操作,然后更新像素的颜色值和透明值。

实时3D渲染流水线发展至今已经很成熟,而且其组成阶段比上述4个阶段要多一些。尽管如此,上述4个阶段仍然是每一家实时3D渲染流水线实作的主要内容。其中,顶点处理与片元处理两个阶段是可编程的(programmable)。针对这些阶段的、由GPU执行的相关程序称为顶点着色器(vertex shader)和片元着色器(fragment shader)。顶点着色器可针对顶点执行任何转换操作;片元着色器可针对片元用各种方式决定其最终颜色值和透明值。图1-1所示为渲染流水线的基本阶段和流程,其中顶点处理阶段和片元处理阶段是可编程控制的;而光栅化阶段和输出合并阶段则由硬件以固定不可编程的方式实现。▲图1-1 渲染流水线的基本阶段和流程1.2 顶点处理阶段

3D渲染流水线的第一个阶段便是顶点处理阶段。本阶段将会读取描述三维场景内容的顶点信息并进行处理。在计算机图形学中,可以使用各种建模方案提供描述三维场景的顶点信息,常用和高效的方式是使用多边形网格(polygon mesh)去组织顶点。

不同3D渲染流水线的实作,所支持的组成网格的多边形种类有[4]所不同,但都需要使用凸多边形(convex polygon)。在实践中大都使用三角形网格,如图1-2所示。当使用三角形网格对表面进行近似模拟时,可以考虑使用多种细分(tessellation)处理方法。当三角形的细分程度越高时,网格就越接近原始表面,处理时间也会随之增加。因此,在实践中要根据当前硬件条件和开发需求选择一个折中的方案。▲图1-2 利用三角形网格组织顶点1.2.1 顶点的组织方式

描述三角形网格的常见方法有多种,其中一个是列举顶点,即顺序读取3个顶点构成一个三角形。存储顶点的内存区域即1.1节介绍的顶点缓冲区。如图1-3所示,缓冲区内的顶点可以定义3个三角形,这种表达方式称为三角形列表(triangles list)。三角形列表的方式比较直观,但显然缓冲区中的顶点信息存在冗余。非索引方式的三角形列表,一个网格如果包含n个三角形,则顶点缓冲区中有3n个顶点。在图1-3中,3个三角形同时拥有(1,1,0)处的顶点,且该顶点在缓冲区中重复出现了3次。▲图1-3 三角形列表

在三角形网格中,一个顶点经常被多个三角形共享。因此,可以给每个顶点都分配一个整数索引值,记录三角形的方式可以从直接记录顶点本身变成记录顶点索引,以减少数据冗余,让每一个顶点在顶点缓冲区中只需要存储一份。顶点索引则存储在索引缓冲区(index buffer)中,如图1-4所示。▲图1-4 索引方式的三角形列表,索引缓冲区负责存储三角形用到的顶点编号信息

图1-4中的顶点只包含了位置信息,乍一看,顶点缓冲区中节省出来的空间也得要用在索引缓冲区上。在实际应用中,除了位置信息外,顶点缓冲区中存储的信息还包含法线(normal)、纹理映射坐标(texture mapping coordinate);如果是用作动画模型的顶点,那么还有骨骼权重(bone weight)等。因此,当顶点数量很大时,如果使用索引方式,那么顶点缓冲区冗余数据的减少量是非常可观的。1.2.2 坐标系统和顶点法线的确定方式

描述空间方位的坐标系有多种,如极坐标系、球面坐标系和笛卡儿坐标系等。在3D渲染流水线中,使用最广泛的是笛卡儿坐标系。笛卡儿坐标系可以分为左手坐标系和右手坐标系。当左手大拇指或右手大拇指指向坐标系z轴正方向时,其余四指指尖的环绕方向,就是坐标系x轴绕向y轴的方向,满足这一规则的笛卡儿坐标系即称为左手坐标系或右手坐标系,如图1-5所示。▲图1-5 笛卡儿坐标系

在光照计算中需要使用法线。法线既可以是一个顶点的法线,也可以是一个多边形的法线。首先探讨一个三角形的法线。在右手坐标系中定义一个三角形的法线朝向,使用右手法则定义,即右手四指围拢,按照组成三角形3个顶点在缓冲区中先后排列顺序围拢四指,此时右手拇指的朝向就是三角形的法线方向;在左手坐标系中,则使用左手法则定义,方法和右手法则相同,左手拇指的朝向就是三角形的法线方向。

如图1-6所示,三角形处于右手坐标系下,其3个顶点、、在顶点缓冲区中以的顺序排列,那么采用右手.法则,使右手四指按顶点先后排列顺序的走向弯曲,得到图1-6所示的三角形法线朝向。▲图1-6 确定三角形法线朝向

在给定了顶点排列顺序之后,用向量叉积运算可以计算出法向量的值。依然以图1-6为例,假设连接p和p形成边向量v,连接p和12121p形成边向量v。利用两个边向量的叉积,可以得到垂直于两个边313向量的向量。用向量除以它自己的长度便得到单位化(normalized,又称为规格化)的法向量。(1-1)

必须注意的是,向量的叉积运算是不满足交换律的。式(1-1)中v和v如果交换叉积运算顺序,就相当于图1-6的顶点在缓冲区中1213的排列顺序变为,此时法向量的计算公式应该为(1-2)

依据向量叉乘的性质,式(1-1)和式(1-2)得出的向量的方向是相反的。由此可知,给定三角形的法向量主要依赖于该三角形顶点的排列顺序。的排列顺序称为逆时针方向(counter clockwise,CCW),的排列顺序称为顺时针方向(clockwise,CW)。另外,在右手坐标系中以某种顶点排列顺序形成的三角形,不改变顶点排列顺序地放在左手坐标系中时,其法线也和在右手坐标系时相反。如果把法线朝向方定义为三角形外表面,法线朝向方相反方向定义为内表面,则当把顶点数据从左(右)手导入右(左)手坐标系时,会产生内外表面相反的情况。如图1-7所示,图1-7(a)是右手坐标系,三角形的顶点按的顺序排列,此时三角形的法线朝外;图1-7(b)是左手坐标系,如果保持按的顺序排列,此时三角形的法线则朝里。

因此,要解决图1-7揭示的三角形的内外表面反转的问题,需要重新调整顶点在缓冲区中的排列顺序。图1-7(a)中右手坐标系的顶点,在图1-7(b)的左手坐标系下排列顺序改为即可解决问题。▲图1-7 右手坐标系和左手坐标系

在实际开发中,顶点的法线就更为重要一些。大部分建模软件在编辑模型时就可以直接指定顶点法线。与三角形的法线就是该三角形所在平面垂直的向量不同,理论上一个顶点的法线可以是过该点的任意一条射线。一般情况下,某顶点的法线通常通过共享该顶点的三角形法线进行计算,如图1-8所示。法线n的计算公式如下。▲图1-8 顶点的法线n共享该顶点的三角形法线

除了后面将要介绍的观察空间使用右手坐标系外,Unity 3D中的其他空间均使用左手坐标系。1.2.3 把顶点从模型空间变换到世界空间

1.2.2节提到的顶点数据的创建方式,用于创建包含顶点数据的多边形网格的坐标系称为模型坐标系(model coordinate),坐标系所[5]对应的空间称为模型空间(model space)。在顶点处理阶段,顶点数据将会贯穿多个空间,直至到达裁剪空间(clip space),如图1-9所示。▲图1-9 顶点处理的变换操作和对应的空间1.仿射变换和齐次坐标

图1-9中的世界变换和观察变换由缩放变换(scale transform)、旋转变换(rotation transform)和平移变换(translation transform)这3种变换组合而成。其中,缩放变换和旋转变换称为线性变换(linear transform),线性变换和平移变换统称为仿射变换(affine transform)。投影变换所用到的变换则称为射影变换。

三维的缩放变换可以用一个3×3矩阵M描述:scale(1-3)式中,scale、scale和scale表示沿着x、y、z轴方向上的缩放系数。xyz如果全部缩放系数都相等,那么该缩放操作称为均匀缩放操作;否则,称为非均匀缩放操作。

如果是均匀缩放操作,那么Unity 3D会定义一个名为UNITY_ASSUME_UNIFORM_SCALING的着色器多样体(shader variant,3.4节会详述此概念,目前可以将其视为一个“宏”)。着色器代码将会根据此多样体是否定义了执行不同的操作。如果UNITY_ASSUME_UNIFORM_ SCALING未被启用,当把顶点从模型空间变换到世界空间中,或者从世界空间变换到观察空间中时,需要对顶点的法线做一个操作,使得它能正确地变换。4.2.4节会详述此问题。

Unity 3D中使用列向量和列矩阵描述顶点信息,所以可以把顶点的坐标值右乘缩放矩阵实现缩放操作,如下:(1-4)

式(1-4)表示把位置点(由于排版的原因,本书将会在正文中用“行向量的转置”的方法描述一个列向量)进行缩放操作,变换得到新坐标值。

要定义一个三维旋转操作,需要定义对应的旋转轴。当某向量分别绕坐标系的x、y、z轴旋转角度时,分别有以下旋转矩阵M、M、rxryM。rz

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载