WPF 3D problem z grafiką

Własne projekty oraz implementacje.

Moderator: xxSlayeRxx

WPF 3D problem z grafiką

Sponsor

Sponsor
 

WPF 3D problem z grafiką

Postprzez aber18 » Śr lip 18, 2012 6:16 am

Witam

Piszę pewien projekt a mianowicie wizualizację gięcia drutu w 3D do giętarki CNC. Brzmi strasznie ale póki co moje problemy są czysto C# -owe, bez związku ze sterowaniem maszyną. Do sedna, dla uproszczenia przyjmijmy, że na początku drut gną tylko w jednym wymiarze. Na wejściu otrzymuję listę kolejnych instrukcji jako parametry wysunięcie drutu oraz kąt gięcia.
Moja koncepcja jest taka, że dla każdego kawałka drutu tworzę osobny walec, i ustawiam je jeden za drugim wewnątrz pudła symulującego maszynę. Dotychczas sam symulowałem wysunięcie drutu poprzez odpowiednie zmiany punktu początkowego o małe wartości co krótki odstęp czasu (np 20 ms). Dla każdej kolejnej instrukcji symuluję wysunięcie drutu i gięcie o dany kąt i tu wszystko działa ok, problem jest taki, że dla kolejnych kawałków drutu jeżeli je wygniemy np o 45 st to punkt końcowy zmienia swoje położenie po jakimś łuku. Teraz należałoby przesunąć wszystkie odcinki drutu, które dotychczas zostały "przetworzone" o przesunięcie punktu końcowego aktualnie przetwarzanego, i na to właśnie nie mam pomysłu.

1. Czy powinienem robić to jakoś ręcznie czy są jakieś gotowe metody w WPF 3D aby poddać tej samej transformacji co obiekt klasy ModelVisual3D obiekt klasy Point3D?
2. W WPF 3D istnieje coś takiego jak animacje, ale nie ogarniam ich do końca? Czy mogą one mieć jakieś zastosowanie w rozwiązaniu mojego problemu?

Kod:

Kod: Zaznacz cały
 
private void wire_control()
        {
            double plus = 0;// zwiększenie średnicy kolejnych elementów, aby sprawdzić czy wychodzą kolejne druty
            cyl_off = new Point3D(0, 0, cyl_off.Z - mm_to_3d(l_instr[nr_instr].Wys));   // przesunięcie pierwszego kawałka drutu o jego długość w stronę  -Z, tak aby wychodził z początku części ruchomej giętarki
            //na początku tworzymy wszystkie cylindry imitujące wszystkie kawałki drutu
            foreach (Giet_instr tmp in l_instr)
            {
                shapes.cylinders.Add(shapes.GetCylinder(shapes.GetSurfaceMaterial(Colors.DarkGray), cyl_off, cyl_radius + plus, +mm_to_3d(l_instr[nr_instr].Wys)));     //dodawanie nowego elementu drutu
                mainViewport.Children.Add(shapes.cylinders[nr_instr]);    //przekazanie utworzonego modelu do Viewport3D
                shapes.cylinders[nr_instr].pt = cyl_off;
                cyl_off = new Point3D(0, 0, cyl_off.Z - mm_to_3d(l_instr[nr_instr].Wys));
                nr_instr++;           
                plus += 0.1;
            }

            Thread transf = new Thread(przesun);
            transf.Start();
        }

 
        //funkcja wykonywana przez nowy wątek
        void przesun()
        {
            nr_instr = 0;                    //iość aktualnie przetworzonych instrukcji
            cyl_off = new Point3D(0, 0, 0); //wyzerowanie przesunięcia

            foreach (Giet_instr tmp in l_instr) //dla każdej instrukcji symulujemy wysunięcie drutu
            {
                il_tickow = (int)tmp.Wys;       //każdy element będziemy wyświetlać przez pewien okres czasu
                nr_instr++;
                for (int counter = il_tickow; counter > 0; counter--)   
                {
                    //Kod potrzebny w przypadku kiedy wątek próbuje uzyskać dotęp do kontrolek których sam nie jest twórcą
                    Application.Current.Dispatcher.Invoke(
                     DispatcherPriority.Background, new Action(() =>
                     {
                         foreach (ExModelVisual3D ins in shapes.cylinders)
                         {
                             Vector3D przesuniecie = new Vector3D(0, 0, +0.05);
                             ins.off = ins.off + przesuniecie;
                             ins.Transform = shapes.Transform(ins.ang, ins.pt, ins.off, new Vector3D(0, 1, 0));
                         }
                     }));

                    Thread.Sleep(12);
                }//koniec części odpowiedzialnej za wysunięcie

                int il_gie = (int)tmp.Gie * 100; //stopnie mnożymy przez 100 aby łatwiej było symulować gięcie
                for (int counter = il_gie; counter > 0; counter--)
                {
                    //Kod potrzebny w przypadku kiedy wątek próbuje uzyskać dotęp do kontrolek których sam nie jest twórcą
                    Application.Current.Dispatcher.Invoke(
                     DispatcherPriority.Background, new Action(() =>
                     {
                         for (int li = 0; li < nr_instr; li++)
                         {
                             shapes.cylinders[li].ang += 0.01;
                             shapes.cylinders[li].Transform = shapes.Transform(shapes.cylinders[li].ang, shapes.cylinders[li].pt, shapes.cylinders[li].off, new Vector3D(0, 1, 0));
                         }
                     }));

                }
               
                //Kod potrzebny w przypadku kiedy wątek próbuje uzyskać dotęp do kontrolek których sam nie jest twórcą
                Application.Current.Dispatcher.Invoke(
                 DispatcherPriority.Background, new Action(() =>
                 {
                     if (nr_instr < l_instr.Count-1)
                     {
                         shapes.cylinders[nr_instr-1].pt = calc_rot(shapes.cylinders[nr_instr-1].pt, l_instr[nr_instr].Gie, l_instr[nr_instr].Wys);
                         shapes.cylinders[nr_instr-1].Transform = shapes.Transform(shapes.cylinders[nr_instr-1].ang, shapes.cylinders[nr_instr-1].pt, shapes.cylinders[nr_instr-1].off, new Vector3D(0, 1, 0));

                     }
                 }));
            }
        }
aber18
New member
 
Posty: 1
Dołączył(a): Śr lip 18, 2012 5:49 am

Re: WPF 3D problem z grafiką

Postprzez wedlock » Cz lip 26, 2012 6:02 am

Nie kodziłem w WPF -e ale wydaje mi się, że są metody do obsługi wectorów. Jak widze nie obsługujesz punktów tylko wektory. poszukaj w klasie Vector.
wedlock
Member
 
Posty: 52
Dołączył(a): Śr maja 23, 2012 12:45 pm

Re: WPF 3D problem z grafiką

Sponsors

Sponsor
 


Powrót do Projekty i kody źródłowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość

cron