openGL ongelma

Yritän tehdä pientä opengl "editoria" jolla vois piirrellä yksinkertaisia modelleja. No kuitenkin, teen windows apilla ikkunan ja haluaisin että noin 2/3 sen koosta olisi openGL:än käytössä, eli tuolle alueelle piirtyisi kuva, ja sitten lopussa 1/3 ikkunasta olisi normaaleja winApi controlleja yms. Mutta kuinka saan openGL:än käyttämän alueen rajattua silleen jotenkin?
Kenties tässä pitäis muuttaa jotain:

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;

/* get the device context (DC) */
*hDC = GetDC (hWnd);

/* set the pixel format for the DC */
ZeroMemory (&pfd, sizeof (pfd));
pfd.nSize = sizeof (pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ChoosePixelFormat (*hDC, &pfd);
SetPixelFormat (*hDC, iFormat, &pfd);

/* create and enable the render context (RC) */
*hRC = wglCreateContext( *hDC );
wglMakeCurrent( *hDC, *hRC );

}

Tuo on suoraan dev-c :n mukana tulleesta openGL esimerkistä kopioitu, koska käytän sitä pohjana ohjelmalleni..
1291
Äänestä

Muut lukivat myös

Vastaukset 1

Vanhimmat

Siitä on niin pitkä aika kun olen käyttänyt OpenGL suoraan että en enää muista miten se oikein meni. Jos ymmärsin oikein olit huolissasi kuvan rajoituksista. Jos avaat kuvan oman pane:niin (ikkunaan tms (CView, CWindow, CDialog..) sinun ei tarvitse välittää rajoituksista (turhaa niitä pikselejä tarkistaa kahteen kertaan).

Ellet tee jotain erittäin nopeaa tietokonepeliä niin OpenGL (tai DirectX) käyttö suoraan on aika työlästä. OpenGL:ille löytyy kirjastoja (esim. OpenInventor, myös nimellä Coin, yms) joka helpottaa ja nopeuttaa koodaamisen.

Jos teet 3-D editoria tarvitset ainakin kaksi ikkunaa (monesti käytetään kolme tarkkuuden takia, tai neljä jossa viimeisessä esitetään 3D-kappale vapaasti valittavasta kulmasta). Yhdessä ikkunassa pystyt ainoastaan esittämään kaksi koordinaattia (ulottuvuutta) esim x ja y. Jos haluat editoida kolmatta ulottuvuutta (syvyys, z-suunta) tarvitset toisen ikkunan. (nyt puhun tavallaan palturia, jos kierrät 3D-projektion 2D-ikkunassa niin toki yksi ikkuna riittää, tämä voi kuitenkin olla melko hidasta puuhaa).

Ongelma tulee kun editori pitäisi 2D-projektion avulla löytää vastaava piste 3D-avaruudesta. Varsinkin jos käytät pyöriä käyriä (NURBS, Non-Uniform Bezier Splines (käyriä) tai Non-Uniform Bezier Surfaces (pintoja)). Extrapolointi käyrän kontrollipisteisiin (siis 2-D ulottavuudessa) voi olla tuskastuttavan hidasta!

Yksi "poppaskonsti" on tämä: Älä välitä (alkuvaiheessa) tarkuudesta. Tee taulukko mihen etukäteen lasket sini- ja cosini-arvot asteen tms. tarkkuudella (kuvaputken resoluutio on niin pieni että tätä ei huomata. Operaatio x=taulukko[(int)aste]; on paljon nopeampi kuin x=cos(aste);

Sinä kysyit minulta jotain, nyt minä kysyn sinulta jotain: Miksi sinä teet tällaista? Raskasta matematiikkaa, tetrapakin esittämistä 3-D-muodossa ei tuo rahaa? 3-D-grafiikkaa on ainoastaan järkevä kun sitä tehdään tyhmille ihmisille (nuoriso= "peli", liikejohto="visualisointi"). Ihan kuin omat aivot eivät toimisi!

Työn iloa!

Äänestä

Kommentoi aloitusta


öööbälöö kirjoitti:

Yritän tehdä pientä opengl "editoria" jolla vois piirrellä yksinkertaisia modelleja. No kuitenkin, teen windows apilla ikkunan ja haluaisin että noin 2/3 sen koosta olisi openGL:än käytössä, eli tuolle alueelle piirtyisi kuva, ja sitten lopussa 1/3 ikkunasta olisi normaaleja winApi controlleja yms. Mutta kuinka saan openGL:än käyttämän alueen rajattua silleen jotenkin?
Kenties tässä pitäis muuttaa jotain:

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;

/* get the device context (DC) */
*hDC = GetDC (hWnd);

/* set the pixel format for the DC */
ZeroMemory (&pfd, sizeof (pfd));
pfd.nSize = sizeof (pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ChoosePixelFormat (*hDC, &pfd);
SetPixelFormat (*hDC, iFormat, &pfd);

/* create and enable the render context (RC) */
*hRC = wglCreateContext( *hDC );
wglMakeCurrent( *hDC, *hRC );

}

Tuo on suoraan dev-c :n mukana tulleesta openGL esimerkistä kopioitu, koska käytän sitä pohjana ohjelmalleni..

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu