[Unity3D]Shader学习笔记之点和矢量

来源:互联网 发布:淘宝是网站吗 编辑:程序博客网 时间:2024/05/16 19:00

简介

  • 点(point)是n维空间(游戏中主要使用二维和三维空间)中的一个位置,它没有大小、宽度这类概念
  • 矢量(vector,也被称为向量)是指n维空间中一种包含了模(magnitude)和方向(direction)的有向线段。速度(velocity)就是一种典型的矢量。
    • 矢量的模指的是这个矢量的长度。一个矢量的长度可以是任意的非负数。
    • 矢量的方向则描述了这个矢量在空间中指向。
    • 矢量的头(head)指的是它的箭头所在的端点出,而尾(tail)指的是另一个端点。
    • 只要矢量的模和方向保持不变,无论在哪里,都是同一个矢量。
  • 标量(scalar)只有模没有方向。例如距离(distance)就是一种标量。

      任何一个点都可以表示成一个从原点出发的矢量。

矢量的运算

矢量和标量的乘法/除法

  只需要把矢量的每个分量和标量相乘即可。

kv=(kvx,kvy,kvz)

  一个矢量也可以被一个非零的标量除。这等同于和这个标量的倒数相乘。

vk=(x,y,z)k=1k(x,y,z)=(xk,yk,zk),k0

  对于乘法来说,矢量和标量的位置可以互换的。但对于除法,只能是矢量被标量除,而不能是标量被矢量除,这是没有意义的。
  k<0时,矢量的方向也会取反

矢量的加法和减法

  两个矢量进行相加或相减,其结果是一个相同维度的新矢量。

a+b=(ax+bx,ay+by,az+bz)

ab=(axbx,ayby,azbz)

  二维矢量的加法和减法,如图:

这里写图片描述

  在图形学中,矢量通常用于描述位置偏移(即位移)。因此可以用矢量的加法或减法来计算一点相对于另一点的位移。
  如果想计算b点相对于a点的位移,就可以通过把b和a相减得到。

矢量的模

  三维矢量计算公式如下:

v=v2x+v2y+v2z

  其他维度同理可得,对每个分量的平方相加后再开根号得到

单位矢量

  单位矢量指的是模为1的矢量,也称为被归一化的矢量(normalized vector)。
  对任何非零矢量转换成单位矢量的过程被称为归一化(normalized)。
  对矢量的归一化,可以使用该矢量除以该矢量的模得到,如下:

v^=vv,v

零矢量

  零矢量即矢量的每个分量值都是0,如v=(0,0,0)是不可被归一化的。这是因为做除法运算时分母不能为0。

矢量的点积

  点积(dot product)也称为内积(inner product)。
  点积的名称来源于这个运算符号:ab。中间的这个圆点符号是不可以省略的。
  
  公式一:两个三维矢量的点积是把两个矢量对应的分量相乘后再取和,最后是一个标量。

ab=(ax,ay,az)(bx,by,bz)=axbx+ayby+azbz

  矢量的点积满足交换律ab=ba
  点积的几何意义很重要,其中一个就是投影(projection)
  有一个单位矢量a^和另一个长度不限的矢量b。我们希望得到b在平行于a^的一条直线上的投影。那么,我们可以使用点积a^b来得到b在a^方向上的有符号的投影。
  当投影的值小于0时,夹角大于90。等于0时,夹角为90,相互垂直。大于0时,夹角小于90

an image

  性质一:点积可结合标量乘法。

(ka)b=a(kb)=k(ab)

  性质二:点积可结合矢量加法和减法。

a(b+c)=ab+ac

  性质三:一个矢量和本身进行点积的结果,是该矢量的模的平方。

vv=vxvx+vyvy+vzvz=v2

  公式二:

ab=(aa^)(bb^)=ab(a^b^)=abcosθ

  推理得:两个单位矢量的点积等于它们之间的夹角的余弦值。当夹角小于90时,cosθ>0;当夹角等于90时,cosθ=0;当夹角大于90时,cosθ<0

a^b^==cosθ

ab=(aa^)(bb^)=ab(a^b^)=abcosθ

  利用这两个公式,还可以求得两个向量之间的夹角(在0~180°)

θ=arcos(a^b^)a^b^

这里写图片描述

矢量的叉积

  叉积(cross product),也被称为外积(outer product)。矢量叉积的结果仍然是一个矢量。
  和点积类型,叉积的名称来源于它的符号:a×b。同样这个符号是不能省略的。两个矢量的叉积可用如下公式计算:

a×b=(ax,ay,az)×(bx,by,bz)=(aybzazby,azbxaxbz,axbyaybx)

  叉积不满足交换律,即a×ba×b
  叉积满足反交换律,即a×b(a×b)
  叉积不满足结合律,即(a×b)×ca×(b×c)
  
  a×b的长度等于a和b的模的乘积再乘以它们之间夹角的正弦值。公式如下:

a×b=absinθ

  用a和b构建一个平行四边形,其面积可以使用bh来得到,即底乘以高。而h又可以使用a和夹角θ来得到,即

A=bh=b(asinθ)=absinθ=a×b

  如果a和b平行(方向可能相同可能相反),可以认为构建出来的平行四边形的面积为0,那么a×b=0,这里得到的是向量0,而不是标量0。

这里写图片描述

  根据左右手坐标系的不同,叉积求得的垂线的方向也不同,如下:

这里写图片描述

这里写图片描述

0 0
原创粉丝点击