[ ml01172 @ 04.02.2005. 19:58 ] @
Ovo je zasigurno pitanje na osnovnom nivou u programiranju sa bibliotekom
OpenGL. Neke stvari mi nisu jasne te bih volio da pogledate primjere koda
koje ovde stavljam ne biste li bolje shvatili šta me zanima. Daću vam dva
primjera koji mi prave konfuziju, propraćena slikom koja je rezultat toga
koda. Programi su pisani uz biblioteku glut.h, te dosta koda ne morate ni
da gledate jer je standardan:

// linija.c
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdio.h>

void reshape( int w, int h )
{
glViewport( 0, 0, w, h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 30.0, w/h, 0.0, 10.0 );
glMatrixMode( GL_MODELVIEW );
}

void display()
{
glClear( GL_COLOR_BUFFER_BIT );
glLoadIdentity();
gluLookAt (
0.0, 0.0, 4.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0
);
glBegin( GL_LINES );
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f( 0.0, 0.0, 5.0 );
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f( 0.0, 0.0, -5.0 );
glEnd();
glutSwapBuffers();
}

void init()
{
glClearColor( 0.0, 0.0, 0.0, 0.0 );
}

int main( int argc, char ** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowSize( 400, 400 );
glutCreateWindow( argv[0] );
init();
glutDisplayFunc( display );
glutReshapeFunc( reshape );
glutMainLoop();
return 0;
}

Kao što se vidi, linija izvire iz donjeg lijevog ugla ekrana iako bi tre-
bala, po nekom mom viđenju, da bude u obliku tačke jer mi gledamo "kroz"
nju. Šta je u pitanju? Postavio sam glLooadAt da gledam iz tačke (0,0,4)
ka tački (0,0,0), dakle niz z-osu, a linija se pruža od tačke (0,0,5) do
(0,0,-5) dakle takođe niz z-osu. Po svakom pravilu ova linija se treba
vidjeti kao jedna tačka. Zanima me zašto imam ovakav rezultat, i kako bih
postigao ono što sam ja mislio da je rezultat (da se vidi kao jedna tačka)?

// kvadrati.c
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdio.h>

void reshape( int w, int h )
{
glViewport( 0, 0, w, h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 30.0, (GLdouble)w/(GLdouble)h, 0.0, 10.0 );
glMatrixMode( GL_MODELVIEW );
}

void display()
{
GLfloat tjemena1[] = {
-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
0.5, 0.5, 0.0,
-0.5, 0.5, 0.0
};

GLfloat tjemena2[] = {
-0.3, -0.3, -0.8,
0.8, -0.3, -0.8,
0.8, 0.8, -0.8,
-0.3, 0.8, -0.8
};

glClear( GL_COLOR_BUFFER_BIT );
glLoadIdentity();
gluLookAt (
0.0, 0.0, 3.0, /* gledam iz (0 i 0) */
0.0, 0.0, 0.0, /* gledam u tacku (0 0 0) */
0.0, 1.0, 0.0
);
glEnableClientState( GL_VERTEX_ARRAY );

// Crveni je na z-koordinati: 0
glColor3f( 1, 0.0, 0.0 );
glVertexPointer( 3, GL_FLOAT, 0, tjemena1 );
glDrawArrays( GL_QUADS, 0, 4 );

// Zeleni je na z-koordinati: -0.8
glColor3f( 0.0, 1.0, 0.0 );
glVertexPointer( 3, GL_FLOAT, 0, tjemena2 );
glDrawArrays( GL_QUADS, 0, 4 );

glutSwapBuffers();
}

void init()
{
glClearColor( 0.0, 0.0, 0.0, 0.0 );
}

int main( int argc, char ** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowSize( 400, 400 );
glutCreateWindow( argv[0] );
init();
glutDisplayFunc( display );
glutReshapeFunc( reshape );
glutMainLoop();
return 0;
}

