我们知道 3D 平面是由 3 个点构成的。现在在德尔福我使用 GLScene 有一个平面,你看不到任何任意点来创建一个平面。我的问题是如何通过 3 个给定点设置平面。根据 SO 规则,我编写了我的 TGLPlane 源代码。
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;