Opengl gömb árnyéka
2015-12-01T21:39:13+01:00
2015-12-08T13:30:29+01:00
2022-08-18T10:30:46+02:00
openglbrr
Sziasztok!
Teljesen kezdő vagyok OpenGL, C++ és úgy általában programozás terén. Van egy feladatom, amiben két gömbnek kell árnyákot vetnie a talajra, pontszerű fényforrás esetén, ráadásul a gömbök sugara változtatható kell, hogy legyen.
Eddig megrajzoltam a két gömböt, változtatni is tudom a méretüket, a talaj és a fényforrás is megvan, de nem tudom, hogyan vethetnének árnyékot a gömbök? Ebben kérem a segítségeteket.

static float lightposX = -3.0f, lightposY = 2.0f, lightposZ = 1.0f;
static double gombmeret1 = 0.1f;
static double gombmeret2 = 0.1f;//Gömbméret változók
static float lightR = 1.3f, lightG = 1.5f, lightB = 1.3f;
static float groundW = 18.0f, groundH = -2.0f;

A sík quadokkal lett megrajzolva

void drawLightsource() {
    GLfloat lightColor[] = { lightR, lightG, lightB, 1.5f };
    GLfloat lightpos[] = { lightposX, lightposY, lightposZ, 0.0 };
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
    glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
    glTranslatef(lightposX, lightposY, lightposZ);
}

void display() {
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(1.0f, 0.0f, -7.0f);

    glColorMaterial(GL_FRONT, GL_DIFFUSE);
    glEnable(GL_COLOR_MATERIAL);
    //gömb
    glColor3d(1.0, 0.0, 0.0);
    glPushMatrix();
    glTranslatef(0.1, 0.0, 0.5);
    glutSolidSphere(gombmeret1, 50, 50);
    glPopMatrix();

    glColor3d(0.0, 1.0, 0.0);
    glPushMatrix();
    glTranslatef(-0.7, -1.0, 0.1);
    glutSolidSphere(gombmeret2, 50, 50);
    glPopMatrix();
    
    drawGround();
 
    drawLightsource();

    glutSwapBuffers();
}

A két gömb méretét billentyűk lenyomásával lehet állítani oda-vissza.


