Przewijanie zdjęć 3d

0

Witam!

Od razu zaznaczam, że miałem mały problem z tematem, ponieważ sam nie wiem jak to się nazywa :-[ .

Chodzi mi o takie 'coś', co występuje w iPod'ach/iTunes do przewijania płyt, lub w FoxTabie do przewijania zakładek. Nie bardzo wiem jak to ubrać w słowa, ale myślę, że każdy kiedyś widział coś takiego i wie o co mi chodzi. Mam wrażenie, że kiedyś o tym czytałem na tym forum, tylko za nic nie mogę tego znaleźć (jak wyżej). Chciałbym w czymś takim wyświetlać fotki, lub jeszcze lepiej... wsadzać tam kontrolki, chociaż z tym może być ciężko, jak myślę.

Pytam tutaj, ponieważ przy okazji szukam implementacji czegoś takiego w WinFormsach (podejrzewam, że w WPF to kilka linijek, ale cóż...) lub chociaż hasła, którego mam szukać.

Pozdrawiam, Wronq!

0

Nie znam się w ogóle na C#, ani zbyt dobrze na 3D, ale wygląda na to że będziesz musiał użyć jakiejś biblioteki do 3D. Jeśli masz szczęście, to znajdziesz gotowca do takich efektów, jeśli masz pecha to będziesz musiał używać directX / openGL.

0

ale myślę, że każdy kiedyś widział coś takiego i wie o co mi chodzi

Nie, nie widział, nie wie. Ale jeśli chcesz, by zdjęcia się w jakiś sposób przewijały trójwymiarowo, to OpenGL, Direct3D albo XNA.

0

Jak nie widział, to proszę, screen z FoxTaba.

Z dotychczasowych wypowiedzi wynika, że w prosty sposób tego nie zrobię, z resztą jak się spodziewałem. W iTunes to nazywa się Cover Flow, coś szukałem o tym i nawet znalazłem tutorial, lecz w WPF.

Pozdrawiam, Wronq!

Edit: znalazłem temat, o którym wspominałem: http://4programmers.net/Forum/viewtopic.php?id=156878

Może zaprzęgnąć do pracy ElementHost i kontrolkę napisać w WPF. Czy to dobry pomysł?

0

Jeśli będziesz to robić w DX lub OpenGL to chyba dobrze by było to zrobić jako mapowanie tekstur - każde zdjęcie będzie teksturą dla wielokąta w przestrzeni. Ale jak już mówiłem nie znam się dobrze na 3D, więc może jest jakiś lepszy sposób.

0

jesli to maja byc tylko zdjecia (czy jakies obrazy, ktore mozesz narysowac, tzn. w kazdej chwili masz wszystkie dane zeby je narysowac), to troche prostej geometrii i spokojnie mozesz sam takie cos malowac, to zaden rocket science :)
gorzej jesli elementy tych obrazow pod katem maja byc interaktywne, przyciski etc. to troche wiecej zabawy
no i przy takim podejsciu zapomnij o animacji, bo to za duzo zachodu, a ty nawet nie wiesz jak ugrysc temat

0

Witam ponownie!

Troszkę czasu się z tym męczyłem. Ale stwierdziłem, że to za dużo zabawy ze zwykłym GDI++, ponieważ przy tych wzorach na elipsę, które wykombinowałem, podczas obracania wszystkim to tak dziwnie przyspieszało i zwalniało w niektórych momentach. Liczyłem kąt pozycji myszki względem środka kontrolki, a potem różnicę z poprzednim kątem wyglądało to +/- tak:

        private bool isDown = false;
        private float lastAngle;

        private float RadianToDegree(double angle)
        {
            return ((float)angle * (180.0f / (float)Math.PI) + 180.0f);
        }

        void Carousel_MouseMove(object sender, MouseEventArgs e)
        {
            if (isDown)
            {
                float angl = RadianToDegree(Math.Atan2(e.Y - this.Height / 2, e.X - this.Width / 2));
                AngleOffset -= (lastAngle - angl);

                lastAngle = angl;
                this.Refresh();
            }
        }

        void Carousel_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                isDown = false;
            }
        }

        void Carousel_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                isDown = true;
                lastAngle = RadianToDegree(Math.Atan2(e.Y - this.Height / 2, e.X - this.Width / 2));
            }
        }

Gdzie na podstawie angleOffset wszystko było rysowane:

        private float obliczX(float stopnie, float r)
        {
            return (float)(r * Math.Cos(2.0F * Math.PI * stopnie / 360.0F));
        }

        private float obliczY(float stopnie, float r)
        {
            return (float)(r * Math.Sin(2.0F * Math.PI * stopnie / 360.0F));
        }

       e.Graphics.DrawEllipse(Pens.Red, obliczX(AngleOffset, this.Width / 2) - 3, obliczY(AngleOffset, this.Height / 2) - 3, 6, 6); //Gdzieś w OnPaint

Poza tym w żaden sposób nie mogłem poprawnie wyskalować obrazków, które tam dodawałem, ale cóż...
Jak znajdzie się ktoś chętny, to może ulepszy. :)

Z w/w powodów sięgam po DirectX'a. Tylko nasuwa mi się jedno pytanie... W jaki sposób mam wiedzieć w co kliknął user, zakładając, że będzie sobie mógł ruszać kamerą (lub zakładając, ze ja ją ustawię pod jakimś kątem)?
Coś czuję, że wiąże się to z pewną ilością nie koniecznie prostych obliczeń. Mam nadzieję, że się mylę ;-P

Pozdrawiam, Wronq!

1

Nieszczególnie znam się na DX (jakoś nie przepadam) ale w OpenGl jest specjalny tryb (nazwa wyleciała mi chwilowo z głowy, ew. napisz jeśli będziesz potrzebował to poszukam) gdzie GL sam informuje cię na jaki obiekt jest nakierowany wskaźnik myszy - poszukaj czegoś takiego w DX... albo przerzuć się na GL ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1