[solved] rzut klikniecia na plaszczyzne gry

0

Witam,

pisząc grę natknąłem się na mały problem. Mianowicie, jak po kliknięciu w obszarze gry wyliczyć, gdzie na terenie zostanie ustawiony marker. Doszedłem do czegoś takiego: Korzystając z wiadomego FOV obliczam kąty zalezne od kąta kamery oraz położenia myszki na ekranie. Następnie z wyliczonych kątów OX i OY tworze wektor. wektor tez zahaczamy w położeniu obserwatora i przesuwamy go do momentu, aż nowe położenie zejdzie po powierzchnię terenu. w takim wypadku, cofamy sie o krok, mnozywy wektor prze 0.5 i znowu powtarzamy te czynności- dla wyliczenia w miare dokładnego położenia. W cpp:

      bool click_on( float & x, float & y){
      static float mx,my,mz,ay,ax,px,py,pz;
      static int dokladnosc,count(0);
      x = y = 0;
      ax = 180 + Kamera.xrot + 45.0 * ( mouse_pos_y - res_y/2 ) / res_y ; // obliczamy kąty
      ay = Kamera.yrot + 45.0 * ( mouse_pos_x - res_x/2 ) / res_y ;

          px = -Kamera._x; // startowe położenie
      py = -Kamera._y;
      pz = -Kamera._z;
      dokladnosc = count = 0;

      my = 0.5 * sin( Pidiv180 * ax ) ; // wyliczamy rozmiar wektora
      mx = 0.5 * -cos( Pidiv180 * ay ) * sin( Pidiv180 * ax );
      mz = 0.5 * sin( Pidiv180 * ay ) * cos( Pidiv180 * ax );

      do{

      if( Wysokosc( px , pz ) >= py ){ // jeżeli jesteśmy pod terenem
       x = px ; // zwracamy pozycje
       y = pz ;
       if( ++dokladnosc == 5 ) return true; // jak już odpowiednia dokładność, to return
       px -= mx; // cofamy sie o krok
       py -= my;
       pz -= mz;
       mx /= 2; // zmniejszamy wymiary wektora
       my /= 2;
       mz /= 2;
       }
       px += mx; // idziemy dalej
       py += my;
       pz += mz;

      }while( count++ < 1000 );

      return false; // nigdzie nie dotarliśmy
      }

Teraz problem:
Dla niskiego kąta kamery - takiego przy samej ziemi, perfekcyjnie wylicza pozycje. Jednak wraz ze wzrostem kąta - patrzenie od góry, zakres w poziomie ( po kliknięciu na plansze, dobrze wylicza w pionie - z widoku obserwatora, jednak w poziomie zaczyna obcinać - pozycja schodzi się do środka.

Wiec dla kąta 0 jest ok, idąc ku 90 st obcinanie jest niemal do zera. więc wygląda mi to na cos( kąt ), ale gdzie go umieścić, nie mam pojęcia. Dla zobrazowania zamieszczam screen:

http://img404.imageshack.us/img404/3718/screen14.jpg

Więc jak kliknie się z góry na prawy brzeg ekranu, otrzymuje pozycję gdzieś blisko centrum.

tam powinno być

mx = 0.5 * -cos( Pidiv180 * ay ) * cos( Pidiv180 * ax );

Ale to nic nie zmienia.

0

ja bym plaszczyzne pocial na kwadraty i rysowal kazdykwadrat innym kolorem pozniej sprawdzal jaki kolor piksela jest pod kursorem

0

http://www.opengl.org/resources/faq/technical/selection.htm - opisuja GL_SELECTION oraz tez color picking
http://www.codeproject.com/KB/openGL/openglselectobject.aspx - przykladowy kod do glselect..
chyba ze zapomniales powiedziec ze uzywasz D3D/XAML/wtf? :>

a tutaj troche matematyki.. porownaj, moze walnales sie we wzorach:
http://en.wikipedia.org/wiki/Line-plane_intersection
http://www.tar.hu/gamealgorithms/ch22lev1sec2.html
ogolnie.. http://www.google.com/search?q=ray+plane+intersection

0

Dzięki wielkie :) Oblicza elegancko :)

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