![]() |
GLScene auch bei MouseEvents rendern.
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:
Das TGLScene wird im OnProgress eines cadencers gerendert.
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 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? |
Re: GLScene auch bei MouseEvents rendern.
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 |
Re: GLScene auch bei MouseEvents rendern.
Ne, das geht nicht.
Delphi-Quellcode:
Da muss nach dem then ein begin 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; 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. |
Re: GLScene auch bei MouseEvents rendern.
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:
Gruß Der Unwissendeprocedure 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; |
Re: GLScene auch bei MouseEvents rendern.
Zitat:
Hmm... vieleicht hast du was falsch verstanden, hier mal der Quellcode meines Versuches.
Delphi-Quellcode:
Bis auf das Problem mit "Mauszeiger immer gerne in der Mitte" funktioniert das Tadellos.
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. Mfg Net7 |
Re: GLScene auch bei MouseEvents rendern.
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz