játékfejlesztés.hu
FórumGarázsprojectekCikkekSegédletekJf.hu versenyekKapcsolatokEgyebek
Legaktívabb fórumozók:
Asylum:    5513
FZoli:    4895
Kuz:    4455
gaborlabor:    4449
kicsy:    4304
TPG:    3402
monostoria:    3284
DMG:    3172
HomeGnome:    2919
Matzi:    2529

Pretender:    2498
szeki:    2440
Seeting:    2306
Geri:    2203
Orphy:    1893
Joga:    1791
Bacce:    1783
MaNiAc:    1735
ddbwo:    1654
syam:    1491
Korábbi postok
> 1 < [2] [3] [4] [5] [6] [7] [8] [9] [10] [15] [20] [21]
Instalok - Tag | 619 hsz       Online status #212346   2019.02.21 22:10 GMT+1 óra  
Mennyivel jobban szeretem az ilyen magyarázatokat, mint a hosszas-hosszas formulákkal való levezetést. Persze nem azt mondom, az is kell, azzal lehet helyességet bizonyítani, stb., de elmagyarázni valakinek szerintem valahogy így kellene ezeket a dolgokat:

   
full3nzo - Tag | 54 hsz       Online status #212168   2018.09.05 06:06 GMT+1 óra  

Ezt a hozzászólást full3nzo módosította (2018.09.10 19:57 GMT+1 óra, 527 nap)

   
full3nzo - Tag | 54 hsz       Online status #212075   2018.06.03 07:40 GMT+1 óra  
Köszönöm a gyors választ "ismét" ...

Jelenleg libGDX - et használok, mert az Android Oreó-val lett némi problémám az ezelőtti módszereimmel - nemes egyszerűséggel lefagyott a képkezelések miatt.

@Instalok: rendben működik, de 90 fokot ki kell vonnom az eredményből.



itt csak az avatar hajót forgattam a teszt miatt:

Kód:
float angle = -90 + (float) Math.toDegrees(Math.atan2(t.getY() - h.getY(), t.getX() - h.getX()));
h.setRotation(angle);

Ezt a hozzászólást full3nzo módosította (2018.06.04 04:59 GMT+1 óra, 626 nap)

   
Instalok - Tag | 619 hsz       Online status #212074   2018.06.03 07:35 GMT+1 óra  
Ha például Unity-t használsz, akkor ott van beépített függvény erre, ha pedig nem, akkor itt az alapelv:

2D-ben két objektum pozíciójának a különbsége meghatároz egy háromszöget.
Ez a (derékszögű) háromszög mindig az X és Y tengelyekkel párhuzamos/merőleges, a két befogója pedig pont a két objektum pozíciójának az adott koordinátán vett különbsége.

Ekkor felhasználhatjuk azt, hogy a tangens függvény a szöggel szemközti befogó osztva a szög melletti befogóval, tehát
Kód:
tan(alfa) = (T.y - H.y) / (T.x - H.x)

Tehát a tangensnek már csak az inverze kell, hogy megkapjuk a szöget. Erre a legtöbb nyelvben van egy atan2 nevű függvény, ami kiszámolja neked a szöget (a legtöbb esetben radiánban)
Kód:
alfa = atan2(T.y - H.y, T.x - H.x)


A másik lehetőség a "dot product" definíciójának a felhasználása:
dot(a,b) = két vektor által bezárt szög koszinusza szorozva a két vektor hosszával, avagy:
Kód:
dot(a,b) = cos(alfa) * |a| * |b|

Ebből látszik, hogy az alfa könnyen visszaszámolható:
Kód:
cos(alfa) = dot(a,b) / ( |a| * |b| )
alfa = acos(dot(a,b) / ( |a| * |b| ))

Az "a" és "b" vektorok pedig:
- H-ból T-be mutató vektor
- H-ból X-be mutató vektor, ahol X a T-nek az X tengelyre vetített pozíciója (a fenti képen a derékszögnél lévő csúcs)
Egyszerűbb, ha a két vektor normalizált, ekkor elhagyható az osztás, és a "vetített pont" pedig egyszerűen a right (1,0) vektor lesz.

Azt még fontos megjegyezni, hogy a koordináta-rendszertől függően máshol lehet a kívánt 0°, nyilván a megfelelő értékeket ezek alapján kell megválasztani.

