这里不多介绍关于向量的加减乘除的原理,只是介绍 Unity3d里关于向量的给好的方法和属性,利用这些方法和属性我们就可以得到向量加减 叉乘点乘 除法的计算。
1、获得向量的大小,在 Unity 中给出了两个方法。
- 通过magnitude属性,得到向量的大小。
- 通过 Vector3.Magnitude方法,得到向量的大小。
Vector3 a = new Vector3(3, 4, 5);
float b = Vector3.Magnitude(a);
float c = a.magnitude;
print("获取长度的两种方法:" + b + "::::" + c);
2、Distance Vector3的方法,返回float 型,得到两个向量之间的距离。
Vector3 a = new Vector3(3, 4, 5);
Vector3 b = new Vector3(5, 6, 7);
float c = Vector3.Distance(a, b);
print(c);
3、向量的加法减法,当然得到的依然是个 Vector3向量。
Vector3 v1 = new Vector3(2, 3, 4);
Vector3 v2 = new Vector3(3, 4, 9);
Vector3 v3 = v1 + v2;
Vector3 v4 = v1 - v2;
print("加法" + v3);
print("减法" + v4);
4、向量乘以除以数字
Vector3 v5 = v1 * 0.1f;
print("乘以数字" + v5);
Vector3 v6 = v2 / 10;
print("除以数字" + v6);
5、向量归一化(向量转为单位向量(方向不变,长度变为1)),Unity 给出了属性normalized和方法 Normalize
相同和区别:
- normalized ,Normalize都是使向量归一化。
- normalized属性获得归一化向量,不会改变原向量。
- Normalize有两种用法:第一种用法 Vector3.Normalize(c);不会改变向量 c,只会返回一个归一化向量;第二种用法e.Normalize();直接用向量 e 调用该方法,这样会改变 e 向量,使 e 变为归一化的向量
Vector3 a = new Vector3(3, 4, 8);
Vector3 b = a.normalized;
print(b);
print(b.magnitude);
Vector3 c = new Vector3(5, 7, 9);
Vector3 d = Vector3.Normalize(c);
print(c);
print(d);
Vector3 e = new Vector3(8, 9, 5);
e.Normalize();
print(e);
6、向量的叉乘Cross,Vector3的方法,返回的是 Vector3向量。而在实际数学中叉乘得到的是一个数字,|c|=|a||b|sin<a,b> ,那么这里我们还可以在利用unity 给出的属性a.normalized获得叉乘的模长。
//两个向量叉乘
Vector3 a = new Vector3(3, 5, 7);
Vector3 b = new Vector3(5, 8, 2);
Vector3 c = Vector3.Cross(a, b);
print(c.magnitude);
float angle1 = Mathf.Asin(Vector3.Cross(a.normalized, b.normalized).magnitude) * Mathf.Rad2Deg;
float angle2 = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized))) * Mathf.Rad2Deg;
print(angle1);
print(angle2);
7、点乘。|c|=|a||b|cos<a,b>。返回 float 型。
Vector3 a = new Vector3(8, 9, 10);
Vector3 b = new Vector3(2, 4, 6);
float c = Vector3.Dot(a, b);
print(c);
float angle = Mathf.Acos(Vector3.Dot(a.normalized, b.normalized)) * Mathf.Rad2Deg;
print(angle);
8、Lerp方法。返回从 a 点到 b 点的中间的某个点。应用在平缓移动以及相机跟随。
- Vector3.Lerp(a,b,0),返回的是 a 的位置
- Vector3.Lerp(a,b,1)返回的是 b 的位置。
- Vector3.Lerp(a,b,0.5)返回的是 a、b 中间的位置。
i、打印Vector3.Lerp的值
Vector3 a = new Vector3(3, 4, 5);
Vector3 b = new Vector3(6, 7, 8);
Vector3 c = Vector3.Lerp(a, b, 0);
print("0:::返回的是 a" + c);
Vector3 d = Vector3.Lerp(a, b, 1);
print("1::: 放回的 b" + d);
Vector3 e = Vector3.Lerp(a, b, 0.5f);
print("0.5::::返回的是a、b 中间的位置" + e);
ii、在场景中移动,Cube 向 Shpere 移动
GameObject Cube;
GameObject Sphere;
// Use this for initialization
void Start () {
Cube = GameObject.Find("Cube");
Sphere = GameObject.Find("Sphere");
}
// Update is called once per frame
void Update () {
transform.position = Vector3.Lerp(Cube.transform.position,Sphere.transform.position,Time.deltaTime);
}