Unity(Vector3)

341 阅读4分钟

#一、描述 此课程说明Vector3的一些方法的介绍以及一些好用的api

#二、Vector介绍

示例图,可以以这种角度来理解

using UnityEngine;
using System.Collections;

public class CubeController : MonoBehaviour {


	//自身隐藏
	public void hideSelf(){
		//x y z
		Vector3 vector3 = new Vector3();
		float x = vector3.x;
		float y = vector3.y;
		float z = vector3.z;

		//获取vector3的单位向量

		//此方法会让vector3长度变成1,方向不变
		vector3.Normalize();

		//此方法返回vector3方向上的单位长度,但是vector3本身不会发现改变
		float normal = vector3.normalized;

		//返回vector3的长度 n = (x * x + y * y + z * z ),最后对n进行开方 
		float magnitude = vector3.magnitude;
                
        //返回这个向量的平方大小,还没有开方获得向量的长度,n = (x * x + y * y + z * z )
        float sqr = vector.sqrMagnitude

		// 下列的理解可以以此场景想象,比如一个球体,你观看他的位置应该是这样的:x轴箭头往右,Y箭头往上,z箭头往前,这符合数学坐标图,这样你就可以想象的出
		//以下的属性了!
		Vector3 up = Vector3.up; 			//up是Y轴上的正方向的的单位向量, x = 0 y = 1 z =0
		Vector3 down = Vector3.down; 		//down是Y轴的负方向上的单位向量  x = 0 y = -1 z = 0
		Vector3 left = Vector3.left; 		//left是x轴的负方向上的单位向量  x = -1 y = 0 z = 0
		Vector3 right = Vector3.right;		//right是x轴的正方向的单位向量  x = 1 y =0 z = 0
		Vector3 forward = Vector3.forward;	//forward是z轴正方向的单位向量 x =0 y =0 z = 1
		Vector3 back = Vector3.back;		//back是z轴负方向的单位向量    x = 0 y = 0 z = -1
		Vector3 zero = Vector3.zero; //此方法返回的是原点 0 0 0


		Vector3 vector1 = new Vector3(1f,2f,3f);
		Vector3 vector2 = new Vector3 (2f,3f,4f);
		//求两个向量的夹角
		Vector3.Angle (vector1,Vector2);

		//求两个向量的距离
		Vector3.Distance (vector1, Vector2);

		//向量点乘
		Vector3.Dot (vector1, Vector2);

		//向量插乘
		Vector3.Cross (vector1,vector2);

	}

}

补充:

Vector3向量有两种表现形式: 1 位置,坐标 2 方向

位置可以说明一个物体在一个世界坐标或者本地坐标中的绝对位置,比如Vector3(1,0,0),说明他在原点位置右移一个单位的坐标,用于表示一个物体的位置。

Vector3也可以作为一个方向来表示,比如Vector3(1,0,0),这个坐标的x轴是1,代表他往右移动一个单位,他的方向就是右 再比如Vector3(1,1,1),x,y,z都各自移动了一个单位,说明他的方向是右上方向移动,因为他x一直往右,y一直往上移动,z一直往前,这样就代表了一个方向,可以用于跟标量进行计算,计算出他要行走的路程。

####归一化 Vector3.normalized 归一话可以以Vector3的方向来举例,比如Vector3(3,0,8),这一看就知道是右斜方移动,但是为了便于计算,可以对这个向量进行归一化,把他们都归成1,0的归一还是0,最后的结果是Vector3(1,0,1),这样的表达方式和未归一化的表达方式是一至的,都只是为了表现出一个方向而已,但是为了方便计算,用归一化来更有效率。

示例: 时钟的钟盘上通常有时针,分针,秒针,这三根针,大部分时间,这三根针所指的方向不同,并且这三根针的长度也不同(时针最短,分针居中,秒针最长),归一化,就是把这三根针的长度变成一样的标准长度(这里标准长度是1),而不干涉这三根针的指向。

Vector3相加: 两个Vector3相加,会得到一个新的Vector3坐标,就比如Vector3(1,0,0)加上Vector3(1,0,0),结果就是Vector3(2,0,0),这个新的坐标位置就产生了改变,在原先的位置上又右移了一个单位。

Vector3相减: 两个Vector3相减,他们的结果是一个方向!用第二个向量减第一个向量,能够知道第一个向量指向第二个向量的方向是怎么样的!这种情况适用于枪口,比如在一把枪上,设立两个空的物体,物体1和物体2,我们现在要确定枪口对准的方向,只要用物体2减去物体1,就能得到枪口的方向了!

点乘:

Vector3.dot(Vector3 v1,Vector3 v2)

这个点乘根据两个物体向量位置,计算出他们的夹角的角度是多少!适用于Ai的可视范围或者巡查角度范围

####叉乘: Vector3.cross(Vector3 v1,Vector3 v2,Vector3 v3) 这个是根据三个向量,计算出法线来

public Unity3d cross(Unity3d unity){
		Unity3d old = new Unity3d (this.x,this.y,this.z);
		Unity3d news = unity;
		Unity3d result = new Unity3d (old.y * news.z - old.z * news.y, old.z * news.x - old.x * news.z, old.x * news.y - old.y * news.x);
		return result;
	}

Vector3.Lerp(Vector3 a, Vector3 b, float t): 这个用于计算两个向量之间的线性插值,向量一和向量二,他们的距离连成一条线,而第三个参数t最大是1,最小是0,如果是0.2就是返回向量一到向量二这个距离中百分之20的那个位置,返回的是一个Vector3

Vector3.Slerp(Vector3 a, Vector3 b, float t): 这个跟上面的lerp一样,不一样的地方就是上面的两个点击是直线走动,而这个方法是曲线走动,是一个弧度