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.