AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi GLScene auch bei MouseEvents rendern.
Thema durchsuchen
Ansicht
Themen-Optionen

GLScene auch bei MouseEvents rendern.

Ein Thema von 3_of_8 · begonnen am 21. Aug 2006 · letzter Beitrag vom 21. Aug 2006
Antwort Antwort
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#1

GLScene auch bei MouseEvents rendern.

  Alt 21. Aug 2006, 02:06
Morgen.

Ich hab grad ein Problem.

Ich will die Ansicht in einem TGLScene per Maus drücken, halten und ziehen drehen.

Momentan mache ich das so:

Delphi-Quellcode:
procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
startpos.X:=X;
startpos.Y:=Y;
Screen.Cursor:=crSizeAll;
end;

procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then
begin
glsceneviewer1.Camera.RotateAbsolute(Y-startpos.Y, X-startpos.X, 0);
startpos.X:=X;
startpos.Y:=Y;
mouse.cursorpos:=
  glsceneviewer1.clienttoscreen(Point(Width div 2, Height div 2));
end;
end;

procedure TForm1.GLSceneViewer1MouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Screen.Cursor:=crDefault;
end;
Das TGLScene wird im OnProgress eines cadencers gerendert.

Das Problem bei der Sache: Solange ich die Maustaste gedrückt halte und ziehe, wird die Szene nicht neu gerendert, erst wenn ich die Maustaste wieder loslasse.

Was kann ich dagegen tun?
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#2

Re: GLScene auch bei MouseEvents rendern.

  Alt 21. Aug 2006, 08:36
Mach das mal so:


Delphi-Quellcode:
procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
           MousePos.X := X;
           MousePos.Y := Y;
           Screen.Cursor:=crSizeAll;
end;

procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
         if ssLeft in Shift then
          GLCamera1.MoveAroundTarget((MousePos.Y - Y) / 2, (MousePos.X - X) / 2);
           MousePos.X := X;
           MousePos.Y := Y;
end;

procedure TForm1.GLSceneViewer1MouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Screen.Cursor:=crDefault;
end;

Mfg Net7
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: GLScene auch bei MouseEvents rendern.

  Alt 21. Aug 2006, 10:47
Ne, das geht nicht.

Delphi-Quellcode:
procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
         if ssLeft in Shift then
          GLCamera1.MoveAroundTarget((MousePos.Y - Y) / 2, (MousePos.X - X) / 2);
           MousePos.X := X;
           MousePos.Y := Y;
end;
Da muss nach dem then ein begin end.

Ein MousePos gibt es nicht, nur Mouse.CursorPos und meine Variable startpos.

MousePos.X:=X funktioniert gar nicht, da X die Position innerhalb des betroffenen Controls zuweist, außerdem hätte ich den Mauszeiger immer gerne in der Mitte des Controls, daher auch das
mouse.cursorpos:=
glsceneviewer1.clienttoscreen(Point(glsceneviewer1 .Width div 2, glsceneviewer1.Height div 2));

Also das Problem ist genauer gesagt jetzt: Es wird gar nichts mehr gedreht und gerendert auch nicht.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: GLScene auch bei MouseEvents rendern.

  Alt 21. Aug 2006, 11:14
Hi,
ein TGLCadencer ist eigentlich nur ein Thread mit sehr geringer Priorität. Deswegen wirst du mit dem Rendern auch kein Glück haben, solange du das gleich in Behandlung des Mausereignis machst. Da kommen dann einfach recht viele Events, die total vorrangig bearbeitet werden.
Lager einfach mal alles in das Ereignis des Cadencers aus:

Delphi-Quellcode:

procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then
  begin
    newX := X;
    newY := Y;
  end; // if ssLeft in Shift
end;

procedure doFoo;
begin
  glsceneviewer1.Camera.RotateAbsolute(newY-startpos.Y, newX-startpos.X, 0);
  startpos.X := newX;
  startpos.Y := newY;
  mouse.cursorpos := glsceneviewer1.clienttoscreen(Point(Width div 2, Height div 2));
end;

procedure TGLCadencer.On(weißleider nicht genau und hab's gerade nicht installiert);
begin
// natürlich auch ein flag verwenden, dass der hier nur rein geht wenn die Maus gedrückt wurde!
if (newX <> startPos.X) or (newY <> startPos.Y) then
begin
doFoo;
end; // if (newX <> startPos.X) or (newY <> startPos.Y)

// ....
end;
Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#5

Re: GLScene auch bei MouseEvents rendern.

  Alt 21. Aug 2006, 19:43
Zitat von 3_of_8:
Ne, das geht nicht.

Delphi-Quellcode:
procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
         if ssLeft in Shift then
      GLCamera1.MoveAroundTarget((MousePos.Y - Y) / 2,(MousePos.X - X) / 2);
           MousePos.X := X;
           MousePos.Y := Y;
end;
Da muss nach dem then ein begin end.

Ein MousePos gibt es nicht, nur Mouse.CursorPos und meine Variable startpos.

MousePos.X:=X funktioniert gar nicht, da X die Position innerhalb des betroffenen Controls zuweist, außerdem hätte ich den Mauszeiger immer gerne in der Mitte des Controls, daher auch das
mouse.cursorpos:=
glsceneviewer1.clienttoscreen(Point(glsceneviewer1 .Width div 2, glsceneviewer1.Height div 2));

Also das Problem ist genauer gesagt jetzt: Es wird gar nichts mehr gedreht und gerendert auch nicht.

Hmm... vieleicht hast du was falsch verstanden, hier mal der Quellcode meines Versuches.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GLScene, GLObjects, GLMisc, GLWin32Viewer, GLCadencer;

type
  TForm1 = class(TForm)
    GLScene1: TGLScene;
    GLSceneViewer1: TGLSceneViewer;
    GLCamera1: TGLCamera;
    GLLightSource1: TGLLightSource;
    GLCube1: TGLCube;
    GLCadencer1: TGLCadencer;
    procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
      newTime: Double);
    procedure GLSceneViewer1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  MousePos: TPoint; //Mausposi für Weltendrehung
implementation

{$R *.dfm}

procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime,
  newTime: Double);
begin
 glcube1.Turn(deltatime*45);
end;

procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
       //Daten erforderlich für die Drehung des Weltsystems
  MousePos.X := X;
  MousePos.Y := Y;
 Screen.Cursor:=crSizeAll;
  end;

procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then
 GLCamera1.MoveAroundTarget((MousePos.Y - Y) / 2, (MousePos.X - X) / 2);
 MousePos.X := X;
 MousePos.Y := Y;
end;
end.
Bis auf das Problem mit "Mauszeiger immer gerne in der Mitte" funktioniert das Tadellos.

Mfg Net7
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: GLScene auch bei MouseEvents rendern.

  Alt 21. Aug 2006, 20:28
Das Problem ist: Meine Kamera hat nunmal kein TargetObject. Aber ich habe das ganze jetzt sowieso komplett umgeschrieben, sodass das Problem sich eigentlich erledigt hat.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  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 01:27 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