Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: OpenGL ja koordinaatit

Sivun loppuun

crafn [06.07.2006 11:59:52]

#

Miten saisin muutettua kordinaatteja niin että vasemmassa-yläkulmassa x on 0 ja y on 0 ja oikeassa alakulmassa x on 800 ja y on 600. Eli miten saisin muutettua kordinaatistoa?

tgunner [06.07.2006 12:56:10]

#

Siis, meinaatko että vaihtaa resoluutiota 800*600-kokoiseksi?

crafn [06.07.2006 13:01:13]

#

En, Kun openGl:ssä on 0,0 ihan siinä ruudun keskellä ja -1,-1 on vasen alakulma jne... Niin haluaisin kordinaatiston samanlailla kun sdl:ssäkin.

remontti-reiska [06.07.2006 18:58:51]

#

http://www.mevis.de/opengl/glOrtho.html Tuolla saat ihan itse määritellä pisteen 0,0.

crafn [06.07.2006 19:33:09]

#

Jee!! Kiitos paljon remontti-reiska! :D

crafn [07.07.2006 16:05:58]

#

Mulla on toinenkin ongelma.. Olen sitä jo päivän yrittänyt ratkaista mutta en ole onnistunut. Ton koodin pitäisi piirtää viiva kohdasta x,y kohtaan ex,ey mut se piirtää sen viivan toisen pään aina vasempaan laitaan kiinni.

/***Pää-ohjelma***/
#include "initializings.h"

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

    if( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 )
    {
      fprintf(stderr, "SDL:n alustus ei onnistunut: %s", SDL_GetError());
      return 1;
    }

    //if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)==-1) {
    //  fprintf(stderr, "SDL_Mixer:n alustus ei onnistunut: %s", SDL_GetError());
    //  return 1;
    //}
    SDL_Surface * screen;
    screen = SDL_SetVideoMode(RESOLUTION_X, RESOLUTION_Y, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF|SDL_OPENGL);

    SDL_WM_SetCaption("AniMaker", NULL);

    SDL_ShowCursor(1);


    Mouse Mouse;
    Keyboard Keyboard;

    Ani Ani;
    Stick Ukko;

    //Sound SoundOne("Data\\Sounds\\Effects\\Sound02.wav", 1);

    //SoundOne.Volume(100);
    //SoundOne.Play(0);

    glOrtho(0,RESOLUTION_X, RESOLUTION_Y,0,-1,1);

    Ukko.Vektors[0].ey = 400;
    Ukko.Vektors[0].ex = 700;

    Ukko.Vektors[0].thickness = 10.0;


    while (1)
    {

        SDL_Event event;
        SDL_PollEvent(&event);

        Uint8* keyboard;
        Keyboard.Buttons=SDL_GetKeyState(NULL);

        Mouse.Buttons=SDL_GetMouseState(&Mouse.x, &Mouse.y);

        Ukko.Vektors[0].x = Mouse.x;
        Ukko.Vektors[0].y = Mouse.y;

        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(5.0f, 5.0f, 5.0f);

        glBegin(GL_POLYGON);
            glVertex2f(0,0);
            glVertex2f(RESOLUTION_X,0);
            glVertex2f(RESOLUTION_X, RESOLUTION_Y);
            glVertex2f(0,RESOLUTION_Y);
        glEnd();

        glColor3f(.0f, .0f, .0f);

        Ukko.DrawAll ();
        SDL_GL_SwapBuffers();

        if(Keyboard.Buttons[SDLK_ESCAPE])  break;
    }

    //Mix_CloseAudio();
    SDL_Quit();

    return 0;
}
/***pirrustushommelit***/
class Ani {

};
class Vektor {
    public:

    int type;
    double thickness;
    double x ,y;
    double angle;
    double length;
    double ex,ey;
};
class Stick{
      public:
      Vektor Vektors[];

      void DrawAll ();
      void DrawVektor (double thickness, double x, double y, double x2, double y2, int type);
      void DrawMovePoint (double x, double y, double type);
};

