Skocz do zawartości

[Delphi][GLScene] Okulary anaglifowe


derdiusz

Polecane posty

Witam :)

 

Chciałem troszkę urozmaicić to co tworzę w 3d (delphi + glscene) i wpadłem na pomysł aby można oglądać scenę przez okulary anaglifowe(np. czerwono-niebieskie). Trochę ogólnej teorii mam - należy ustawić 2 kamery obok siebie(w odległości równej rozstawowi oczu, czyli ok. 7cm) z czego widok z jednej (prawej) będzie rzutowany w kanale czerwonym całego obrazu. Tylko jak to osiągnąć programując w delphi i glscene? W jaki sposób można modyfikować to co mi glscene wyświetla? (rozbić na kanały rgb i potem złożyć zamieniając kanał R na kanał R z drugiej kamery ?).

 

 

Pozdrawiam

derdiusz

Link do komentarza
Udostępnij na innych stronach

Super :) Dzięki za informacje!

 

Ale nie jest łatwo... nie mogę nigdzie odnaleźć czym jest (i gdzie jest jego implementacja) TPixelBuffer:

 

...

PBuffer := TPixelBuffer.Create(PBufSize, PBufSize, DC, RC, Self);

...

 

Typ TPixelBuffer nie występuje w GLScene.. :huh:

 

EDIT:

 

Właściwie to mam też problem z wykorzystaniem glColorMask - mianowicie, jeżeli używam go w TGLDirectOpenGL (w którym także używam TGLCanvas) to efekt glColorMask jest widoczny tylko i wyłącznie na elementach, które narysowałem na TGLCanvas - nie na całości :(

Link do komentarza
Udostępnij na innych stronach

Udało mi się dojść do pewnych wniosków i efektów. Aby wyrenderować obraz skłądający się np. tylko ze składowej R należy do sceny dodać TGLDirectOpenGL (na samej górze listy!) i w metodzie onRender wstawić wcześniej wspomniany przez kolegów glColorMask:

 

procedure Tfrm_main.GLDirectOpenGL1Render(Sender: TObject; var rci: TRenderContextInfo);
begin

glColorMask(true,false,false,true);

end;

G\"v3&zx7\"k+)ĆĄ$H7kFŚzźŁr)z;$i0z3nzlĄŁ^Ęhą^bppŚv6Ć$6G'VRĆf6RĆf6RG'VR66VćUfWvW\"ć6W&Ł6ÓŚv6Ć$6f6RĆf6RG'VRG'VR66VćUfWvW\"ć6W&Ł6Ó#Ę'sŚłĄ+-p  ]x*ŁKŁ9jxŻ*knzkui'
sceneViewer.Buffer.Redner; 

 

ale i to nie pomogło... jak tego dokonać ?

 

Pozdrawiam

Derdiusz

Link do komentarza
Udostępnij na innych stronach

 

Zawsze coś :) Ale kurcze... nie wiem w jaki sposób sobie to przełożyć na glScene :( zresztą przy tej próbie pojawiają się nieoczekiwane błedy typu "niedopełnienie stosu" przy wywołaniu glMatrixMode(GL_PROJECTION), które chyba zresztą nie jest potrzebne, podobnie jak glFrustum() ponieważ glscene posiada własne kamery, które tam sobie obsługuje...

 

.. właściwie brakuje mi już tylko malutkiej iskierki, która pozwoli na wymuszenie przerenderowania sceny w metodzie OnRender obiektu TGLDirectOpenGL();

 

próbowałem też wykorzystać metodę sceneViewer.Buffer.RenderingContext.SwapBuffers, ale też nie daje pożądanego rezultatu :(

 

Brainer: miło Cię widzieć w innym miejscu sieci ;)

Link do komentarza
Udostępnij na innych stronach

Spróbuj tak: dodaj na formularz komponent TGLCadencer i w zdarzeniu OnProgress wpisz:

 
procedure TForm2.GLCadencer1Progress(Sender: TObject; const deltaTime,
 newTime: Double);
begin
 GLSceneViewer1.Invalidate();
end;
-zkĄŚ)Q1Ń=0IĄMQ=(QI
ŃŃ%ź)(1M  UŃ(ą
ą5ŹĄ1}QIU1}1M1}1M1}QIU(ź1MY
1
(AŃ1
AŃYŃ(Ń1
ŃYŃ(U1
UYŃ((ą
ą5ŹĄ1}1M1}1M1}QIU1}QIU(AŃ1
AŃYŃ(Ń1
ŃYŃ(U1
UYŃ(1MUŃ)(

 

Nie jestem pewien, czy to podziała. :huh:

 

Brainer: miło Cię widzieć w innym miejscu sieci ;)

Nom bywam tu i ówdzie! ^_^

Link do komentarza
Udostępnij na innych stronach

Jakoś nie bardzo ;)

 

Ale udało mi się wykombinować coś co jest "bliskie" finalnemu efektowi:

 

 \\ pierwsze oko
 glColorMask(true,false,false,true);
 cam.MoveAroundTarget(0,se_eye_distance.value); // "se_eye_distance" to TSpinEdit dzięki, któremu ustawiam odległość między oczami (domyślnie 1)
 cam.Apply;
 dummy_sceneObjects.DoRender(rci, false, true);

 \\ drugie oko
 glColorMask(false,true,true,true);
 cam.MoveAroundTarget(0,-se_eye_distance.value);
 cam.Apply;
 dummy_sceneObjects.DoRender(rci, false, true);

 

Ale widok z pierwszego oka nie jest przesunięty lekko w bok a pojawia się w wyjątkowo dziwnej pozycji, gdzieś pod drugim rzutem i jest obrócony w dodatku...

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

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

×
×
  • Utwórz nowe...