我有一个由标准平面方程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()计算从正常的平面切线和双切线。
严格地说飞机是无限的,所以它不具备边界顶点。此外,在3D空间中看到的平面 - > 2D投影要么占据整个投影平面(一般情况),要么变成一条线(部分情况)。你需要更好地定义你的问题。 – valdo
它也可能在相机后面(不可见) – MSalters
@valdo:如果该平面与视轴平行,那么它实际上不会填满整个视口,而是后退到视野中。 – datenwolf