Autor Wątek: Ogre3d - BSP - Ogre::Ray  (Przeczytany 3012 razy)

Offline Attre

  • Użytkownik

# Kwiecień 10, 2007, 18:43:39
Witajcie,

Mapę świata zapisaną mam w bsp. Do oprogramowania tego używam gotowego silnika Ogre3d. Bezpośrednim moim problemem są kolizje kamera vs świat. Postanowiłam rozwiązać to całkiem mechanicznie używając promieni.(API do promienia) Jak można było zauważyć po przykładzie CollisionBsp załączonym do bibliotek promień reaguje na przeszkody w postaci ścian. Ma także metodę distance, dzięki której odczytuję odległość od przeszkody/ściany.
Sczytuje sobie odległość i w momęcie gdy jest mniejsza niż nie pozwalam poruszać się w danym kierunku dalej.(blokuje klawisz)
Tak wiem bardzo prymitywny sposób ale działa ... alee nie do końca.
Zacznijmy od części działającej. Wszystko jest w porządku gdy promień ma kierunek (x,y,0) czyli w płaszczyźnie poziomej, a dokładnie różniej od wektora skierowanego ku dołowi lub ku górze.

                Ray lRay;
Vector3 lDirection,lOrgin;

lDirection=(Vector3(mCamera->getDirection().x,mCamera->getDirection().y,0));
lOrgin=mCamera->getPosition();

lRay.setOrigin(lOrgin);
lRay.setDirection(lDirection);

gRay->setRay(lRay);
RaySceneQueryResult& rayResult = gRay->execute();

RaySceneQueryResult::iterator rayIt = rayResult.begin();
if (rayIt != rayResult.end())
        {
            RaySceneQueryResultEntry& res = *rayIt;

if(res.distance<80)
{
smallDistanceW=true;
}
else
{
smallDistanceW=false;
}
}
Takie coś działa bez zarzutu. Nie przechodzę kamerą przez ściany, zatrzymuję się przed nią w odpowiedniej odległości.

Jednak gdy tylko chcę użyć tego do odczytania odległości od podłoża oraz ustawić kamerę na pożądanej wysokości dzieją się cuda.
oto kawałek nie działającego poprawnie kodu:
lDirection=(0,0,-1);
lRay.setDirection(lDirection);
gRay->setRay(lRay);
rayResult = gRay->execute();
rayIt = rayResult.begin();
Real odleglosc=0;
Real nowa_wsp=mCamera->getPosition().z;

if (rayIt != rayResult.end())
        {
            RaySceneQueryResultEntry& res = *rayIt;

if(res.distance!=132)
{
odleglosc = 132-res.distance;
nowa_wsp = nowa_wsp+odleglosc;
mWindow->setDebugText("distance   "+StringConverter::toString(res.distance)+"   roznica poziomow  "+StringConverter::toString(odleglosc)+" wspolzedna "+StringConverter::toString((132-res.distance)+mCamera->getPosition().z));
mCamera->setPosition(Vector3(mCamera->getPosition().x,mCamera->getPosition().y,nowa_wsp));
}
else
{
  mWindow->setDebugText("distance   "+StringConverter::toString(res.distance)+"   roznica poziomow  "+StringConverter::toString(odleglosc)+" wspolzedna "+StringConverter::toString(mCamera->getPosition().z+odleglosc));
}
}


Kamera bardzo dziwnie się zachowuje. Tzn. po poruszeniu nią ona umieszcza się na najwyższym miejscu mapy czyli na suficie dokładnie nad nim i uważa ze odległość jest 132 czyli taka jaką chcę.
Warto zaznaczyć ze jeśli zlikwiduję samo ustawianie kamery w tym punkcje zależnym od dystansu, wtedy wszystko liczy poprawnie. Czyli wyświetla odległości, wysokości i przyszłe/oszacowane współrzędne poprawnie.

:( nie wiem co jest źle. Może ja coś źle rozumuje. Pomóżcie.
Jeśli chcielibyście kod w całości napiszcie.



Ps. Jeśli temat umieściłam w złym dziale przepraszam i proszę o przeniesienie.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Attre

  • Użytkownik

# Kwiecień 10, 2007, 20:48:56
 >:( :'(

Testując jeszcze inne różne opcje okazuje się ze ten distance jest jakoś dziwnie mierzony. Czasem od podłoża czasem od nie wiadomo czego, czasem pomimo zmiany wysokosci mierzy i tak od tej pierwszej podłogi ... poprostu jak mu sie podoba :(.

Mam teraz inne pytanie.
Czy macie jakies inne pomysły w jaki sposób mogę utrzymywać kamerę na stałej wysokości względem podłoża ? Czyli tak aby chodzenie po schodach było możliwe.

Offline Ocelot

  • Użytkownik
    • Ocelot's Jungle

# Kwiecień 11, 2007, 10:56:47
Czy zadajesz sobie sprawę, że Ray w Ogre sprawdza kolizję z bbox'em? Co tłumaczy ustawianie się "na" suficie. :)
Jeżeli chcesz sprawdzać kolizje bezpośrednio z trójkątami, poszukaj na ogreWiki jest tam przykład

Offline Attre

  • Użytkownik

# Kwiecień 12, 2007, 13:53:24
Nie do końca cię rozumiem. Ja mam całą mapkę zrobioną jako bsp. I ray powinien chyba sprawdzić odległość z podłożem - które jest tym głównym pudełkiem.
Sczytuję distace a używając metody getPoint pobieram współrzędną podłoża. Często jest tak że współrzędna Z się zmienia - na dziwne jak dla mnie losowe liczby. I właśnie wtedy gdy wymuszam pozycjonowanie kamery (przesunięcie o określoną wysokość) nawet jak przesunięcie ma być niewielkie (przynajmniej tak z obliczeń wynika) kamera ustawia się często nad całym pudłem.


Może wy macie jakieś inne propozycje jak w BSP zrobić aby kamera była na takim samym poziomie w stosunku do podłoża ?
« Ostatnia zmiana: Kwiecień 12, 2007, 20:56:00 wysłana przez Attre »

Offline Ocelot

  • Użytkownik
    • Ocelot's Jungle

# Kwiecień 12, 2007, 21:34:04
Ta uwaga o bboxie chyba nie dotyczy BSP. :-[
Może to głupie ale w czy w tym drugim kodzie nie brakuje
lOrgin=mCamera->getPosition();
lRay.setOrigin(lOrgin);
chyba, że poprostu nie wkleiłeś w poście?

Może lepiej zapytać na forum Ogre'a?

Offline Attre

  • Użytkownik

# Kwiecień 12, 2007, 22:00:34
Nie ma setOrgin bo to tylko ustawia poczatek wektora na miejsce kamery. Ja pozniej tylko zmieniam kierunek.

Jesli chodzi o forum ogra, umieściłam tam pytanie ale mnie całkiem zignorowali.

Offline Ocelot

  • Użytkownik
    • Ocelot's Jungle

# Kwiecień 16, 2007, 16:04:06
Spróbuj wykonać swój kod na jakiejść prostej scenie tzn. coś w rodzaju jednego pomieszczenia bez jakichkolwiek pochylni stopni, po prostu pudełko albo jeszcze lepiej tylko podłoga.
Podejrzewam, że twój problem może być związany z działaniem ray na scenemanagerze typu BSP. Najlepiej jakbyś próbował przeglądnąć źródła Ogre'a dla tego scenemanagera. ;)

Ps. Może lepiej wykorzystać jakąś bibliotekę do wykrywania kolizji? Na forum Ogre'a znajdziesz przykład z biblioteką OPCODE