用三个点创建一个 3d 平面
Create a 3d plane with three points
我们知道3D平面是由3个点构成的。
现在,在 delphi 我使用 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;
在GLScene中,一个平面是由它的位置和方向决定的,而不是直接由三个点决定的。
让我们标记点 A、B 和 C。选择 A 作为位置。向量 AB 和 AC 的叉积将为您提供法向量。使用这些结果来设置飞机的 AbsolutePosition
和 AbsoluteDirection
属性。
我们知道3D平面是由3个点构成的。 现在,在 delphi 我使用 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;
在GLScene中,一个平面是由它的位置和方向决定的,而不是直接由三个点决定的。
让我们标记点 A、B 和 C。选择 A 作为位置。向量 AB 和 AC 的叉积将为您提供法向量。使用这些结果来设置飞机的 AbsolutePosition
和 AbsoluteDirection
属性。