在3D中,平面是到兩個點距離相等的點的集合。平面是完全平的,沒有厚度,且無限延伸。平面方程有兩種記法如下:
ax+by+cz=d (1)
p·n=d (2)
所有在同一平面上的點都滿足這兩個方程。方程(2)中,n=[a,b,c],是平面的法向量,它垂直于平面。d是一個常量,p是平面內任意一點。如果已知n和d的值,我們就可以用這個方程式來判斷一個點是否在這個平面內。
如果要確定一個平面,首先要已知三個點,因為至少三個點才能構成一個平面,假設這三個點分別為p1,p2,p3,分別用這三個點構造兩個向量,e1=p2-p1,e2=p3-p2。這兩個向量的叉乘得到的向量同時垂直于這兩個向量,即法向量n。計算出法向量之后,再將任意一個已知點帶入就能得到d的值。
得到n和d的值,也就確定了平面方程。這樣,如果要判斷某個點是否在這個平面內,只需要把點帶入這個方程檢驗一下就可以啦。
代碼如下:
using UnityEngine;
using System.Collections;
public class JudgePlane : MonoBehaviour
{
[ContextMenu("input more than 3 points")]
public Vector3[] points;
private Vector3 normal;
private float d;
void simulateN()
{
Vector3 e1 = points[1] - points[0];
Vector3 e2 = points[2] - points[1];
normal = Vector3.Cross(e1, e2).normalized;
Debug.Log("normal: " + normal);
}
void simulated()
{
d = Vector3.Dot(points[0], normal);
}
bool judge(Vector3 point)
{
return Vector3.Dot(point, normal) == d;
}
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
if(points.Length <= 3)
return;
simulateN();
simulated();
for(int i = 3; i < points.Length; i++)
{
judge(points[i]);
Debug.Log(points[i] + " " + judge(points[i]));
}
}
}
}
嘻嘻,不知道這樣算會不會復雜了。
img-be06bec6767883a94e22735ccb94f8e8.gif