While the Camera used in the IDE the “Design Camera” always points to the origin [0,0,0] because of the way it is created any arbitrary camera created at any position on the form could point anywhere. It was useful to provide a routine to automate this process.
A library routine AngleToToOrigin provided in my unit “ThreeDUtils” achieves this.
Function AngleToToOrigin(APos: TPoint3D): TPoint3D;
Var
SinA, CosA: Double;
CurPoint, CurYPt, CurXpt, CurAngle: TPoint3D;
Hyp, HypR1: single;
begin
CurPoint := APos;
Hyp := CurPoint.Length;
if CurPoint.Z <= 0 then
// Align to X axis then dip
begin
CurXpt := CurPoint;
CurXpt.X := 0;
HypR1 := CurXpt.Length;
CurAngle.X := ToDegree(ArcSin(CurPoint.Y / HypR1));
CurAngle.Y := ToDegree(ArcSin(-CurPoint.X / Hyp));
CurAngle.Z := 0;
end
else
begin
CurXpt := CurPoint;
CurXpt.X := 0;
HypR1 := CurXpt.Length;
CurAngle.X := ToDegree(Pi - ArcSin(CurPoint.Y / HypR1));
CurAngle.Y := ToDegree(ArcSin(-CurPoint.X / Hyp));
CurAngle.Z := 0;
end;
Result := CurAngle;
end;
By calling this code as part of the TMovingCamera.create the viewport is initially aligned with the
origin.
procedure TFlyingCamera.AlignCammeraToOrigin; begin RotationAngle.Point:=AngleToToOrigin(Position.Point); UpdateHeadUpDisplay; end;
It is interesting (and concerning) that calling this same code after panning the camera though a wide range using the control keys this function no longer brings the origin into the “Gun Sight”.
If you want to try this add the line
'o','O':AlignCammeraToOrigin;
to the published TFlyingCamera.FmCamera3DKeyDown case statement.