Ha nincs gondod az angollal, akkor egy tömörebb, de érthetőbb magyarázatot találsz itt:
https://math.stackexchange.com/questions/1201337/finding-the-angle-between-two-points

   
full3nzo - Tag | 54 hsz       Online status #212073   2018.06.03 06:59 GMT+1 óra  
Sziasztok!

A segítségeteket szeretném kérni: egy olyan kérdésem lenne ami néhány embernek közületek lehet, hogy csak egyszerű rutin, de nekem most rendesen feladta a leckét.

Egy űrhajós játékban 2D koordináta rendszerben az adott koordinátákon van két objektum "t" mint target és "h" mint hunter: hunter lövedéket indít target felé adott sebességgel (ezzel eddig nincs problémám ezt már megoldottam), hogy tudnám meghatározni azt a szöget, amivel a lövedéket el kell forgatnom, hogy a nem pontszerű lövedék a target felé "nézzen".

Tudom nem túl pontos a leírás mivel számít a koordináta rendszer típusa is az előjelek miatt, de tegyűk fel, hogy Y tengely felfele és X tengely jobbra növekszik.

Csak érdekességképpen, ha valaki ilyenen dolgozik: itt van a lövedék mozgatásának számítása - nagyon pontos lett és figyelembe veszi az eltérő képfelbontásokat is:

mXStep = ((mX - x_in) / (mY - y_in) * -1.0f) * Game.cCore.getThousandth() * VELOMINIMUM;

   
Asylum - Törzstag | 5513 hsz       Online status #205931   2014.12.30 17:17 GMT+1 óra  
Írtam én is hasonló cikket, nem tudom segít-e. Írj inkább kódot, mert nem értem mi a probléma.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
Cimpi - Tag | 3 hsz       Online status #205897   2014.12.27 09:52 GMT+1 óra  
Sziasztok!

Egy régebbi cikkel kapcsolatban szeretném a segítségeteket kérni. Crusader írta meglehetősen régen ami egy Tárgy kiválasztásával foglalkozik a modelltérben. Tökéletesen megy a dolog, mert adaptáltam a saját motoromba, de egy dologra nincs felkészítve ugyanis tökéletesen működik egészen addig amíg a kamerát el nem fordítom az X (itt vízszintes) tengely körül - a program továbbra is működik de pontatlan lesz, nem lehet nagy hibája, de én eddig nem találtam megoldást rá. A feladat elég komplex ezért nem hiszem, hogy valaki rá tudna szánni elég időt, hogy nekiálljon elemezni a cikket, bár szerintem elég hasznos lehet - inkább az lenne a kérdésem, hogy van-e esetleg olyan közöttetek, aki találkozott, már ezzel a problémával és tudna segíteni, vagy egy - ezt a témát boncoló oldalra tudna irányítani?
A fáradozásért előre is köszönet!

Ezt a hozzászólást Cimpi módosította (2014.12.27 10:11 GMT+1 óra, ---)

   
Instalok - Tag | 619 hsz       Online status #205163   2014.10.23 13:51 GMT+1 óra  
Nyilván nem az a része érdekelt, hogy limitálnom kell, hiszen a más libekből elérhető mátrixok sem akadnak ki ezekre. Emlékeim szerint például a gluLookAt és a DirectX D3DXMatrixLookAtLH sem akad ki rá, és gyártani fog valami mátrixot.

Emellett az if a nyilvánvaló megoldás, csak hátha van valami szebb, azért kérdeztem.

   
ddbwo - Tag | 1654 hsz       Online status #205160   2014.10.23 11:48 GMT+1 óra  
Az egész orientációt transzformálni kell. Mindhárom vektort.
Vagy limit fel-le pl 89°.

Ha nincs meg a right, akkor a dir és up egyenes lesz, azaz "nem lehet kitalálni" merre volt jobbra.
---

Ha direktbe csak "target" van, akkor feltétel vizsgálat, a right 0 négyzethossz esetén utolsó right. Ehhez a rightot jegyezni kellene.

