2013-12-18 70 views
3

我有一个由标准平面方程a * x + b * y + c * z + d = 0定义的平面,我希望能够使用OpenGL进行绘制。我如何得出在3D空间中将其绘制为四边形所需的四点?从平面方程绘制任意平面,OpenGL

我的飞机类型被定义为:

struct Plane { 
    float x,y,z; // plane normal 
    float d; 
}; 

void DrawPlane(const Plane & p) 
{ 
    ??? 
} 

编辑:

因此,重新思考这个问题,我其实是想为绘制3D空间中的平面的谨慎表示,不能无限平面。 此基础上通过@ a.lasram提供的答案,我公司生产的这种实现,这行的也只是:

void DrawPlane(const Vector3 & center, const Vector3 & planeNormal, float planeScale, float normalVecScale, const fColorRGBA & planeColor, const fColorRGBA & normalVecColor) 
{ 
    Vector3 tangent, bitangent; 
    OrthogonalBasis(planeNormal, tangent, bitangent); 

    const Vector3 v1(center - (tangent * planeScale) - (bitangent * planeScale)); 
    const Vector3 v2(center + (tangent * planeScale) - (bitangent * planeScale)); 
    const Vector3 v3(center + (tangent * planeScale) + (bitangent * planeScale)); 
    const Vector3 v4(center - (tangent * planeScale) + (bitangent * planeScale)); 

    // Draw wireframe plane quadrilateral: 
    DrawLine(v1, v2, planeColor); 
    DrawLine(v2, v3, planeColor); 
    DrawLine(v3, v4, planeColor); 
    DrawLine(v4, v1, planeColor); 

    // And a line depicting the plane normal: 
    const Vector3 pvn(
     (center[0] + planeNormal[0] * normalVecScale), 
     (center[1] + planeNormal[1] * normalVecScale), 
     (center[2] + planeNormal[2] * normalVecScale) 
    ); 
    DrawLine(center, pvn, normalVecColor); 
} 

凡OrthogonalBasis()计算从正常的平面切线和双切线。

+0

严格地说飞机是无限的,所以它不具备边界顶点。此外,在3D空间中看到的平面 - > 2D投影要么占据整个投影平面(一般情况),要么变成一条线(部分情况)。你需要更好地定义你的问题。 – valdo

+0

它也可能在相机后面(不可见) – MSalters

+1

@valdo:如果该平面与视轴平行,那么它实际上不会填满整个视口,而是后退到视野中。 – datenwolf

回答

1

要看到平面,就好像它是无限的一样,可以找到4个四边形顶点,这样修剪的四边形和修剪的无限平面形成相同的多边形。示例:

样本2随机点P1P2在飞机上如P1 != P2

推导的切线t和双向切线b作为

t = normalize(P2-P1); // get a normalized tangent 
b = cross(t, n); // the bi-tangent is the cross product of the tangent and the normal 

计算视锥的边界领域。该球体将具有直径D(如果这一步似乎困难,则只需将D设置为足够大的值,例如相应的球体包含平截头体)。

获取4四个顶点v1v2v3v4(CCW或CW取决于P1和P2的选择):

v1 = P1 - t*D - b*D; 
v2 = P1 + t*D - b*D; 
v3 = P1 + t*D + b*D; 
v4 = P1 - t*D + b*D; 
1

一种可能性(可能不是最干净的)是将正交向量与平面对齐,然后从中选择点。

  1. P1 = < X,Y,Z>
  2. T1 =与P1随机非零,非共线向量。
  3. P2 =规范(P1交叉T1)
  4. P3 =规范(P1交叉P2)

现在,在期望的平面中的所有点被定义为起点加P2和P3的线性组合。通过这种方式,您可以根据需要为几何体获得尽可能多的点。

注意:起点只是您的平面正常< x,y,z>乘以距离原点的距离:abs(d)。

同样感兴趣的是,在巧妙选择t1的情况下,您还可以将P2与某些视图对齐。假设你正在从某个z点看x,y平面。您可能想要选择t1 = < 0,1,0>(只要它与P1不共线)。这对于y分量产生P2为0,对于x分量产生P3为0。