目录
1.public static Vector3 Project(Vector3 vector, Vector3 onNormal);
2.public static Vector3 ProjectOnPlane(Vector3 vector, Vector3 planeNormal);返回向量在平面上的位置。
1.public static Vector3 Project(Vector3 vector, Vector3 onNormal);
描述 :
将一个向量投影到另一个向量上。
为了理解矢量投影,假设onNormal位于指向其方向的直线上。 沿着这条线的某处是离矢量尖端最近的点。 投影只是在onNormal上缩放,使它到达直线上的那个点。
如果onNormal几乎为零,函数将返回零向量。
代码:
public Transform A;
public Transform B;
Vector3 planX;
Vector3 planY;
Vector3 planZ;
// Start is called before the first frame update
void Start() {
//dir1 = new Vector3(0, 5, 5);
}
// Update is called once per frame
void Update() {
Vector3 dir = A.position - B.position;
Debug.DrawLine(B.position, A.position, Color.cyan);
planX = Vector3.Project(dir, Vector3.left);
planY = Vector3.Project(dir, Vector3.up);
planZ = Vector3.Project(dir, Vector3.forward);
Debug.DrawLine(B.position, B.position + planX, Color.white);
Debug.DrawLine(B.position, B.position + planY, Color.black);
Debug.DrawLine(B.position, B.position + planZ, Color.gray);
}
效果:
结论:
白线是向量AB以B为起点在X轴上的投影
黑线是向量AB以B为起点在Y轴上的投影
灰线是向量AB以B为起点在Z轴上的投影
2.public static Vector3 ProjectOnPlane(Vector3 vector, Vector3 planeNormal);返回向量在平面上的位置。
描述 :
将一个向量投影到一个由与该平面正交的法向量定义的平面上。
代码:
我们尝试把一个向量与x轴的正方向传入此方法
即:
public Transform A;
public Transform B;
Vector3 projectOnPlanX;
// Start is called before the first frame update
void Start() {
}
// Update is called once per frame
void Update() {
Vector3 dir = A.position - B.position;
projectOnPlanX = Vector3.ProjectOnPlane(dir, Vector3.left);
Debug.DrawLine(B.position, B.position + projectOnPlanX, Color.red);
}
效果:
红线就是这个方法返回的向量+向量B
根据定义我们可以知道 红线是 向量A - 向量B 在 我们传入的X轴正交的法向量平面上 然后我们画出这个平面
画出法向量平面代码:
public Transform A;
public Transform B;
Vector3 projectOnPlanX;
Vector3 dir1;
// Start is called before the first frame update
void Start() {
dir1 = new Vector3(0, 20, 20);
}
// Update is called once per frame
void Update() {
Vector3 dir = A.position - B.position;
dir1 = Quaternion.AngleAxis(2, Vector3.left) * dir1;
Debug.DrawRay(B.position, dir1, Color.green, 7f);
}
效果:
由绿色射线组成的平面即是与我们传入的x轴正交的法向量平面(严格来说我们画出的应该是重合于这个平面的圆)
由此可以看出 图一中的红色射线投影到了我们所画的平面上
如下图:
由此我们可以得出:
Vector3 plane = Vector3.ProjectOnPlane(向量A-向量B, Vector3.left);
向量plane的模就是 向量A 和 向量B 在YZ轴组成的坐标系中的距离
如果我们这样
Vector3 plane = Vector3.ProjectOnPlane(向量A-向量B, Vector3.up);
向量plane的模就是 向量A 和 向量B 的地面距离
结论:
Vector3.ProjectOnPlane(Vector3 vector,Vector3 onNormal ) 得到的是
向量vector 在 向量onNormal的垂直平面上的投影向量