Ezt a hozzászólást ddbwo módosította (2014.10.23 12:29 GMT+1 óra, ---)
A Half-Life 2: Deathmatch promóció megszűnt! [B¤°
Kezdetben volék az üresség. Ám akkor a Struktúrfüggöny megteremté az Urat.
DrunkenDragon* Blackwolf
   
Instalok - Tag | 619 hsz       Online status #205159   2014.10.23 08:53 GMT+1 óra  
View mátrix számolásnál ugye adott a world up vektor, egy eye position és egy target position. Az utóbbi kettőből számolunk egy irányvektort, majd egy right vektort az up és az irányvektor segítségével. Szóval valami ilyesmi:
Kód:
dir = normalize(target - eye);
right = normalize(cross(up, dir));
up = cross(dir, right);

A problémám az, hogy, ha a dir pontosan a (0, -1, 0) az up pedig (0, 1, 0), akkor a cross product eredménye (0, 0, 0). Ez a normalizálásnál is, és az utána következő cross productnál is gondot okoz. Mivel szokták ezt szépen kiküszöbölni?

   
Asylum - Törzstag | 5513 hsz       Online status #204258   2014.07.26 18:13 GMT+1 óra  
Picit gondolkodtam és (az egyszerűség kedvéért egy négyszög + befglaló körre): optimális esetben

Kód:
<v1 - c, v1 - c> = r^2
<v2 - c, v2 - c> = r^2
<v3 - c, v3 - c> = r^2
<v4 - c, v4 - c> = r^2


4 ismeretlen van (cx, cy, cz, r), viszont ez nemlineáris egyenletrendszer, úgyhogy sima mátrix invertálással nem lehet megoldani. De ki lehet silabizálni belőle.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
Instalok - Tag | 619 hsz       Online status #204252   2014.07.26 15:36 GMT+1 óra  
Egy csonkagúlához (view frustum) tartozó minimális befoglaló gömböt keresem. Eddig a következő nem túl pontos algoritmust használtam:
Kód:
center := sum(frustum_points) / count(frustum_point);
radius := max(distance(center, frustum_points))

Ez azonban valószínűleg nem ad minimális eredményt, és léteznek ennél jobb megoldások is. Használtam picit a Google-t is, de nem szívesen olvasok "krix-kraxokat", amíg nem muszáj.

   
ddbwo - Tag | 1654 hsz       Online status #202838   2014.05.02 15:29 GMT+1 óra  
Ja hogy "tile-based_deferred_rendering".
Ha ezt egyből tudom, mindjárt mondtam volna is, hogy olyat nem csináltam.
Ha a Frostbite2 használja, gondolom jó az.
A Half-Life 2: Deathmatch promóció megszűnt! [B¤°
Kezdetben volék az üresség. Ám akkor a Struktúrfüggöny megteremté az Urat.
DrunkenDragon* Blackwolf
   
syam - Törzstag | 1491 hsz       Online status #202837   2014.05.02 12:22 GMT+1 óra  
M4:
Köszi
Az első felállás szerint a frustum csúcsait nem lehetett felhasználni azért voltam tanácstalan.
Éjjel viszont leesett , hogy "vazz, a csúcsokból számolom ki a síkokat"
Onnantól meg egyszerű: gömb - frustum vágás, ha ez igent mond, akkor ponthalmaz - sík vágás.

A teljes sztori itt:
http://sakura7.blog.hu/2014/05/02/tile-based_deferred_rendering
alias aalberik
   
syam - Törzstag | 1491 hsz       Online status #202834   2014.05.01 23:17 GMT+1 óra  
törölve

Ezt a hozzászólást syam módosította (2014.05.02 00:15 GMT+1 óra, ---)
alias aalberik
   
M4 - Tag | 187 hsz       Online status #202833   2014.05.01 22:32 GMT+1 óra  
Elsőre könnyebbnek tűnt, de aztán kitaláltam a megoldást. Remélem nincs benne hiba.
1. A félgömb a frustumban van. Ha a gömb közepe a frustumban van, akkor metszik egymást.
2. A frustum a félgömbben van. Ha a frustum valamelyik csúcsa a félgömbben van, metszik egymást.
3. A félgömb és a frustum határai metszik egymást. Kiválasztjuk a frustum egy oldalát. A (most még teljes) gömbbel metszetjük. Ekkor megtudjuk milyen messze van a gömb közepe az oldal síkjától, és hogy mekkora kört metsz (ha metsz). A metszőkör közepét és az átmérőjét vetítsük a gömböt vágó sík normáljára. Ha a vetített szakasz átmegy a vágósíkon a pozitív részbe, a metszőkörnek lesz olyan pontja, ami a félgömbön van. Most nézzük meg mi van, ha a metszőkör a síkon nem teljesen a frustum oldalát metszi. Metsszük az oldalt a körrel. Ekkor egy körívekből és szakaszokból álló "sokszöget" kapunk. Ha a körív legpozitívabb pontja (ha vetitjük a kört a vágósík normáljára a kapott szakasz legpozitívabb pontja) még a sokszög része, akkor azt vizsgáljuk metszi-e a félgömböt. Ha nem a sokszög része, akkor a sokszög egyik csúcsa lesz a legpozitívabb. Azokat vizsgájuk meg hogy a félgömbön van-e.
Ha ezt a műveletet elvégezzük az összes oldalra, megvagyunk. De nem kell mindet megnézni. Ha a gömb középpontja az egyik szemközti oldalpár síkja között van, akkor azokat az oldalakat nem kell megnézni, mert ha ott van metszéspont, akkor lesz másik oldalon is. Szóval maximum három oldallal kell metszetni.
Szerk: ja elfelejtettem, a félgömb körlapkáját is meg kell nézni, hogy metszi-e a frustum egy oldalát. (gondolkozom...) Lehet hogy ezt az esetet nem kell megvizsgálni.

Ezt a hozzászólást M4 módosította (2014.05.01 22:44 GMT+1 óra, ---)

   
Pretender - Törzstag | 2498 hsz       Online status #202831   2014.05.01 15:38 GMT+1 óra  
Idézet
syam :
A feladat frustum és spot light fénytere közötti érintkezés detektálása.
Az elérhető adatok pedig azok amiket felsoroltam.
Most már úgy látom, hogy a kúp-frustum metszés kivitelezhetőbb, mint a félgömb-frustum.


Egy kúp eleve nem ír le jobban egy spot lightot, mint egy félgömb? Ha nem kell túl nagy pontosság, akkor egy object-oriented boundingbox is szóba jöhet.

   
ddbwo - Tag | 1654 hsz       Online status #202830   2014.05.01 14:39 GMT+1 óra  
Arra egy cone-cone félét találtam ki. De az nem lesz neten. Legalábbis nem programozás szempontból írják, amit nem volt kedvem boncolgatni...

Másik megközelítés a közös objektum szemszögéből (ha lehetséges) frustum&&cone
illetve esetleg frustum&&frustum
A végeredmény hasonló.

A cone csak matematikailag írható körül, a síkkal vagdosás meg macerássá teszi az egészet.

(sík-szakasz,beesési szög, távolság arány) és az kivül vagy belül esik a frustumon...
A Half-Life 2: Deathmatch promóció megszűnt! [B¤°
Kezdetben volék az üresség. Ám akkor a Struktúrfüggöny megteremté az Urat.
DrunkenDragon* Blackwolf
   
syam - Törzstag | 1491 hsz       Online status #202829   2014.05.01 12:52 GMT+1 óra  
A feladat frustum és spot light fénytere közötti érintkezés detektálása.
Az elérhető adatok pedig azok amiket felsoroltam.
Most már úgy látom, hogy a kúp-frustum metszés kivitelezhetőbb, mint a félgömb-frustum.
alias aalberik
   
ddbwo - Tag | 1654 hsz       Online status #202826   2014.05.01 10:24 GMT+1 óra  
Mindenképpen félgömb kell?

Csak ha az első gömb teszt sikeres, egy dot ellenőrzés marad... Jaa. A Hesse normal form-ra vetített középponthoz mérten. A vége lemaradt.

Ezt a hozzászólást ddbwo módosította (2014.05.01 10:33 GMT+1 óra, ---)
A Half-Life 2: Deathmatch promóció megszűnt! [B¤°
Kezdetben volék az üresség. Ám akkor a Struktúrfüggöny megteremté az Urat.
DrunkenDragon* Blackwolf
   
syam - Törzstag | 1491 hsz       Online status #202822   2014.04.30 22:19 GMT+1 óra  
Foglalkozott már vki frustum - félgömb metszésével?
Mindkettő tetszőleges helyzetű lehet és csak a metszés megléte - nem léte érdekes.

A frustumnak síkjai adottak Hesse alakban. A félgömb a középpontjával, sugarával és egy normál vektorral van megadva.

Ezt a hozzászólást syam módosította (2014.04.30 22:33 GMT+1 óra, ---)
alias aalberik
   
Korábbi postok
> 1 < [2] [3] [4] [5] [6] [7] [8] [9] [10] [15] [20] [21]