Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   3D-Objekt (https://www.delphipraxis.net/192179-3d-objekt.html)

derseitzer 26. Mär 2017 23:33

3D-Objekt
 
ich probiere mich gerade mit 3D-Objekten und habe ein Problem:

Ich möchte auswählen können, ob ich eine TSphere, einen TCylinder TCube usw. haben möchte. Ich möchte also auswählen können, welches Objekt ich möchte.
Gibt es eine 3D-Form, wo ich sozusagen auswählen kann, ob ich eine Tsphere möchte oder etwas anderes (also während das Programm läuft)?
Mit dem Tmodel3D kann man andere Dateien hinzufügen, aber ich möchte eigentlich nur die oben gewählten Formen haben.

Vielen Dank für eure Hilfe

Harry Stahl 27. Mär 2017 22:41

AW: 3D-Objekt
 
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;

derseitzer 2. Apr 2017 14:53

AW: 3D-Objekt
 
Entschuldigung für die späte Antwort... ich danke Ihnen vielmals!:)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz