Du kannst die gewünschten 3D-Formen entweder zur Designzeit erstellen und je nach Bedarf das benötigte 3D-Objekt zur Laufzeit sichtbar schalten. Hierfür kannst Du entweder eine "Geräteübergreifende Anwendung" als "3D-Anwendung" erstellen oder eine "Leere Anwendung"mit einem ViewPort3D-Object darin.
Zur einfacheren Handhabung würde ich das mit einem TDummy-Object verwenden (erleichtert die Positionierung im Raum) und darin die benötigten 3D-Controls erzeugen.
Das wäre die einfachste Variante.
Wenn Du zur Laufzeit mehr Flexibilität haben willst und eine unterschiedliche Anzahl von 3D-Objekten zur weiteren Verwendung erzeugen willst, könntest Du globalisierte Routinen schreiben, die je nach 3D-Objekt halt das Objekt entsprechend behandeln (Klick, Move, usw).
Hier mal ein (stark reduzierter) Auszug aus einem Demoprogramm von mir (in einer ListBox sind Namen von 3D-Formen gespeichert und je nach Auswahl wird zur Laufzeit ein 3DControl erzeugt (im eigentlichen Demo kann man noch Farbe, Texturen oder Licht hinzufügen):
Delphi-Quellcode:
procedure TF_Main.bnAdd3DControlClick(Sender: TObject);
var
s: string;
C3D: TControl3D;
begin
if cb3DObjNames.ItemIndex <> -1 then begin
s := cb3DObjNames.Items[cb3DObjNames.ItemIndex];
if s = 'Sphere' then begin
C3D := TControl3D (TSphere.Create(Dummy1));
TSphere (C3D).SubdivisionsAxes := 50;
TSphere (C3D).SubdivisionsHeight := 50;
end;
if s = 'Cube' then begin
C3D := TControl3D (TCube.Create(Dummy1));
end;
if s = 'Cone' then begin
C3D := TControl3D (TCone.Create(Dummy1));
TCone (C3D).SubdivisionsAxes := 50;
TCone (C3D).SubdivisionsHeight := 50;
end;
C3D.Name := C3D.ClassName + Dummy1.ChildrenCount.ToString;
C3d.Parent := Dummy1;
C3D.Width := 2;
C3D.Height := 2;
C3D.Depth := 2;
C3d.Visible := True;
C3D.Position.X := -2;
// Set Eventhandlers to react on User-Actions
C3D.OnMouseDown := Control3DMouseDown;
C3D.OnMouseMove := Control3DMouseMove;
C3D.OnMouseUp := Control3DMouseUp;
// Add created 3D-Object to List, to select programaticaly at runtime or by user
cbCreated3DObjects.Items.AddObject(c3D.name, C3D);
C3d.BringToFront;
Viewport3D1.Repaint;
end;
end;