Skocz do zawartości

[GLScene] i canvas


derdiusz

Polecane posty

Witam,

 

Piszę aplikację w delphi, która korzysta ze środowiska 3d - opartego na openGL'u przy użyciu GLScene. Po wyrenderowaniu sceny chciałem umieścić na niej różnego rodzaju napisy czy linie 2d. Można to zrobić w prosty sposób używając metody AfterRender sceny, w której tworzę obiekt TCanvas i wrzucam w niego to co chcę. Nie ma z tym żadnego problemu poza efektem migania napisów podczas ich odświeżania (rysowania nowej linii, zmiany tekstu etc.). Rozpocząłem więc poszukiwania celem odnalezienia sposobu na ten wyjątkowo irytujący problem i znalazłem. Doczytałem, że należy dodać obiekt TGLDirectOpenGL i w metodzie OnRender tegoż obiektu należy stworzyć TGLCanvas'a, który to zajmie się rysowanie czego dusza zapragnie. I faktycznie - efekt migania nie występuje. Natomiast pojawia się inny problem... Wcześniej można było sobie kliknąć na danym obiekcie 3d i był on zaznaczany (obsługa opisana w metodzie OnMouseDown sceny - scena.buffer.GetPickedObject(x,y) ). Teraz niestety jest to niemożliwe.. gdzie się nie kliknie "zaznaczanym" obiektem jest nieszczęsny TGLDirectOpenGL, który zrobił z siebie swoistą szybę przesłaniającą wszytskie obiekty. Natomiast jeżeli ustawi się parametr TGLDirectOpenGL.Visible := false; to TGLCanvas też nie jest wyswietlany i nici z napisów :( Gdzie szukać sposobu na rozwiązanie tego problemu?

 

Pozdrawiam!

Link do komentarza
Udostępnij na innych stronach

Po co rysujesz tekst w ten sposób? :blink: Możesz użyć obiektu TGLHUDText (tekst 2D) lub TGLSpaceText (tekst 3D). Wtedy nie będzie problemu...

 

Tak, ale wtedy dla każdego tekstu muszę tworzyć oddzielny obiekt. Zresztą na canvasie rysuję także linie łączące niektóre obiekty, opisy do tych linii etc. No i często ilość tekstu się dynamicznie zmienia...

Link do komentarza
Udostępnij na innych stronach

Dziwne... :blink: Ja robię tak:

CODEunit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, GLCanvas, GLScene, GLObjects, GLMisc, GLCadencer, GLWin32Viewer,

GLTexture;

 

type

TForm1 = class(TForm)

GLScene: TGLScene;

GLSceneViewer: TGLSceneViewer;

GLCadencer: TGLCadencer;

GLCamera1: TGLCamera;

GLDummyCube1: TGLDummyCube;

GLCube1: TGLCube;

GLLightSource1: TGLLightSource;

GLDirectOpenGL1: TGLDirectOpenGL;

procedure GLDirectOpenGL1Render(Sender: TObject;

var rci: TRenderContextInfo);

procedure GLSceneViewerMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.GLDirectOpenGL1Render(Sender: TObject;

var rci: TRenderContextInfo);

var

X: TGLCanvas;

begin

X := TGLCanvas.Create(Width, Height);

try

X.Ellipse(10, 10, 20, 20);

finally

X.Free();

end;

end;

 

procedure TForm1.GLSceneViewerMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

Obj: TGLBaseSceneObject;

begin

Obj := GLSceneViewer.Buffer.GetPickedObject(X, Y);

if (Obj nil) then

Caption := Obj.Name;

end;

 

end.

 

 

I wszystko działa cacy... :) Moja hierarchia sceny:

CODE

Scene Root

-- Cameras

-- GLCamera1

-- GLLightSource1

-- Objects

-- GLDirectOpenGL1

-- GLDummyCube1

-- GLCube1

 

Link do komentarza
Udostępnij na innych stronach

Nie, nic nie zmieniałem... Kurdę, to już nie wiem... :huh: Może błąd masz w kodzie gdzieś lub spróbuj zrobić tak, jak Ci Toster napisał.

 

Rozkładam ręce... zrobiłem całkowicie na nowo na czystym projekcie, wszystko wg Twoich wskazań, Brainer, i dalej lipa.. czyżby różnica wersji? Sam nie wiem.. czuję się głupi..

 

Drugiego sposobu nie znam - jak zamienić bufory ? (nie odnalazłem żadnej metody swapBuffers)

Link do komentarza
Udostępnij na innych stronach

Prześlij mi ten projekt na maila - zobaczę, co da się zrobić. :)

 

Dzięki za chęci, ale z podesłaniem całego projektu nie przejdzie - pracka inżynierska... mam nadzieję, że zrozumiesz :) Ewentualnie mogę podesłać to małe cudo napisane według Twoich wskazówek - co o dziwo też mi nie działa - ale z drugiej strony - co tam można było źle napisać ? :(

 

Analizuje kawałek po kawałku i wiem na pewno, że problem pojawia się w momencie stworzenia Canvasa. Jeżeli będzie istaniał sam GLDirectOpenGL, to obiekty zaznaczają się tak jak powinny...

Link do komentarza
Udostępnij na innych stronach

GLScene_v09b\Demos\bench\canvas\

 

Właśnie na podstawie tego przykładu próbuję zrobić to rysowanie. Nie rozumiem tylko gdzie tam następuje zamiana buforów? Ogólnie u siebie mam zrobione w ten sam sposób, tylko dochodzi obsługa zdarzeń myszy i pobierania klikniętych obiektów...

Link do komentarza
Udostępnij na innych stronach

Wiem, w czym problem... Chodzi o to, że w tym projekcie, co mi podesłałeś, kamera jest przesunięta (1;1;4) i program nie "chwyta" obiektów w oddali. <_ nie mam poj jak to naprawi ale popytam tu i dam ci odpowied na maila. src="%7B___base_url___%7D/uploads/emoticons/default_smile.png" alt=":)">

Link do komentarza
Udostępnij na innych stronach

Dzięki :) Ja tymczasem też będę dłubał i dociekał czemu tak to działa - najważniejsze - jest już jakiś punkt zaczepienia :)

 

EDIT:

 

No i wydłubałem :) Znalazłem mały sposób na obejście problemu:

 

CODEglDirectOpenGL.Visible := false;

picked := SceneViewer.Buffer.GetPickedObject(x,y);

glDirectOpenGL.Visible := true;

 

 

I tak to wygląda - przed wywołaniem metody getPickedObject po prostu chowamy naszego TGLDirectOpenGL po czym odkrywamy i wszystko jest ok :) Obiekty dają się wybrać, canvas maluje co się da, efektu migania brak :)

 

Chyba tylko narobiłem zamieszania, ale jakby co - rozwiązanie już mamy :)

 

Pozdrawiam wszystkich!

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...