数学基础——向量

什么是向量

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"
}
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值