什么是向量
1.向量的定义
向量是有大小和方向的有向线段。
向量没有位置,只有大小和方向。
向量的箭头是向量的结束点,尾巴是向量的起始点。
向量描述的位移能被认为是与轴平行的位移序列。
向量表示:三维(ax,ay,az) 二维(ax,ay)。
2.向量与标量
向量:有大小和方向的有向线段。
标量:只有大小,没有方向的量。
3.向量与点
向量和点数学形式上相等,但几何意义完全不同。
点:有位置,没有实际大小或方向。
向量:无位置,有实际大小和方向。
任何一个点都可以看作是从原点出发的向量。
4.零向量
零向量是唯一大小为零的向量。
零向量是唯一一个没有方向的量。
零向量不是一个点,因为没有定义某个位置。
零向量表示的是没有位移。
如何计算
1.标量与向量之间的计算
不可加
不可减
可乘:将向量的每个分量与标量相乘即可
可除:将向量的每个分量与标量的倒数相乘
几何解释:向量乘以标量的效果是以标量的大小缩放向量的长度,负值则方向相反
例子:-2 *(2,-5)=(-4,10) (6,-2,-4)/ 2 = (3,-1,-2)
2.向量的模长
几何解释:当我们将所示向量作为斜边构建一个直角三角形,所示向量的大小(模长)即可通过勾股定理推出
计算公式:||v|| = pow(pow(x,2)+pow(y,2),0.5);
3.标准化向量
标准化向量(单位向量)就是大小为1的向量。(适用范围:仅需要知道方向而不关心其大小,例如法线)
运算法则:将向量除以她的大小(模长),vnormal = v / ||v|| ,v ≠ 0(API:normalize(Vector3))
例子:标准化向量(12,-5),(12,-5)/ pow(pow(12,2)+pow(-5,2),0.5) = (0.923,-0.358)
4.向量的加减法
计算公式(ax,ay)+(bx,by) = (ax+bx,ay+by)
加法:对应位置相加 例:(1,-4)+(7,3)=(8,1)
减法:对应位置相减 例:(-3,6)-(-4,3)=(1,3)
几何解释:假设有向量(ax,ay)和(bx,by),a向量加b向量最后得到的是从a向量起点到b向量结束之间形成的新的向量
5.两点间的距离
它们只表示有一个“第一”点和一个“第二点”,也就是说,你有两点。哪一个称之为“第一”或“二”。不管怎样,距离都是一样的。
6.向量的点积
计算公式:a⋅b=ax∗bx+ay∗by
向量点乘就是分量乘积的和,结果是一个标量,并满足乘法交换律
几何解释:点乘记过描述了两个向量方向的“相似”程度,点乘结果越大,夹角角度越小,两个向量越接近(反馈到渲染上就是面的明暗效果)
计算公式: a · b = |a||b|cosΘ
a∙b>0→方向基本相同,夹角在0°到90°之间
a∙b=0→ 正交,相互垂直
a∙b<0→ 方向基本相反,夹角在90°到180°之间
7.兰伯特光照模型
兰伯特光照模型是目前最简单通用的模拟漫发射的光照模型
使光照方向的反方向为 L 向量,法线方向为 N 向量,则有:
L 与 N 方向相同,则Normal · Light = 1(纯亮)
L 与 N 方向相反,则Normal · Light = -1(纯黑)
L 与 N 方向垂直,则Normal · Light = 0(纯黑)
7.向量的叉积
其运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。
定义:向量a与b的叉积a×b是一个向量,其长度等于|a×b| = |a||b|sin∠(a,b),其方向正交于a与b。并且,(a,b,a×b)构成右手系。
特别地,0×a = a×0 = 0.此外,对任意向量a,a×a=0。
反称性:a × b = -b × a
线性:(λa + μb) × c = λ(a ×c) + μ(b ×c)
Shader "URP/URPLambert"
{
Properties
{
_Diffuse("Diffuse",Color)=(1,1,1,1)
}
SubShader
{
Tags{"RenderPipeline"="UniversalRenderPipeline" "RenderType"="Opaque"}
HLSLINCLUDE
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
half4 _Diffuse;
CBUFFER_END
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
half3 worldNormal : TEXCOORD0;
};
ENDHLSL
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
v2f vert(a2v v)
{
v2f o;
o.pos=TransformObjectToHClip(v.vertex);
o.worldNormal = TransformObjectToWorldNormal(v.normal);
return o;
}
half4 frag(v2f i):SV_Target
{
half3 ambient = _GlossyEnvironmentColor.xyz;
half3 worldNormal = normalize(i.worldNormal);
half3 worldLightDir = normalize(_MainLightPosition.xyz);
half halfLambert = dot(worldNormal, worldLightDir) ;
//half halfLambert = dot(worldNormal, worldLightDir)*0.5+0.5;
half3 diffuse = _MainLightColor.rgb * _Diffuse.rgb * halfLambert;
half3 color = ambient + diffuse;
return half4(color, 1.0);
}
ENDHLSL
}
}
FallBack "Lit"
}