void Stick :: DrawVektor (double thickness, double x, double y, double x2, double y2, int type){

     if(type == 0 || type == 1){
         glLineWidth(thickness);

         glBegin(GL_LINES);

            glVertex2f(x, y);
            glVertex2f(x2,y2);

         glEnd();

         for (double i = 0; i<6.3; i+= 0.1){
             glBegin(GL_LINES);
                 glVertex2f(sin(i)*0+x, cos(i)*0+y);
                 glVertex2f(sin(i)*thickness/20+x, cos(i)*thickness/20+y);
             glEnd();
             glBegin(GL_LINES);
                 glVertex2f(sin(i)*0+x2, cos(i)*0+y2);
                 glVertex2f(sin(i)*thickness/20+x2, cos(i)*thickness/20+y2);
             glEnd();
         }


     }

}
void Stick :: DrawMovePoint(double x, double y, double type){
        if(type == 0) glColor3f(5.0f, 0.0f, 0.0f);
        if(type == 1) glColor3f(5.0f, 3.0f, 0.0f);

        for(double i=0; i<6.3; i+= 0.001){

             glBegin(GL_LINES);

                 glVertex2f(sin(i)*0+x, cos(i)*0+y);
                 glVertex2f(sin(i)*0.1+x, cos(i)*0.1+y);

             glEnd();

         }


}
void Stick :: DrawAll(){
     for (int i= 0; /*Vektors[i].x != NULL*/i<1; i++){

         DrawVektor(Vektors[i].thickness, Vektors[i].x, Vektors[i].y, Vektors[i].ex, Vektors[i].ey, 0);
         DrawMovePoint(Vektors[i].ex, Vektors[i].ey, 0);
     }

}

intializings.h sisältää hiiri - ja näppäintoiminnot ja se sisältää myös kaikki tarpeelliset kirjastot...

Metabolix [07.07.2006 16:26:48]

#

Jos jossakin on vikaa, niin tuossa pääsilmukassa. SDL_PollEvent-funktiota ei kuulu käyttää noin. Jos et aio niitä viestejä käsitellä, laita SDL_PumpEvents(), muussa tapauksessa laita SDL_PollEvent-funktio while-silmukkaan ja muuta pääsilmukkaa hieman:

SDL_Event e;
int silmukka = 1;
while (silmukka) {
	while (SDL_PollEvent(&event)) {
		if (e.type == SDL_QUIT) {
			silmukka = 0;
		}
	}
	// Muut pääsilmukan koodit
}

Näin sivumennen sanoen, koodisi on tavattoman rumaa kieleltään. Vektor >_<, mikä se on? Ja jätä rivien lopuista turhat välit pois tiedoston kokoa kasvattamasta.

crafn [07.07.2006 17:53:30]

#

Laitoin kuin käskit, mutta ei se auttanut olleskaan...

Metabolix [07.07.2006 17:58:33]

#

No kyllä tuo minulla toimi aivan odotetusti, veti viivan kohdasta (700, 400) hiiren osoittimeen.

Niin juu, kannattaa niille "vektoreille" varata tilaa.

Vektor Vektors[];

Tuo ei ole oikein hyvä, laita sinne jokin luku väliin, vaikkapa yksi.

crafn [07.07.2006 21:02:13]

#

Outoa... Minulla tulee nyt vain musta ikkuna hetkeksi ja ohjelma sammuu parin sekunnin kuluttua... Mitähän mä oon taas möhliny...´

Edit: Blaze: Umh.. Tää ei oo tekstitilaohjelma :D

Blaze [07.07.2006 21:26:17]

#

http://pp.kpnet.fi/blaze/codefaq/#justflashes

Edit: Hups... Tämän siitä saa kun irkkaa ja selaa tätä yhtäaikaa... ^_^;;
Ootko varmistanu, että se tosiaan sammuu, ettei kaadu (esim. puskuriylivuotoon)?

crafn [07.07.2006 22:11:28]

#

Mistäs se tarkistetaan? :D
Mut on se aika outoa jos koodi toimii Metabolixilla oikein mut mul ei toimi...

Blaze [07.07.2006 22:14:54]

#

Katsot, mitä se pukkaa stderriin. Windowsilla tuo stderr kai ohjautuu stderr.txt-nimiseen tiedostoon ohjelman hakemistossa.
Se "SDL parachute deployed" sitten meinaa, että se kaatu. Silloin debuggeri esille ja seuraamaan, missä kohdin näin käy.

Metabolix [07.07.2006 22:27:58]

#

Toinen asia olisi se, että ei kannata määritellä muuttujia ja tyyppejä samoilla nimillä. Mouse Mouse, ei näin.

Laitoithan nyt vektoreille lukumäärän?

crafn [07.07.2006 22:35:12]

#

Haha... Nyt toimii... Debuggailin ja rivi joka laitto sen kaatumaan on:

 if (Keyboard.Buttons[SDLK_ESCAPE]) break;

Sitte poistin ton rivin ja se toimi, sit sähläsin ton PollEvent homman kaa nii sain toimii ton virhe-rivin :D


Sivun alkuun

Vastaus

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

Tietoa sivustosta