AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?

Ein Thema von Boyington · begonnen am 29. Apr 2012 · letzter Beitrag vom 2. Mai 2012
Antwort Antwort
Benutzerbild von Boyington
Boyington

Registriert seit: 12. Apr 2012
43 Beiträge
 
#1

Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?

  Alt 29. Apr 2012, 23:15
Hallo alle,
ich bin Delphi-Anfänger und hab nun Probleme mit GLScene.

Folgende Aufgaben sind im Moment zu lösen:
1) *.stl Datei (im ASCII Format) mit OpenDialog laden und dann zeichnen.
2) mit Trackbars das Massstab und die Rotation des 3D-Objekts regeln.
3) mit Mouse-Dragging (onMouseDown, onMouseMove, onMouseUp) innerhalb von GLSceneViewer auf dem gezeichneten 3D-Objekt einen viereckigen Bereich markieren.

Später werde ich eine Funktion verwenden, um die Koordinaten aller Dreiecke von STL-Datei mit kürzestem Abstand (zwichen Kamera und Oberfläsche des 3D-Objekt) innerhalb des markierten Bereiches zu ermitteln (also kurz gesagt „Kantendetektion“). Dann werden die von KUKA-Industrieroboter genutzt zum robotergestützten Entgraten.

1) und 2) habe ich mit Delphi7 + GLScene jetzt schon fertiggemacht, weil GLScene sehr stark ist.

Meine Probleme:
- wie kann ich Teilaufgabe 3) realisieren? Weil den Befehl "GLSceneViewer1.Canvas.Rectangle(x1,y1,x2,y2); " es NICHT gibt.
Die vollständige Hilfe-Doku von GLScene habe ich nicht gefunden und die mitgelieferte Doku von GLScene selbst ist zwar nicht so ausführlich.

Deshalb bitte ich euch um die Hilfe und danke im Voraus!

Gruss
Lee

