[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 :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.