1、向量的定义
向量是有方向又有大小的有向线段,向量没有位置,只有大小和方向。
2、向量的相关计算
v
⃗
=
(
x
,
y
)
\vec{v}=(x,y)
v=(x,y)
2.1、标量与向量的计算
可乘除,不可加减
v ⃗ ∗ a = ( a ∗ x , a ∗ y ) \vec{v}*a=(a*x,a*y) v∗a=(a∗x,a∗y)
2.2、向量的模长
∣ v ∣ = x 2 + y 2 | v|=\sqrt {x^{2}+y^{2}} ∣v∣=x2+y2
2.3、标准化向量
大小为1的向量
n ⃗ = v ⃗ x 2 + y 2 \vec{n}={ \vec{v}\over \sqrt {x^{2}+y^{2}}} n=x2+y2v
2.4、向量与向量的加减计算
加减计算公式:
(
x
1
,
y
1
)
±
(
x
2
,
y
2
)
=
(
x
1
±
x
2
,
y
1
±
y
2
)
(x1,y1)\pm(x2,y2)=(x1 \pm x2,y1\pm y2)
(x1,y1)±(x2,y2)=(x1±x2,y1±y2)
向量相加
A
B
⃗
\vec{AB}
AB +
B
C
⃗
\vec{BC}
BC=
A
C
⃗
\vec{AC}
AC
向量相减
A
B
⃗
\vec{AB}
AB -
A
C
⃗
\vec{AC}
AC =
C
B
⃗
\vec{CB}
CB
2.5、计算两点间的距离
a
⃗
=
(
x
1
,
y
1
)
b
⃗
=
(
x
2
,
y
2
)
\vec{a}=(x1,y1) \vec{b}=(x2,y2)
a=(x1,y1)b=(x2,y2)
(
x
1
−
x
2
)
2
+
(
y
2
−
y
1
)
2
\sqrt {(x1-x2)^{2}+(y2-y1)^{2}}
(x1−x2)2+(y2−y1)2
a到b点的距离=
(
x
1
−
x
2
)
2
+
(
y
2
−
y
1
)
2
\sqrt {(x1-x2)^{2}+(y2-y1)^{2}}
(x1−x2)2+(y2−y1)2
应用于计算一个向量到另外一个向量的距离,a到b的距离=b-a
向量的加减原则,参考链接:https://blog.csdn.net/deepdsp/article/details/19631195
2.6、向量的点积
结果为一个标量
a·b=|a||b|cosθ
计算公式(ax,ay).(bx,by)=(ax.bx+ay.by)
几何意义:点乘的结果描述了两个向量的相似程度,点乘结果越大夹角角度越小,两个向量越接近。
a.b | θ | a和b |
---|---|---|
>0 | 0<=θ<90 | 方向基本相同 |
=0 | θ=90 | 方向垂直 |
<0 | 90<θ<=180 | 方向基本相反 |
应用示列:兰伯特关照模型是最简单通用的模拟漫反射的光照模型
我看到一个博主关于兰伯特光照模型的原理写的非常清晰,浅存一下
https://gameinstitute.qq.com/community/detail/125867
自己参考网上的例子做了一个基本版的兰伯特光照模型,参考链接:
https://blog.unity.com/technology/custom-lighting-in-shader-graph-expanding-your-graphs-in-2019
https://docs.unrealengine.com/4.26/zh-CN/RenderingAndGraphics/Materials/ExpressionReference/Math/
2.7、向量的叉乘
几何解释:叉乘得到的向量垂直于原来的两个向量
向量叉乘的大小和方向
∣ a × b ∣ = ∣ a ∣ ∣ b ∣ s i n θ |a \times b|=|a||b|sin\theta ∣a×b∣=∣a∣∣b∣sinθ
关于向量的方向和大小,这个博主写的非常详细和易懂,浅存一下
https://www.laowangomg.com/?p=673
最后附上一个自己写的小应用
public Transform a;
public Transform b;
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
Vector3 posA = a.position;
Vector3 posB = b.position;
float f=Vector3.Dot(a.transform.forward, posB - posA);//点乘判定是在前方还是后方
Vector3 b3 = Vector3.Cross(a.transform.forward, posB - posA);//叉乘判定是在左边还是右边
float f2 = Vector3.Angle(a.transform.forward, posB - posA);//得到两者间的角度
if (f > 0 && b3.y > 0)
{
Debug.Log("B球在A球右前方" + f2 + "度");
}
if (f > 0 && b3.y < 0)
{
Debug.Log("B球在A球左前侧");
}
if (f < 0 && b3.y > 0)
{
Debug.Log("B球在A球右后方");
}
if (f < 0 && b3.y < 0)
{
Debug.Log("B球在A球左后方");
}
}
}
最后鼓励一下自己
无人问津也好,技不如人也罢
你都要试着安静下来,去做自己该做的事
而不是让内心烦躁,焦虑
毁掉你本来就不多的热情和定力
昨日之深渊,今日之浅谈
路虽远,行则将至
事虽难,做则可成