Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   3D-Objekt / Dummy (https://www.delphipraxis.net/192963-3d-objekt-dummy.html)

derseitzer 6. Jun 2017 16:27

3D-Objekt / Dummy
 
hey ich benutze folgenden Code (zumindest so ähnlich):
Code:
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;
Meine Frage: ich möchte ein OnClick Ereignis haben. aber mit dem Dummy1.onclick funktioniert das nicht.. Ich möchte auf meine (z.B.) TSphere klicken können. Ideen?:/

ZYLAGON 7. Jun 2017 18:27

AW: 3D-Objekt / Dummy
 
Hallo derseitzer,

eigentlich hast Du die Lösung selbst schon erarbeitet.
Wenn Du in Deiner Prozedur noch ergänzt:
Delphi-Quellcode:
C3D.OnClick := Klick;


Als nächstes erstellst Du die Prozedur Klick:
Delphi-Quellcode:
procedure TF_Main.Klick(Sender:TObject);
begin
  showmessage('Klick');
end;
und deklarierst sie im Interface-Abschnitt (beispielsweise im Private-Abschnitt)

VG
ZYL

derseitzer 8. Jun 2017 16:06

AW: 3D-Objekt / Dummy
 
Vielen Dank, nun stehe ich vor einem weiteren problem:
ich drehe mithilfe meiner Sensoren eine Sphere.. mit der x koordinate drehe ich x und mit y eben y.
Problem ist schwierig zu erklären aber ich gebe mein bestes: wenn ich nun z.b. die y koordinate erhöhe und sich meine tsphere nach oben dreht und ich danach die x koordinate ändere, dreht sich die sphere nicht dort, wo ich eben schaue, sondern eben wo ganz anders (nämlich dort wo am anfang meine x achse liegt). Meine achsen drehen sich also nicht mit.. ich dachte zuerst, das ist ja eigentlich kein Problem, ich müsste nur die kamera position ändern oder den rotationangle von der camera aber bei beidem funktioniert einfach garnichts... so als könnte ich die kamera garnicht bewegen :?:

Edit @ZYLAGON soganz funktioniert das nicht.. wenn ich nun Klicke stürzt meine App ab.. :/

ZYLAGON 8. Jun 2017 17:21

AW: 3D-Objekt / Dummy
 
Hallo derseitzer,

was den Code betrifft, habe ich ihn gestern getestet und funktioniert auch bei mir.
Hier der komplette Code:
Delphi-Quellcode:
unit Temp;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  System.Math.Vectors, FMX.Controls3D, FMX.Objects3D, FMX.Viewport3D,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Viewport3D1: TViewport3D;
    Dummy1: TDummy;
    bnAdd3DControl: TButton;
    procedure bnAdd3DControlClick(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure Klick(Sender:TObject);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Klick(Sender:TObject);
begin
  showmessage('Klick');
end;

procedure TForm1.bnAdd3DControlClick(Sender: TObject);
var
  s: string;
  C3D: TControl3D;
begin
    s := 'Sphere';

    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;}
    C3D.OnClick := Klick;

    C3d.BringToFront;

    Viewport3D1.Repaint;

end;

end.

Zu der Problematik mit den Sensoren kann ich leider nichts beitragen, da ich diese noch nicht getestet habe.

VG
ZYL

derseitzer 8. Jun 2017 20:33

AW: 3D-Objekt / Dummy
 
Sehr sehr komisch.. hab delphi neu gestartet und den code rausgenommen und wieder eingefügt nun funktioniert es.. danke :oops:
kurze Frage: Für was steht eigentlich dieser "SubdivionsAxes:=50" Befehl?..

Nun eben noch dieses "Drehproblem", das eben dadurch entsteht das die Axen sich mitdrehen und nicht für den Zuschauer statisch bleiben..
Weiß nicht inwiefern das lösbar ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 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