We know a 3D plane is built by 3 points. Now in delphi I use GLScene there is a plane in which you cant see any arbitrary point to create a plan. My question is how to set a plane by 3 given points. According to SO rules I write my TGLPlane source code.
TGLPlane = class(TGLSceneObject)
private
{ Private Declarations }
FXOffset, FYOffset: TGLFloat;
FXScope, FYScope: TGLFloat;
FWidth, FHeight: TGLFloat;
FXTiles, FYTiles: Cardinal;
FStyle: TGLPlaneStyles;
FMesh: array of array of TVertexRec;
protected
{ Protected Declarations }
procedure SetHeight(const aValue: Single);
procedure SetWidth(const aValue: Single);
procedure SetXOffset(const Value: TGLFloat);
procedure SetXScope(const Value: TGLFloat);
function StoreXScope: Boolean;
procedure SetXTiles(const Value: Cardinal);
procedure SetYOffset(const Value: TGLFloat);
procedure SetYScope(const Value: TGLFloat);
function StoreYScope: Boolean;
procedure SetYTiles(const Value: Cardinal);
procedure SetStyle(const val: TGLPlaneStyles);
public
{ Public Declarations }
constructor Create(AOwner: TComponent); override;
procedure Assign(Source: TPersistent); override;
procedure BuildList(var rci: TRenderContextInfo); override;
function GenerateSilhouette(const silhouetteParameters
: TGLSilhouetteParameters): TGLSilhouette; override;
function AxisAlignedDimensionsUnscaled: TVector; override;
function RayCastIntersect(const rayStart, rayVector: TVector;
intersectPoint: PVector = nil; intersectNormal: PVector = nil)
: Boolean; override;
{ : Computes the screen coordinates of the smallest rectangle encompassing the plane.<p>
Returned extents are NOT limited to any physical screen extents. }
function ScreenRect(aBuffer: TGLSceneBuffer): TGLRect;
{ : Computes the signed distance to the point.<p>
Point coordinates are expected in absolute coordinates. }
function PointDistance(const aPoint: TVector): Single;
published
{ Public Declarations }
property Height: TGLFloat read FHeight write SetHeight;
property Width: TGLFloat read FWidth write SetWidth;
property XOffset: TGLFloat read FXOffset write SetXOffset;
property XScope: TGLFloat read FXScope write SetXScope stored StoreXScope;
property XTiles: Cardinal read FXTiles write SetXTiles default 1;
property YOffset: TGLFloat read FYOffset write SetYOffset;
property YScope: TGLFloat read FYScope write SetYScope stored StoreYScope;
property YTiles: Cardinal read FYTiles write SetYTiles default 1;
property Style: TGLPlaneStyles read FStyle write SetStyle
default [psSingleQuad, psTileTexture];
end;
In GLScene, a plane is determined by its position and direction, not directly by three points.
Let's label the points A, B, and C. Choose A to be the position. The cross product of vectors AB and AC will give you the normal vector. Use those results to set the plane's AbsolutePosition
and AbsoluteDirection
properties.