Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: OpenGL perspektiivi

crafn [19.10.2005 21:02:42]

#

Nyt olisi tämmönen ongelma:
Elikkäs... Ku on tämmönen glFrustum funktio joka laittaa perspektiivin paikoilleen (siis tekee kauempana olevan objektin pienemmäks ku edessä olevan ja muuta semmosta jännää...)
Niin mikä tässä mun koodissa oikein mättää kun taaempana oleva neliö on yhtä suuri kun edessä oleva? :)

 #include "SDL/SDL.h"
#include "gl/gl.h"

int main(int argc, char *argv[]) {


    if( SDL_Init(SDL_INIT_VIDEO)<0)
    {
        fprintf(stderr, "OHO! Sdl:n alustus meni pieleen: %s\n", SDL_GetError());
        return 0;
    }
    SDL_Surface * screen;

    screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_OPENGL|SDL_DOUBLEBUF);

    int mx, my, mouse;
    float v1 = 0.0;

    while (1)
    {
    SDL_Event tapahtuma;
    SDL_PollEvent(&tapahtuma);

    mouse=SDL_GetMouseState(&mx, &my);

    Uint8* keyboard;
    keyboard=SDL_GetKeyState(NULL);

    glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
    glClear (GL_COLOR_BUFFER_BIT);

    glMatrixMode (GL_PROJECTION);

    glPushMatrix ();

    glFrustum (-1.0, 1.0, 1.0, -1.0, 0.0, 1.0);

    glRotatef (v1, 1.0, 1.0, 1.0);

    glBegin (GL_LINE_LOOP);

    glVertex4f (0.5, 0.1, 0.0, 1.0);
    glVertex4f (0.5, -0.1, 0.0, 1.0);
    glVertex4f (-0.1, -0.1, 0.0, 1.0);
    glVertex4f (-0.1, 0.1, 0.0, 1.0);

    glEnd ();

    glBegin (GL_LINE_LOOP);

    glVertex4f (0.5, 0.1, 0.1, 1.0);
    glVertex4f (0.5, -0.1, 0.1, 1.0);
    glVertex4f (-0.1, -0.1, 0.1, 1.0);
    glVertex4f (-0.1, 0.1, 0.1, 1.0);

    glEnd ();

    glPopMatrix ();

    glFlush();

    SDL_GL_SwapBuffers();

    if(keyboard[SDLK_d])v1 += 1.0;
    if(keyboard[SDLK_a])v1 -= 1.0;

    if(keyboard[SDLK_ESCAPE])  break;

    SDL_Delay(1);
    }
    SDL_Quit();
    return 0;
}

Metabolix [19.10.2005 21:33:34]

#

Varmaankin siksi, että annat glFrustumille sellaiset arvot, joilla tulee sellainen perspektiivi. Kannattaisi lukea jostakin sen oikea käyttö. 0.1:n ero Z-koordinaateissa ei muuten tee juurikaan eroa. Ja kannattaisi laittaa pieni glTranslatef, Z jonnekin -2.0:n paikkeille ainakin. Ihan turhaan myös laitat glFrustumin joka kierroksella uudestaan, yksi kerta riittää.

Tällaista koodia minä käytän:

GLfloat FoVY = 45.0f; // Näkökentän laajuus asteina Y-suunnassa
GLfloat Aspect = 4.0f / 3.0f; // Ruudun kuvasuhde (x / y)
GLfloat Near = 0.1f, Far = 16.0f; // Rajaukset; miten kaukaiset kohteet piirretään

// Nämä lasketaan perspektiivifunktiossa:
GLfloat FoVX; // Näkökentän laajuus asteina X-suunnassa
GLfloat FoVRight; // Viimeinen näkyvä X, kun Z = -1.0f
GLfloat FoVTop; // Viimeinen näkyvä Y, kun Z = -1.0f

// Vakio
#define Pii ((float)3.1415926535f)

void SetPerspective()
{
    GLfloat xmin, xmax, ymin, ymax;

    ymax = Near * tan(FoVY * Pii / 360.0f);
    ymin = -ymax;

    xmin = ymin * Aspect;
    xmax = ymax * Aspect;

    FoVX = atan(tan(FoVY * Pii / 360.0f) * Aspect) * 360.0f / Pii;
    FoVTop = tan(FoVY / 2.0f);
    FoVRight = Aspect * FoVTop;

    glFrustum( xmin, xmax, ymin, ymax, Near, Far );
}

glVertex4f on muuten minusta aika turha. glVertex3f riittää aivan hyvin.

Otsikkotiedostojen nimet <hakasiin> eikä "lainausmerkkeihin", kun on kyse yleisistä otsikoista.

crafn [19.10.2005 21:52:48]

#

Kiitos, oi kiitos... :D
Edit: Hmm... nuo tan atan hommat ei toiminu nii koklasin poistaa ne niin toimi mut en oo varma toimiko oikein... :D

crafn [23.10.2005 18:05:09]

#

Joo ja viel semmonen juttu et miten opengl:llä ladataan kuva, ja piirretään se?
Olen NeHen oppaita vähän selaillu mut en oo saanu toimii...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta