向量的基本定义

💡 向量(vector)描述了方向和大小。向量也有自己的运算规则

向量的加减法与数乘的意义见下图

Untitled

在Unity中有三类向量,如下图所示

Screenshot 2022-12-27 at 6.56.45 PM.png

向量的加法

Screenshot 2022-12-27 at 6.58.27 PM.png

💡 将向量的对应分量进行相加即可

向量的减法

Screenshot 2022-12-27 at 7.03.53 PM.png

💡 将向量对应的分量相减,谁是被减数,结果向量就指向谁

向量和标量的乘法

Screenshot 2022-12-27 at 7.07.07 PM.png

💡 将标量与向量当中的每个分量相乘 如上图所示,得到的结果方向没有改变,长度变为原来的2倍

向量的规范化(归一化)

用向量的每一个分量,取除以其模长

“在计算两个向量的点积之前应用归一化。归一化一个向量包括两个步骤"

RSL: Edge Effects

1   计算它的长度,然后,

2   然后将它的每个(xy 或 xyz)分量除以它的长度.

Given vector **a**  its xyz components are calculated as follows

 x = ax/|a|
 y = ay/|a|
 z = az/|a|

As a “worked example” the vector shown in figure 1 has the xyz components of 3, 1, 2 and a length of 3.742. Therefore, a normalized copy of the vector will have components,

 x = 3.0 / 3.742 =0.802
 y = 1.0 / 3.742 =0.267
 z = 2.0 / 3.742 =0.534

💡 计算向量的长度,|v| = sqrt(x^2+ y^2+…)

向量的点积Dot

Screenshot 2022-12-27 at 7.25.38 PM.png

💡 点积的结果是一个标量值

向量点积的几何意义

Screenshot 2022-12-27 at 7.34.08 PM.png

Screenshot 2022-12-27 at 7.34.36 PM.png

💡 两个向量形成的夹角大于等于0并且小于90度,点积的结果大于0 形成的夹角大于90度,点积的结果小于0 形成的夹角为90度,点积结果为0

向量的叉积Cross

Screenshot 2022-12-28 at 3.53.26 PM.png

💡 两个向量的叉积,其结果仍是一个向量,其结果向量的方向垂直于原来的两个向量 叉积相乘的顺序不同,其结果也不同

对于向量a和向量b

对于向量a和向量b

Untitled

a和b的叉积公式

a和b的叉积公式

Untitled

Screenshot 2022-12-28 at 3.58.04 PM.png

叉积的几何意义

💡 在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。

Screenshot 2022-12-28 at 4.09.00 PM.png

using UnityEngine;

[ExecuteInEditMode]
public class VectorTest1 : MonoBehaviour
{
 MeshRenderer \_renderer;
 MeshFilter \_filter;
 Mesh \_mesh;
 void Awake()
 {
 if (!TryGetComponent(out \_renderer))
 \_renderer = gameObject.AddComponent();
 if (!TryGetComponent(out \_filter))
 \_filter = gameObject.AddComponent();
 
 }
 
 [ContextMenu("Generate")]
 private void Generate()
 {
 GenerateTriangle();
 \_renderer.sharedMaterial = new Material(Shader.Find("Standard"));
 \_filter.sharedMesh = \_mesh;
 }

 private void GenerateTriangle()
 {
 \_mesh = new Mesh();
 Vector3[] vertices = new Vector3[3];
 vertices[0] = new Vector3(0, 1, 0);
 vertices[1] = new Vector3(1, -1, 0);
 vertices[2] = new Vector3(-1, -1, 0);
 \_mesh.vertices = vertices;
 \_mesh.triangles = new[]
 {
 0,1,2//遍历的顺序会影响三角面的朝向 
 };

 Vector3[] normals = new Vector3[3];

 var V\_BA = GetDir(vertices[1], vertices[0]);
 var V\_CA = GetDir(vertices[2], vertices[0]);
 normals[0] = Vector3.Cross(V\_BA, V\_CA);

 var V\_CB = GetDir(vertices[2], vertices[1]);
 var V\_AB = GetDir(vertices[0], vertices[1]);

 normals[1] = Vector3.Cross(V\_CB, V\_AB);
 
 var V\_AC = GetDir(vertices[0], vertices[2]);
 var V\_BC = GetDir(vertices[1], vertices[2]);
 
 normals[2] = Vector3.Cross(V\_AC, V\_BC);

 \_mesh.normals = normals;
 }

 private Vector3 GetDir(Vector3 v1, Vector3 v2)
 {
 return v1 - v2;
 }
}

在3D图像学中,叉乘的概念非常有用,可以通过两个向量的叉乘,生成第三个垂直于a,b的法向量,从而构建X、Y、Z坐标系。如下图所示

Untitled

在二维空间中,叉乘还有另外一个几何意义就是:aXb等于由向量a和向量b构成的平行四边形的面积