|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
^suny^
Joined: 30 Nov 2007 Posts: 57
|
Posted: Wed Dec 30, 2009 9:17 pm Post subject: glfw + gl + classes |
|
Te tāda lieta, es sāku dalīt programmu pa klasēm (urāā), agrāk nebiju to sapratis, bet tagad itkā jau saprotu. Tāpēc mēgināju uzrakstīt prastu OpenGL programmu ar GLFW kura lietotu manis izveidoto klasi. Tik tālu, tik labi, bet kad mēginu rotēt zīmējumu tad tas kvadrāts bezgalīgi mirgo .
1. Vai vispār ir labi taisīt to, kā es to izdarīju ?
2. Un vai glfw ir līdzīga funkcija kā glutReshapeFunc(vai kaut kā tā), lai norādīt kurā gadījumā vinjam jādara renderer->Resize(); , ja nē kā to var izdarīt?
Code: |
//Render.h//
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glfw.h>
class render{
public:
render();
virtual ~render();
void Initialize(GLvoid);
GLvoid Resize(GLsizei width, GLsizei height);
void Draw(GLvoid);
};
|
Code: |
//Render.cpp//
#include "Render.h"
#pragma warning(disable:4305)
render::render()
{
}
render::~render()
{
}
void render::Draw(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUADS);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-1.0, -1.0, 0.0);
glVertex3f(1.0, -1.0, 0.0);
glVertex3f(1.0, 1.0, 0.0);
glVertex3f(-1.0, 1.0, 0.0);
glEnd();
}
void render::Initialize(GLvoid)
{
if (glfwInit() != GL_TRUE)
glfwTerminate();
if (glfwOpenWindow(800, 600, 5, 6, 5, 0, 0, 0, GLFW_WINDOW) != GL_TRUE)
glfwTerminate();
glfwSetWindowTitle("Test");
glfwEnable( GLFW_STICKY_KEYS );
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
glClearDepth( 1.0f );
glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LEQUAL );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
glScalef(0.5, 0.5, 1.0);
}
GLvoid render::Resize(GLsizei width, GLsizei height)
{
if (height < 1) height = 1;
glfwGetWindowSize( &width, &height );
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(52.0f, 1.3f, 1.0f, 1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
|
Code: |
//Main.cpp//
#include "Render.h"
render *renderer;
void Main_Loop();
int main()
{
renderer = new render();
renderer->Initialize();
Main_Loop();
}
void Main_Loop()
{
while(bool isActive = true)
{
if (glfwGetKey(GLFW_KEY_ESC) == GLFW_PRESS)
{
glfwTerminate();
isActive = false;
break;
}
glfwSwapBuffers();
renderer->Draw();
}
}
|
_________________
|
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Wed Dec 30, 2009 10:10 pm Post subject: |
|
Quote: | bet tagad itkā jau saprotu |
Tad pasaki, kāda jēga šeit kaut ko klasēs dalīt? Ne tev klasēs stāv dati, ne klasēm ir īpašs no tipa atkarīgs uzdevums (piemēram mantota klase, kura lietotu citu API)... Un kāda vispār jēga dinamiskajā atmiņā taisīt klasi, kura nekādus mainīgos nesatur?
Šeit var lietot vienkāršas funkcijas (Initialize, Resize, Draw) un būs pat labāk. Tāpēc uz pirmo jautājumu atbilde ir - <nē>.
Un 2. - glfw'am dokumentācija klāt nebija?
Un tev ar to kvadrātu ir problēmas vai nav? _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
^suny^
Joined: 30 Nov 2007 Posts: 57
|
Posted: Wed Dec 30, 2009 10:18 pm Post subject: |
|
Problēma ir tikai 1 kad es izsaucu glRotatef tad vinsh mirgo, tūlīt pārtaisīshu visu, tad pierakstīšu. Pasaki tikai, lūdzu kuros gadījumos noteikti ir ļoti izdevīgi veidot savu klasi? Piem, vektori, nē ? _________________
|
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Wed Dec 30, 2009 10:32 pm Post subject: |
|
Gan jau tāpēc mirgo, ka rotē pārāk ātri un ap nepareizo asi vai arī tu strādā ar nepareizo matricu. Par maz informācijas, tāpēc tikai minējumi..
Un par klašu lietošanu labāk konsultējies ar kādu no C++ lietošanas grāmatām. Es to visu paturēt galvā nevaru (vismaz ne viegli pieejamā veidā)... _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
^suny^
Joined: 30 Nov 2007 Posts: 57
|
Posted: Wed Dec 30, 2009 10:58 pm Post subject: |
|
Jā pieliku glLoadIdentity() tagad rotē, bet ne tā ka vajag.
Šādam iznākuman nav jābūt ... : ( Pietam vēl glTranslatef arī gļuko
http://yy.lv/download.php?f=95177 _________________
|
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Wed Dec 30, 2009 11:41 pm Post subject: |
|
Tu nenorādīji asi, ap kuru griezt to trijstūri. Ap nulles vektoru neko neapgriezīsi. http://www.opengl.org/sdk/docs/man/xhtml/glRotate.xml _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
^suny^
Joined: 30 Nov 2007 Posts: 57
|
Posted: Wed Dec 30, 2009 11:51 pm Post subject: |
|
Uj, aizmirsu pielikt, bet vienalga programma jauc x ar y.
ja rakstīt glRotatef(180.0f, 1.0f, 0.0f, 0.0f); tad trijstūris būs tāds
\-------/
-\-----/
--\---/
--..V
Apgāzts otrādi pa Y asi nevis X. _________________
|
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Wed Dec 30, 2009 11:56 pm Post subject: |
|
Programma neko nejauc. Tu pats tai iedevi modelview / projection matricas. Pēc tām tad arī nosaka, kas ir kurā pusē uz ekrāna. _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Thu Dec 31, 2009 11:22 am Post subject: |
|
suny: kā jau šņaks stāsta - no klasēm nav jēgas, ja tu neizmanto to iespējas - enkapsulēt datus (klašu memberus), vai to īpašības (piemēram, automātisku konstruktora/destruktora izsaukšanu).
Savā klasē sistēmā tev ir pilnīgi bezjēdzīga Initialize funkcija. Klasēm inicializāciju veid konstruktors, kas tiek automātiski izsaukts. Tb - tev nav jāuztraucās vai pats aizmirsīsi vai nē izsaukt to. Kompilators pats izsauks, līdzko instancēsi klases objektu.
Tas pats ar destruktoru - tajā vajag ielikt glfwTerminate() funkciju, kas izsauksies automātiski līdzko objekts tiks dzēsts. Nebūs pašam par to jāraizējas.
Par objekta dzēšanu - tu main funkcijā izveido klases instanci (renderer) dinamiskajā atmiņā, taču neatbrīvo to (ar delete). Vai nu dari to, vai arī vienkārši neizmanto dinamisko atmiņu. render klase nav tik milzīga, lai neielīstu stekā:
Code: | int main()
{
render r;
Main_Loop();
} |
Un vēl - Main_Loop pataisi labāk par render klases metodi. Citādi no tā tava OOP paliek maz jēgas, tad jau tiešam labāk lieto vienkārši globālas funkcijas neimspeisā.
Pēc glfwTerminate izsaukšas nav vēlams izsaukt citas glfw funkcijas. Tās novedīs pie sliktas programmas darbības (labākajā gadījumā - tās kraša). Tu to dari, ja glfwOpenWindow atgriež GL_FALSE, taču no programmas neizej - tu turpini parastu tās darbību.
Kura tavuprāt tev ir X un kura Y ass? Vai tu esi apskatījis kāda ir defaultā OpenGL koordināšu sistēma? Pats tu nejauc tās? Kā tu gribi dabūt to trijstūri vispār? |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|