Ovde je nešto teži kod, pošto sam serijalizovao tjemena, ne htijući da ih
svako posebno zadajem preko vertex3f nego preko drawArrays(). Ali nadam
se da vam to neće biti potrebno. Poenta je to što sam crveni kvadrat nacr-
tao prvi, a zatim zeleni iza njega. Pošto sam zadao gluPerspective(), ze-
leni kvadrat je naravno manji od crvenog na ekranu, jer se nalazi dalje od
posmatrača. Međutim, ono što mi pravi zbrku je što se zeleni kvadrat vidi
preko crvenog! Kako je to moguće? Zar OpenGL ne vodi računa o tome nevezano
koji je objekat prvi nacrtan a koji drugi? Molim da mi neko ovo razjasni!
Kvadrati su iste orijentacije, tako da posmatrač vidi prednje strane svakog
od njih, te nije u pitanju ništa od PolygonMode i CullFace...

Hvala vam unaprijed!!!
[ ml01172 @ 05.02.2005. 09:54 ] @
Dobro, ovaj drugi problem sam skont'o - bio je u pitanju depth buffering.
Ovaj prvi problem se izgleda pojavljuje kada se za near duzinu stavi 0... tada se, kako se meni cini, pojavljuju neocekivani rezultati.

Ali dobro je, bitno je da ste se vi potrudili ;)
Uzas!
[ bkaradzic @ 05.02.2005. 15:31 ] @
Citat:
ml01172: Ali dobro je, bitno je da ste se vi potrudili ;)
Uzas!

Bezobrazni n00b! :) Najgora kombinacija...

Inače oba problema su trivijalna. Kao što si i otkrio sa zbufferom... Da si proveo vreme menjajući gluLookAt vrednosti umesto što si pisao dugačak post i skidao screen shotove, verovatno bi sam provalio o čemu se radi.

Branimir
[ yooyo @ 07.02.2005. 14:46 ] @
1. Prouci malo matematiku koja stoji iza gluPerspectiva poziva... Near parametar MORA biti veci od 0.0!!!
2. Poslao si post 4.2.2005 u 20.58h, a proverio si 5.2.2005 u 10.54h. Nije proslo ni 24h a vec se zalis!? U kom si fazonu?

yooyo
[ ml01172 @ 08.02.2005. 16:06 ] @
U pravu ste, očekivao sam previše brze odgovore. Problem je u tome što sam primijetio da je svega tri čovjeka pogledalo moju temu za tih 14 sati, a elitesecurity je jedan od najvećih foruma za programiranje kod nas. Zato sam bio iznenađen, jer ljudi se uvijek brže aktiviraju za neku temu na usenet-u gdje je potrebno 3 do 9 sati da se tema uopšte pojavi.
Premda, može se primijetiti i to da je gospodin Jugoslav Stojanov napisao odgovor tek tri dana kasnije, i to samo da bi kudio moju bezobzirnost.

Ukoliko gledam geometrijski, sasvim je logično i da near vrijednost bude jednaka nuli. Naime, ja želim da moj vidni opseg bude sve što se nalazi ispred mene, bez izuzimanja onoga što se nalazi "baš" ispred mene. Dakle, zarubljena piramida bi bila ograničena odozdo svojom bazom (far), a odozgo svojim vrhom koji predstavlja viewpoint (time naravno više ne bi bila prava zarubljena piramida, nego specijalan slučaj zarubljene piramide, npr. trivijalna zarubljena piramida). Zašto bi onda moralo near da bude veće od nule? Ali u pravu si, near mora biti veće od nule, to sam kasnije saznao, ali nisi u pravu da je to logično.
[ bkaradzic @ 08.02.2005. 18:23 ] @
Citat:
ml01172: Ali u pravu si, near mora biti veće od nule, to sam kasnije saznao, ali nisi u pravu da je to logično.

Da si pročitao neku knjigu o kompjuterskoj grafici bilo bi ti logično... I razlomci nisu logični onima koji ne razumeju ni sabiranje...

http://msdn.microsoft.com/libr...en-us/opengl/glfunc02_0oj1.asp
Citat:
Depth-buffer precision is affected by the values specified for znear and zfar. The greater the ratio of zfar to znear is, the less effective the depth buffer will be at distinguishing between surfaces that are near each other. If

r = far/near

roughly log (2) r bits of depth buffer precision are lost. Because r approaches infinity as znear approaches zero, you should never set znear to zero.

