Forum Linux.pl

Programowanie => Java => Wątek zaczęty przez: axlinux w 2011-01-09, 10:02:14

Tytuł: Problem z Javą, a dokładnie z Javą 3D
Wiadomość wysłana przez: axlinux w 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 :)
Tytuł: Problem z Javą, a dokładnie z Javą 3D
Wiadomość wysłana przez: vanhelzing w 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.
Tytuł: Problem z Javą, a dokładnie z Javą 3D
Wiadomość wysłana przez: Ksanderon w 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
Tytuł: Problem z Javą, a dokładnie z Javą 3D
Wiadomość wysłana przez: axlinux w 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