在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]));
}
}
}
}
嘻嘻,不知道这样算会不会复杂了。