Geändert von Boyington (30. Apr 2012 um 16:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Boyington
Boyington

Registriert seit: 12. Apr 2012
43 Beiträge
 
#2

AW: Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?

  Alt 29. Apr 2012, 23:21
Folgende ist der Quelltext:
Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GLScene, GLMisc, GLVectorFileObjects, GLWin32Viewer, GLFileSTL,
  Menus, ComCtrls, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    GLScene1: TGLScene;
    GLSceneViewer1: TGLSceneViewer;
    GLFreeForm1: TGLFreeForm;
    GLLightSource1: TGLLightSource;
    GLCamera1: TGLCamera;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    Laden1: TMenuItem;
    Beenden1: TMenuItem;
    TrackBar1: TTrackBar;
    TrackBar2: TTrackBar;
    TrackBar3: TTrackBar;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    OpenDialog1: TOpenDialog;
    procedure Beenden1Click(Sender: TObject);
    procedure Laden1Click(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure TrackBar2Change(Sender: TObject);
    procedure TrackBar3Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure GLSceneViewer1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    procedure GLSceneViewer1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
       
  private
    { Private declarations }

  Massstab: Integer;
  Roll: Integer;
  Turn: Integer;
  sx,sy,ex,ey: Integer;
  Markieren:boolean;

  public
    { Public declarations }
  end;

Var
  Form1: TForm1;
 
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Massstab:=TrackBar1.Position;
  Roll:=TrackBar2.Position;
  Turn:=TrackBar3.Position;
end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.Laden1Click(Sender: TObject);
begin
   Form1.OpenDialog1.Title:='Waehlen Sie bitte eine STL-Datei';
   Form1.OpenDialog1.InitialDir:='C:\';
   Form1.OpenDialog1.Filter:='STL Files in ASCII Format(*.stl)|*.stl';
   Form1.OpenDialog1.Execute;

   GLFreeForm1.LoadFromFile(OpenDialog1.FileName);
   GLFreeForm1.Scale.Scale(0.5) ;
   GLFreeForm1.Roll(0);
   GLFreeForm1.Turn(0);
 
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
   Massstab:=TrackBar1.Position;
   GLFreeForm1.Scale.Normalize;
   GLFreeForm1.Scale.Scale(Massstab/10);

end;


procedure TForm1.TrackBar2Change(Sender: TObject);
begin
   Roll:=TrackBar2.Position;
   GLFreeForm1.Rotation.Normalize;
   GLFreeForm1.Roll(Roll);
   GLFreeForm1.Turn(Turn);
end;


procedure TForm1.TrackBar3Change(Sender: TObject);
begin
   Turn:=TrackBar3.Position;
   GLFreeForm1.Rotation.Normalize;
   GLFreeForm1.Roll(Roll);
   GLFreeForm1.Turn(Turn);
end;



procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  //bitte euren Text hier einfügen!!!
end;

procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
   //bitte euren Text hier einfügen!!!
end;

procedure TForm1.GLSceneViewer1MouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   //bitte euren Text hier einfügen!!!
end;
end.

Geändert von Boyington (30. Apr 2012 um 16:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Boyington
Boyington

Registriert seit: 12. Apr 2012
43 Beiträge
 
#3

AW: Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?

  Alt 1. Mai 2012, 12:19
kennen sich hier vielleicht wenig Leute mit GLScene gut aus?
Ich bitte um die Hilfe nochmals, danke!
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?

  Alt 1. Mai 2012, 13:03
Etwas in der Art funktioniert, bringt Dich aber wahrscheinlich nicht weiter, da Du ja Quasi nur ein Guckloch definierst.

Delphi-Quellcode:
type
  TGLSceneViewer = class(GLWin32Viewer.TGLSceneViewer)
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;

  end;

  TForm1 = class(TForm)
.......
......
procedure TGLSceneViewer.WMPaint(var Message: TWMPaint);
var
 DC:HDC;
begin
   inherited;
   DC := GetDC(handle);
   Windows.FrameRect(DC, Rect(FMdownX, MDownY, FMCurrentX,FMCurrentY),TForm(Owner).Brush.Handle);
   ReleaseDC(Handle,DC);
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?

  Alt 1. Mai 2012, 19:09
3) mit Mouse-Dragging (onMouseDown, onMouseMove, onMouseUp) innerhalb von GLSceneViewer auf dem gezeichneten 3D-Objekt einen viereckigen Bereich markieren.
Leider geht aus dieser Beschreibung nicht hervor, ob der "rechteckige" Bereich auf die Bildschirmebene bezogen ist, oder auf eine Fläche im Raum.

Für die Bildschirmebene empfehle ich ein TGLHUDSprite mit einem passenden AlphaBlend-Wert, damit man hindurchsehen kann. Soll das "Rechteck" im Raum erscheinen und sich mit dem Objekt mitdrehen, dann wäre ein TGLCube mit CubeDepth = 0 die bessere Wahl.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Boyington
Boyington

Registriert seit: 12. Apr 2012
43 Beiträge
 
#6

AW: Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?

  Alt 2. Mai 2012, 09:42
Danke für eure Hinweise
Erhlich gesagt, dass ich mich selber noch nicht entschieden habe, ob der rechteckige Bereich (s.g "Guckloch") auf der Bildschirmebene/GLSceneViewer-Ebene oder auf der Fläche im Raum sein soll, das ist abhängig davon, welche Methode relativ einfacher ist.

-------------------------------------------------------------------
an Uwe Raabe:
1. für Fläche im Raum: mit welchem Parameter kann ich TGLCube transparent machen? Also nur mit vier Kanten.
2. wie mache ich, dass TGLCube(pmLines, also NUR mit vier Kanten) bzw. die Projektion vom TGLCube immer auf der Oberfläche des 3D-Objektes liegt?
--------------------------------------------------------------------
Nochmals vielen Dank!
Gruss
Lee

Geändert von Boyington ( 2. Mai 2012 um 11:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#7

AW: Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?

  Alt 2. Mai 2012, 13:40
1. für Fläche im Raum: mit welchem Parameter kann ich TGLCube transparent machen? Also nur mit vier Kanten.
Material.FrontProperties.PolygonMode := pmLines;
2. wie mache ich, dass TGLCube(pmLines, also NUR mit vier Kanten) bzw. die Projektion vom TGLCube immer auf der Oberfläche des 3D-Objektes liegt?
Das Problem dabei ist, daß die Projektion nicht notwendigerweise ein einfach tranformiertes Rechteck ist - z.B. wenn die Projektionsfläche eine Kugel ist. Das ist eindeutig der schwierigere Part, nicht in zwei Sätzen zu beantworten und hängt sehr stark von den 3D-Objekten ab.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Boyington
Boyington

Registriert seit: 12. Apr 2012
43 Beiträge
 
#8

AW: Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?

  Alt 2. Mai 2012, 14:52
1. für Fläche im Raum: mit welchem Parameter kann ich TGLCube transparent machen? Also nur mit vier Kanten.
Material.FrontProperties.PolygonMode := pmLines;
2. wie mache ich, dass TGLCube(pmLines, also NUR mit vier Kanten) bzw. die Projektion vom TGLCube immer auf der Oberfläche des 3D-Objektes liegt?
Das Problem dabei ist, daß die Projektion nicht notwendigerweise ein einfach tranformiertes Rechteck ist - z.B. wenn die Projektionsfläche eine Kugel ist. Das ist eindeutig der schwierigere Part, nicht in zwei Sätzen zu beantworten und hängt sehr stark von den 3D-Objekten ab.
1000 Dank!!!

noch eine Frage zu 1): PolygonMode von FrontProperties:=pmLines habe ich in "Object Inspector" gemacht, aber die Kanten von diesem GLCube werden manchmals von 3D-Bauteil verdeckt. Wie mache ich GLCube immer im Vordergrund, damit werden KEINE Kante vom GLCube verdeckt.

l.g
Lee
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#9

AW: Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?

  Alt 2. Mai 2012, 15:31
noch eine Frage zu 1): PolygonMode von FrontProperties:=pmLines habe ich in "Object Inspector" gemacht, aber die Kanten von diesem GLCube werden manchmals von 3D-Bauteil verdeckt. Wie mache ich GLCube immer im Vordergrund, damit werden KEINE Kante vom GLCube verdeckt.
Der Cube muss natürlich "näher" an der Kamera liegen, als das 3D-Bauteil. Es kann auch helfen, wenn du den Cube an das Ende der Objektliste der Scene hängst, damit er als letztes gerendert wird.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Boyington
Boyington

Registriert seit: 12. Apr 2012
43 Beiträge
 
#10

AW: Wie kann ich einen viereckigen Bereich auf GLSceneViewer markieren?

  Alt 2. Mai 2012, 15:55
noch eine Frage zu 1): PolygonMode von FrontProperties:=pmLines habe ich in "Object Inspector" gemacht, aber die Kanten von diesem GLCube werden manchmals von 3D-Bauteil verdeckt. Wie mache ich GLCube immer im Vordergrund, damit werden KEINE Kante vom GLCube verdeckt.
Der Cube muss natürlich "näher" an der Kamera liegen, als das 3D-Bauteil. Es kann auch helfen, wenn du den Cube an das Ende der Objektliste der Scene hängst, damit er als letztes gerendert wird.
Prima Ich hab geschafft mit der Einstellung der Position wie folgende:
GLCamera1 X=0, Y=0, Z=2
GLFreeForm1 X=0, Y=0, Z=0
GLCube1 X=0, Y=0, Z=1

Dann werden keine Kanten vom GLCube verdeckt!

Vielan Dank!
lg
Lee
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 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