AI / Oświetlenie - czy dany punkt jest widoczny / oświetlony


#1

Cześć,
poszukuje wzoru, który pozwoli mi ustalić czy dany punkt oświetla inny. Tak na prawdę do AI mi to potrzebne, ale sprowadza się właśnie do tego obliczenia.

Mam punkt A i B, są one w przestrzeni 3D. I teraz łatwo jest obliczyć odległość pomiędzy tymi punktami, ale by ustalić czy jeden punkt “widzi” drugi lub oświetla drugi punkt potrzebujemy już nieco bardziej skomplikowanego wzoru. Ten wzór kiedyś już widziałem, jednak nie mogę sobie przypomnieć gdzie i tak poszukuje już z parę dni.

Wygląda to mniej więcej tak w płaszczyźnie 2D:
2020-08-02_18h41_19

A potrzebuje tego w 3D. Mógłbym liczyć każdy wymiar XY, XZ, YZ, Jednocześnie potrzebuje w jakim stopniu jest ten punkt odległy od promienia mającego największą siłę oświetlenia. Tak jak na obrazku, punkt zielony byłby mniej oświetlony od tego który byłby bliżej fioletowej linii.

Jedyne co znalazłem to wrzucenie tego do DirectX lub OpenGL. A że potrzebuje to do AI by odpowiednio reagowało zależnie od widoczności to mija się z celem. Zależy mi na tym by wyliczyć procentowo widoczność obiektu uwzględniając że 100% to wprost od punktu czerwonego i na linii fioletowej a 0% poza niebieskim obszarem.

Ewentualnie jakbyście posiadali jakieś podpowiedzi pod jakimi hasłami szukać to też byłoby ok.


#2

ja bym do tego podszedł analitycznie najprościej jak umie (bo umiem tylko proste rzeczy :D)
sprawdzenie wszystkich obiektów od czerwonego punktu w jakim są kącie od wektora (fioletowej lini)
to poniżej to niekoniecznie

jeśli są w odpowiednim kącie (niebieskim) to funkcją trygonometryczną zrobić odległość od fioletowej lini do punktu (zielonego) rzutowanego pod kątem prosty na linie fioletową

do ustalenia widoczności wystarczy proporcja kątów


#3

Czyli proponujesz rozwiązanie niejako siłowe. Też powoli skłaniam się do tego rozwiązania, choć z tego co pamiętam ten wzór który poszukuje jest stosunkowo prosty i w przypadku jednego AI to nie ma problemu, ale gdy jest ich 10 tysięcy lub więcej zaczyna być to obciążeniem, chyba że coś źle zrozumiałem w Twoim rozumowaniu.


#4

Sprawdzasz czy punkt jest w sferze, jeśli jest to
puszczasz raytracing/raycast w kierunku punktu, jeśli promień dotarł do punktu to na podstawie odległości wykluczasz oddziaływanie. Jeśli twój silnik nie obsługuje raytracingu to musisz sam posprawdzać kolizję


#5

nawet z tym wzorem co szukasz musisz iterować po wszystkich obiektach, jeśli obiekty są statyczne to można by było stosunkowo łatwo zrobić to z octree, ale to i tak wszystko skomplikuje.
pytanko: robisz grę rts ?


#6

Podejście w ramach sfery jest dobre, jednak też nie daje zbyt precyzyjnie tego co oczekuje od wyniku.
Punkt wysylajacy sygnal z zalozenia posiada u mnie okreslony ładunek. Ten ładunek z odległościa od tego punktu maleje oraz odlegloscia od celu na jaki „patrzy” obiekt. Mamy wiec do czynienia z wzorem klasycznego oświetlenia punktu przez latarke.

Silnik jako taki mnie nie interesuje w tym wypadku, cale AI musi byc niezalezne od czegokolwiek, podatawowe dzialania jezyka. Tak jak wspomnialem moglbym uzyc OpenGL lub DirectX lecz to nie jest to na czym mi zalezy, czyli ile z wysylanego sygnalu procentowo dociera do innego punktu


#7

Pełna zgoda co do iteracji. Jednak iteracja jednego dzialania a kilku to już jest różnica.
Ogólnie nie wiem czy to na wektorach znormalizowanych sie liczyło w jakiś sposób.

Chyba taka ksiazka byla OpenGL. Wstep do programowania gier. Przyklad z latarka oswietlajaca sprite’a. Nie wiem czy ma ktos dostep do tej ksiazki. Moja pewnie gdzies jest schowana w glebi dokladnie tam gdzie bym nie szukal :wink:

Co do gry, to prawie trafiles. Obecnie koncepcja jest w kierunku FPS polaczonym z RTS. Z mozliwoscia przepiecia sie na dowolna postac w ramach walk. AI musi tutaj byc zarowno szybkie jak i precyzyjne.

I tu wracamy do iteracji poniewaz nieco podobnie do neuronu ludzkiego iteracja bedzie przez odbior informacji z kilku zrodel wypuszczajac wlasne, ktore dopiero w nastepnej klatce jest interpretowane. Ogolnie problem ma rozwiazywac glupote jednostek by na siebie nie wpadaly i szly w miare stabilnie. Poslugiwanie sie samymi odleglosciami tutaj sie nie sprawdza. Na ten moment grzana jest wlasnie koncepcja ta by dopiero pozniej odpowiednio reagujac. Wedlug symulowanej pracy wyglada to lepiej niz sie spodziewalem, lecz teraz mam problem wlasnie okreslenia ile procent wysylanego sygnalu odbierze dana jednostka od innej. Moc syganalu to dla mnie wielkosc jednostki, wiec im silniejszy sygnal tym dalej musi sie odsunac. Gdyby nie umowa poufnosci to bym pokazal jak swietnie na symulowanych procentach jednostki rozstepuja sie by przepuscic ogromna postac po czym wracaja do swojej formacji.


#8

Ale jeśli masz dystans do obiektu i wartość ładunku to już liczenie jego wartości dla danego dystansu jest proste


#9

Jeżeli chodzi o odleglosc to tak łatwo obliczyc tracenie „sygnalu” na odleglosci. Niemniej wysylany jest sygnal kierunkowy a nie w kazda strone. Wlasnie to jest tutaj zagadka do wyliczenia