Thema: 3D-Objekt

Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: 3D-Objekt

  Alt 27. Mär 2017, 23:41
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 = 'Spherethen begin
      C3D := TControl3D (TSphere.Create(Dummy1));
      TSphere (C3D).SubdivisionsAxes := 50;
      TSphere (C3D).SubdivisionsHeight := 50;
    end;

    if s = 'Cubethen begin
      C3D := TControl3D (TCube.Create(Dummy1));
    end;
   
    if s = 'Conethen 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;
  Mit Zitat antworten Zitat