És itt jönne az árnyék...
Mutasd a teljes hozzászólást!

  • Alapvetoen 2 fele shadow van: a depth texturas es a sziluettes/stenciles.

    Mivel csak a talajra kell arnyek ezert itt megegyszerubbet kene csinalni: A 2 gomb altal kitakart torz-kor vetuletet kellene csak oda-blendelni eppen csak egy kicsivel feljebb a talaj sikjara. Stencillel azt is ki lehetne kuszobolni, hogy a 2 arnyek egymast sotetitse...

    Ki kell szamolni egy erintot, ami a fenytol a gomb-ig megy ez azt megforgatni a feny-gombkozeppont tengely korul. Ezt vegul vetiteni a talajra es abbol lenne az a torz korlap (gl_triangle_fan).

    (Esetleg még fragment-shaderrel bele raytrace-elni a talajra a 2 gomb arnyekat, az is egy megoldas lehet. Akkor csak shadert kell irni, de nem kell blend meg stencil)
    Mutasd a teljes hozzászólást!
  • Ha egy koordinátarendszerben adott egy gömb középpontja, sugara, a fényforrás pontja, valamint a sík egyenlete, akkor zárt formában felírható a síkra vetett árnyák képlete, ami nem meglepő módon, egy ellipszist ír le. Tehát elég kiszámolni az árnyék ellipszis egyenletét és rajzolni egy kellően finom háromszögfelbontású ellipszist a síkra. Minden gömbhöz egyet.
    Mutasd a teljes hozzászólást!
  • Valójában tetszőleges formájú testnek egyszerűen lehet adott síkra vetített árnyékot rajzolni, csak ki kell számolni azt a transzformációt (mátrixot), ami a testet az eredeti pozíciójából a síkra vetíti (ennek a mátrixnak a rangja 3, azaz a determinánsa 0, mivel 3D testet 2D-be transzformál). Ekkor elég a testet kétszer kirajzolni: először normál módon, másodszor pedig a kiszámolt mátrixot is alkalmazva (glMultMatrix)
    Mutasd a teljes hozzászólást!
  • Ha csak egy síkra akarsz árnyékot, és ráadásul a beépített primitíveket akarod használni (amikor nem nagyon foglalkozol a vertexekkel, tehát a stencilezés kiesik, az árnyéktextúra készítése meg kicsit még odébb van komplexitásban) a legegyszerűbb készíteni egy transzformációt, ami arra a síkra vetít. Ekkor két menetben rajzolod ki a jelenetet: először a gömböket a jelenlegi transzformációkkal, utána pedig a gömböket feketén a jelenlegi transzformációk elé beszúrt vetítéssel.
    A vetítés nem teljesen triviális de itt egy egész emészthető példa: Shadow
    Ha a síkod nagyon egyszerű (mondjuk egy Y=konstans, XZ-síkkal párhuzamos darab), akkor a kifejezések is azok lesznek.
    Mutasd a teljes hozzászólást!
  • Tudom, hogy nem a témához tartozó csak kikapcsolódásként, érdekességként egy CSS-GÖMB...
    Mutasd a teljes hozzászólást!
  • (Pont az lenne meglepo, ha ellipszist kapnal. Azt az 1 esetet kiveve, ha pont fentrol lenne megvilagitva: akkor az ellipszis specialis esete: egy kor lenne az eredmeny ;)

    Amugy a legkonnyebb megoldas szempontjabol rad szavazok :D beletranszformalni a mesht a padloba 
    Mutasd a teljes hozzászólást!
  • Azt kell csak látni, hogy pontszerű fényforrásból megvilágított gömb árnyéka a térben egy csonka kúp. Ezt pedig egy síkkal elmetszve általában ellipszist kapsz. (Sőt, ha rossz napod van, akkor parabolát vagy hiperbolát. Lásd kúpszeletek, középiskola.) Az ellipszis, ha úgy vesszük, egy "eltorzult", (projektív) transzformált kör.
    Mutasd a teljes hozzászólást!
  • A csatolt képen is megfigyelhető egy ellipszis. Mivel csak villanykörte, ezért nem tökéletes, de a lényeg látszik. Vegyük még észre, hogy a négyzetrács is projektíven torzul, de még így is ellipszist kapunk.
    Mutasd a teljes hozzászólást!
  • Basszus es tenyleg: Ábrázoló geometriát tanítok: 4. hét - Henger és kúp metszése
    A hengernel ok, hogy ellipszis, de a kupnal valami bonyolultabbra gondoltam (marmint a hiper/parabola eseteket nem szamitva).

    Szoval megegyszerubb lett a feladat: 2 ellipszist kell blendelni es csokolom.
    Es hogy ne legyen atfedes 2 arnyek kozott, az egyiket megtavolabb kell kirajzolni a faltol es depth iras mellett azzal kezdeni a rajzolast.
    Mutasd a teljes hozzászólást!
  • Androidra nem tesztelődött a fájlcsatolás?  Sebaj, itt megtekinthető.
    Mutasd a teljes hozzászólást!
  • Hát nem belefutottam en is egy ilyenbe! :S

    2 ugyanakkora gömb van osszekotve egy hengerrel.
    Ennek kell a sík-vetulete egy 3D teglalap formajaban, ugy hogy a henger palastjanak konturjai es a teglalap 2 oldala az origobol nezve pont egybeessen es a 2 zárófélgömb is teljesen beleferjen a teglalapba.

    2D kor-erinto szamitasra visszavezetheto es az meg +-*, 1/x, sqrt-bol kijon.
    Mutasd a teljes hozzászólást!
  • Igaz, hogy js, de talán ez segíthet:

    threejs shadowmap viewer example

    a példák között van még egy pár ami  az árnyékokkal foglalkozik.
    Mutasd a teljes hozzászólást!
  • Megpróbáltam általános képleteket adni a
    tetsz. pontszerű fényforrás  /  tetsz. gömb  /  tetsz. sík
    feladatra, de a körülményes leírás helyett inkább egy kipróbálható c++ kóddal mutatom meg az eredményt (bár első ránézésre ez sem néz ki egyszerűbben).

    Az alakzatok megadása után, a síkon keletkező árnyéktartomány határvonalának akárhány pontját, (a pontok koordinátáit) számolja ki.
    Próbáld ki a programot, ha az eredmények elfogadhatók, akkor megnézzük, hogy a számítási módot hogyan lehetne beépíteni a programodba.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd