Strona 1 z 1

Pozycja kliknięcia

Nowy postNapisane: środa, 29 stycznia 2014, 14:04
przez arturhalaczkiewicz
Szukam, szukam i nic nie mogę znaleźć :(
FireMonkey, mam zaimportowany obiekt OBJ i do niego teksturę, np Ziemie wraz z mapą Ziemi. Teraz obracam tą kulą i klikam w jakieś miejsce (np. w miasto) i chciałbym aby tekstura w tym miejscu się zmieniła, np zaznaczenie miasta. W jaki sposób przeliczyć punkt kliknięty na obiekcie na współrzędne tego punkt w teksturze UV?
Może pokierujecie do jakiegoś forum czy tutoriala o FMX zajmującego się takimi zagadnieniami? Albo najlepiej jakiś przykładowy open source program z taką obsługą obiektów 3D w FireMonkey (kolizje, zaznaczanie, oświetlanie itp)?
~A

Re: Pozycja kliknięcia

Nowy postNapisane: środa, 29 stycznia 2014, 18:57
przez Cyfrowy Baron
Korzystasz ze środowiska C++Builder 6 Professional i masz tam FireMonkey? W ogóle to podajesz tam mało danych, żadnego kodu, że trudno cokolwiek doradzić. A jeśli szukasz tutoriala to polecam wyszukiwarkę goole.

Re: Pozycja kliknięcia

Nowy postNapisane: czwartek, 30 stycznia 2014, 22:14
przez arturhalaczkiewicz
Cyfrowy Baron napisał(a):Korzystasz ze środowiska C++Builder 6 Professional i masz tam FireMonkey?

Nie, testuję triala XE4 w oczekiwaniu na wersję XE5 z możliwością kompilacji na Androida. Cały czas nie kupuję XE5 pomimo zachęcającej promocji/update bo Embarcadero nie potrafi odpowiedzieć na pytanie KIEDY będzie taka wersja z Androidem Buildera. Poza tym zanim wydam te kilka tysięcy to chciałbym dokładnie poznać możliwości tego narzędzia - a jedyne co mnie interesuje to wieloplatformowość kodu z użyciem FireMonkey.
Ale to chyba taki off-topic?

Cyfrowy Baron napisał(a):W ogóle to podajesz tam mało danych, żadnego kodu, że trudno cokolwiek doradzić.

Mam Image3D i potrafię go obracać, skalować, przemieszczać i dzięki tej rutynce, malować po nim:
Kod: Zaznacz cały
bool    draw;
int    old_position_X;
int    old_position_Y;

void __fastcall TForm1::Image3D(TObject *Sender, TShiftState Shift, float X,
        float Y, TVector3D &RayPos, TVector3D &RayDir)
{
   if (Shift.Contains(ssLeft))
   {
      if (draw==true)
      {
         TVector3D HitPos;
         Image3D->Context->Pick(X, Y, TProjection::pjCamera, RayPos, RayDir);
         RayCastPlaneIntersect(RayPos, RayDir, Image3D->AbsolutePosition, Image3D->AbsoluteDirection, HitPos) ;
         HitPos.X -= Image3D->Position->X;
         HitPos.Y -= Image3D->Position->Y;

         int w=Image3D->Bitmap->Width;
         int h=Image3D->Bitmap->Height;
         int x=(w/Image3D->Width)*(HitPos.X+Image3D->Width/2.0);
         int y=(h/Image3D->Height)*(HitPos.Y+Image3D->Height/2.0);

         Image3D->Bitmap->Canvas->BeginScene();
         Image3D->Bitmap->Canvas->Stroke->Kind=TBrushKind::bkSolid;
         Image3D->Bitmap->Canvas->Stroke->Color=claRed;
         Image3D->Bitmap->Canvas->DrawLine(TPointF(old_position_X,old_position_Y),TPointF(x,y),1.0);
         Image3D->Bitmap->Canvas->EndScene();

         old_position_X=x;
         old_position_Y=y;
      }
   }
   else
   {
      draw=false;
   }
}


Teraz chciałbym zrobić to samo, ale na zaimportowanym obiekcie OBJ - ale nie do końca wiem nawet jak się za to zabrać...
1. nie rozumiem zależności w obiektach 3D pomiędzy skalą a parametrami Width i Height - po co te parametry się powtarzają? To tylko zaciemnia obraz moim zdaniem...
2. nie rozumiem zależności między piklowo określonymi teksturami a pozycjami w świecie 3D, kilka lat temu robiłem jakieś próby z openGL i miałem mgliste pojęcie o pracy w środowisku 3D - ale to co oferuje FMX jest jakieś... innne
3. nie wiem jak przeliczyć określoną pozycję trójkąta w obiekcie na współrzędne tekstury która do malowania tego trójkąta jest wykorzystywana

Cyfrowy Baron napisał(a):A jeśli szukasz tutoriala to polecam wyszukiwarkę goole.

LOL! Swój wpis zacząłem od "Szukam, szukam i nic nie mogę znaleźć"
Najbardziej podpasiła mi seria Quark Cube http://www.youtube.com/user/QuarkCube?feature=watch ale wygoda analizy kodu na youtube jest dalece niewygodna - a nigdzie nie mogę znaleźć by udostępniali te kody...