derdiusz Napisano Listopad 30, 2007 Zgłoś Share Napisano Listopad 30, 2007 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 More sharing options...
Brainer Napisano Listopad 30, 2007 Zgłoś Share Napisano Listopad 30, 2007 Po co rysujesz tekst w ten sposób? Możesz użyć obiektu TGLHUDText (tekst 2D) lub TGLSpaceText (tekst 3D). Wtedy nie będzie problemu... .: Brainer :. patrick.nusbaum@gmail.com Link do komentarza Udostępnij na innych stronach More sharing options...
derdiusz Napisano Listopad 30, 2007 Autor Zgłoś Share Napisano Listopad 30, 2007 Po co rysujesz tekst w ten sposób? 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 More sharing options...
Brainer Napisano Listopad 30, 2007 Zgłoś Share Napisano Listopad 30, 2007 Spróbuj umieścić obiekt TGLDirectOpenGL w obiekcie TGLDummyCube. .: Brainer :. patrick.nusbaum@gmail.com Link do komentarza Udostępnij na innych stronach More sharing options...
derdiusz Napisano Listopad 30, 2007 Autor Zgłoś Share Napisano Listopad 30, 2007 Nietsety nie pomaga, ale za to powstaje inny ciekawy efekt Wszystko co jest rysowane jest zakrywane obiektami 3d EDIT: efekt ten powstał, ponieważ do tego dummy podpięta też była kamera sceny. natomiast podpięcie go do czystego dummy nic nie daje Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Listopad 30, 2007 Zgłoś Share Napisano Listopad 30, 2007 w GLScene jest przyklad jak uzywac bufora ekranu do renderowania swoich rzeczy. Po renderze calosci sceny bierzesz bufor wpisujesz do niego co potrzebujesz i robisz swapa. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Brainer Napisano Listopad 30, 2007 Zgłoś Share Napisano Listopad 30, 2007 Dziwne... 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 .: Brainer :. patrick.nusbaum@gmail.com Link do komentarza Udostępnij na innych stronach More sharing options...
derdiusz Napisano Listopad 30, 2007 Autor Zgłoś Share Napisano Listopad 30, 2007 Brainer: serio dziwne... strukturę zrobiłem taką samą jak Ty i dalej to samo.. Direct wciąż twki na samym wierzchu. Czy zmieniałeś może jakieś paramtery dla niego ? Toster: o którym przykładzie mówisz ? Link do komentarza Udostępnij na innych stronach More sharing options...
Brainer Napisano Listopad 30, 2007 Zgłoś Share Napisano Listopad 30, 2007 Czy zmieniałeś może jakieś paramtery dla niego ? Nie, nic nie zmieniałem... Kurdę, to już nie wiem... Może błąd masz w kodzie gdzieś lub spróbuj zrobić tak, jak Ci Toster napisał. .: Brainer :. patrick.nusbaum@gmail.com Link do komentarza Udostępnij na innych stronach More sharing options...
derdiusz Napisano Listopad 30, 2007 Autor Zgłoś Share Napisano Listopad 30, 2007 Nie, nic nie zmieniałem... Kurdę, to już nie wiem... 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 More sharing options...
Brainer Napisano Listopad 30, 2007 Zgłoś Share Napisano Listopad 30, 2007 Prześlij mi ten projekt na maila - zobaczę, co da się zrobić. .: Brainer :. patrick.nusbaum@gmail.com Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Listopad 30, 2007 Zgłoś Share Napisano Listopad 30, 2007 GLScene_v09b\Demos\bench\canvas\ Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
derdiusz Napisano Listopad 30, 2007 Autor Zgłoś Share Napisano Listopad 30, 2007 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 More sharing options...
Brainer Napisano Listopad 30, 2007 Zgłoś Share Napisano Listopad 30, 2007 Ah, rozumiem. No dobra, podeślij to "cudo", o którym wspomniałeś. .: Brainer :. patrick.nusbaum@gmail.com Link do komentarza Udostępnij na innych stronach More sharing options...
derdiusz Napisano Listopad 30, 2007 Autor Zgłoś Share Napisano Listopad 30, 2007 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 More sharing options...
Brainer Napisano Listopad 30, 2007 Zgłoś Share Napisano Listopad 30, 2007 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=":)"> .: Brainer :. patrick.nusbaum@gmail.com Link do komentarza Udostępnij na innych stronach More sharing options...
derdiusz Napisano Listopad 30, 2007 Autor Zgłoś Share Napisano Listopad 30, 2007 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 More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.