Takođe pogledaj ostatak matrice i videćeš da će većina vrednosti po dijagonali biti 0 i 1 ako je i near 0.

Što se tiče odgovaranja na pitanja koja postavljaš to je slobodni izbor onoga ko na to pitanje odgovara. Niko ti nije odgovorio jer postavljaš trivijalna pitanja na koja možeš da nađeš odgovor u OpenGL dokumentaciji...

I nemoj da teoretišeš šta je tebi logično nego RTFM!

Branimir
[ yooyo @ 08.02.2005. 18:28 ] @
Ako imas MSDN potrazi opis gluPerspective i pogledaj sta pise:
Citat:

gluPerspective
The gluPerspective function sets up a perspective projection matrix.

void gluPerspective(
GLdouble fovy,
GLdouble aspect,
GLdouble zNear,
GLdouble zFar
);
Parameters
fovy - The field of view angle, in degrees, in the y-direction.
aspect - The aspect ratio that determines the field of view in the x-direction. The aspect ratio is the ratio of x (width) to y (height).
zNear - The distance from the viewer to the near clipping plane (always positive).
zFar - The distance from the viewer to the far clipping plane (always positive).


yooyo
[ ml01172 @ 09.02.2005. 18:20 ] @
Hvala na korisnim informacijama! Nemam MSDN, nego učim iz nekog vodiča za
OpenGL. Nije toliko detaljan koliko dokumentacija koju ste vi naveli, pa
nisam znao matematičku osnovu funkcije gluPerspective(). Sada znam, zah-
valjujući vama.

Problem je u tome što ja nisam ni znao da rješenje leži u
popravci argumenata koje prosljeđujem funkciji gluPerspective(), te bi mi
bilo jako teško naći odgovor čak i da sam imao MSDN. Uvijek je lako naći
problem kada se već locira. To što je pitanje bilo trivijalno ne znači da
ne treba na njega odgovarati, jer uvijek je početnicima u nekoj oblasti teže
nego onima koji su već uveliko ušli u materiju. Vi se, međutim, ponašate nadmeno
i predstavljate upravo ljude zbog kakvih se meni ovaj elitesecurity isprva nije
dopao jer se čini da vas ima mnogo. Ubijeđen sam da opet dugo neću pokušavati
naći odgovor na svoje probleme ovde, jer uglavnom sam riješim isti prije nego
što od vas dobijem rješenje, ili je to rješenje propraćeno ismijavanjem kao
što je bilo ovo. Vidim da se dobro razumijete u grafiku i programiranje uopšte,
ali s obzirom da ste stariji korisnici ovog foruma, očekivalo bi se
da znate za malo više forumske tolerancije.

Pozdrav!
[ bkaradzic @ 09.02.2005. 18:51 ] @
Citat:
ml01172: Vi se, međutim, ponašate nadmeno i predstavljate upravo ljude zbog kakvih se meni ovaj elitesecurity isprva nije dopao jer se čini da vas ima mnogo.

Pošalješ prvi post 04.02.2005. u 12:58, a onda par sati kasnije 05.02.2005. u 02:54:
Citat:
ml01172: Ali dobro je, bitno je da ste se vi potrudili ;)
Uzas!

O kakvoj ti forumskoj toleranciji pričaš?

Branimir
[ bkaradzic @ 09.02.2005. 18:56 ] @
Citat:
ml01172: Nemam MSDN, nego učim iz nekog vodiča za OpenGL.

Imaš MSDN:
http://msdn.microsoft.com/

I imaš obe najbitnije knjige za učenje OpenGL-a besplatno u HTML i PDF formatu ovde:
http://www.opengl.org/documentation/blue_book_1.0/
http://www.opengl.org/documentation/red_book_1.0/

OpenGL FAQs:
http://www.opengl.org/resources/faq/index.html

Branimir
[ Dejan Lozanovic @ 13.02.2005. 12:00 ] @
imas zato man

man 3 gluPerspective

Plus toga kolega pogledaj malo i ovo
http://www.matf.bg.ac.yu/r4rg/

Naci ces dobre osnove tu