Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Problem z Javą, a dokładnie z Javą 3D  (Przeczytany 7651 razy)

axlinux

  • Gość
Problem z Javą, a dokładnie z Javą 3D
« dnia: 2011-01-09, 10:02:14 »
Hej

Mam taki problem. Musiałem w przestrzeni 3D wyświetlić wykres danej funkcji f(x,y).
Nie było z tym problemów, wyznaczyłem sobie punkty, następnie połączyłem je odpowiednio tak że wyszła siatka. Napisałem to w Jave 3D.

Ale zacząłem kombinować i pomyślałem sobie że fajnie jakby punkty były połączone nie liniami, a były wierzchołkami poligonów tak że cały wykres jest płaszczyzną.

Obkminiłem jak to zrobić, narysował mi program płaszczyznę.

Tutaj pojawia się problem.

Nie wiem jak to wytłumaczyć ale po obróceniu mojego wykresu jest on niewidoczny.
Tzn tak jakby z jednej strony pojedynczy poligon jest widoczny a gdy zajrzy się na niego od drugiej strony (od tyłu, np po obrocie w osi X) jest niewidoczny.

Nie mam ustawionego żadnego oświetlenia, ponieważ jeszcze nad tym będę pracował.

Być może ktoś kto korzysta z OpenGL będzie wiedzieć co jest grane, o czym ja zapomniałem albo co ja głupio zrobiłem.

Oto kawałek kodu:



    private QuadArray drawQuadArray(ArrayList points)
    {
        QuadArray quadArray = new QuadArray (1000000, QuadArray.COORDINATES);
        Point3d[] pointsArray = points.get(0);
        int dimension = pointsArray.length; //Pobieram jaka jest długość wymiaru X

        int i=0;        
       
        for(int j=1 ; j        {
            for(int k=1 ; k            {
                Point3d a = points.get(k)[j];
                Point3d b = points.get(k-1)[j];
                Point3d c = points.get(k)[j-1];
                Point3d d = points.get(k-1)[j-1];
                quadArray.setCoordinate (i++, a);
                quadArray.setCoordinate (i++, b);
                quadArray.setCoordinate (i++, d);
                quadArray.setCoordinate (i++, c);
               
                //System.out.println(a + " " + b + " " + c + " " +d);
            }
        }
        return quadArray;
    }
Kod oczywiście jest poglądowy :P

W ArrayList points trzymam punkty które chcę połączyć.

Wdzięczny byłbym za każdą wskazówkę. Może jak dodam materiał z jakiego jest obiekt wykonany i oświetlenie to coś to zmieni ??

Pozdrawiam :)

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Problem z Javą, a dokładnie z Javą 3D
« Odpowiedź #1 dnia: 2011-01-09, 13:08:12 »
Nie bawiłem się jeszcze Java3D, ale w OpenGL:

1) glCullFace włącza / wyłącza rysowanie frontu lub tyłu ściany,
2) glFrontFace ustala przód / tył ściany (GL_CW - ściany rysowane zgodnie z ruchem wskazówek zegara są interpretowane jako przód ściany, GL_CCW - ściany rysowane przeciwnie do ruchów wskazówek zegara są skierowane frontem do obserwatora),
3) To może być problem z normalnymi dla wierzchołków / ścian, które skierowane są na zewnątrz ściany.

Szedłbym tym tropem:
1) Ustaw cull face na none (nie ukrywaj stron ścian - rysuje obie strony ściany), w java 3D to metoda setCullFace(CULL_NONE) z PolygonAttributes.
2) Ustal jawnie atrybut FrontFace,
3) Jeżeli nie oświetlasz obiektu ani go nie teksturujesz, możesz nie potrzebować ustawiać normalnych dla ścian.

W OpenGL możesz też dwukrotnie rysować wykres, raz z CULL_FRONT i raz z CULL_BACK i ustalić np. inny kolor dla spodu i frontu wykresu, ale dla tego konkretnego przypadku, spróbuj najpierw z CULL_NONE. Nie do końca orientuję się jak to wygląda w Java3D, ale przypuszczam, że podobnie.

Ksanderon

  • Gość
Problem z Javą, a dokładnie z Javą 3D
« Odpowiedź #2 dnia: 2011-01-09, 13:32:25 »
Uprzedzam ze styczność z OpenGL miałem tylko w C, wiec to co napisze musisz jeszcze zinterpretować tak aby działało u Ciebie.

Gdy chcesz narysować jakiś prymityw dajmy na to kwadrat poszczególne wierzchołki podajesz w pewnej, nieprzypadkowej kolejności np tak(przykład w C):
  glColor3f (1.0,0.0,0.0);
  glBegin (GL_POLYGON);
  glVertex3f (0.0, 0.0, 0.0);
  glVertex3f (0.0, 1.0, 0.0);
  glVertex3f (1.0, 1.0, 0.0);
  glVertex3f (1.0, 0.0, 0.0);
  glEnd ();
kolejność ta decyduje o tym z której strony i które powierzchnie mają być widoczne, a które nie. Oczywiście można to zmienić tak aby rysowane były obie trony, zwykle jednak np. w grach takie coś jest niepożądane- dlatego domyślnie tak to ustalono- jak np zrobiłbyś lustro weneckie?

aby lepiej zapoznać się z zagadnieniem przeczytaj artykuł: http://kursy.ddt.pl/?LessonId=205

axlinux

  • Gość
Problem z Javą, a dokładnie z Javą 3D
« Odpowiedź #3 dnia: 2011-01-09, 14:26:36 »
Wasza odpowiedź była kluczowa w rozwiązaniu mojego problemu.

Dziękuję za Pomoc

Wieczorem wrzucę kod tak aby jeszcze ktoś mógł skorzystać z Waszej pomocy:)


Pozdrawiam