向量的基本定义
💡 向量(vector)描述了方向和大小。向量也有自己的运算规则
向量的加减法与数乘的意义见下图
在Unity中有三类向量,如下图所示
向量的加法
💡 将向量的对应分量进行相加即可
向量的减法
💡 将向量对应的分量相减,谁是被减数,结果向量就指向谁
向量和标量的乘法
💡 将标量与向量当中的每个分量相乘 如上图所示,得到的结果方向没有改变,长度变为原来的2倍
向量的规范化(归一化)
用向量的每一个分量,取除以其模长
“在计算两个向量的点积之前应用归一化。归一化一个向量包括两个步骤"
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
💡 点积的结果是一个标量值
向量点积的几何意义
💡 两个向量形成的夹角大于等于0并且小于90度,点积的结果大于0 形成的夹角大于90度,点积的结果小于0 形成的夹角为90度,点积结果为0
向量的叉积Cross
💡 两个向量的叉积,其结果仍是一个向量,其结果向量的方向垂直于原来的两个向量 叉积相乘的顺序不同,其结果也不同
对于向量a和向量b
a和b的叉积公式
叉积的几何意义
💡 在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。
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坐标系。如下图所示
在二维空间中,叉乘还有另外一个几何意义就是:aXb等于由向量a和向量b构成的平行四边形的面积


...