La creazione di una sfera 3D in Opengl utilizzando Visual C++
Io non sono in grado di creare una semplice sfera 3D utilizzando la libreria OpenGL funzione glutSolidSphere() in C++.
Ecco cosa ho provato:
#include<GL/glu.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glLoadIdentity();
glutSolidSphere( 5.0, 20.0, 20.0);
glFlush();
}
void myInit()
{
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(1.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,499.0,0.0,499.0);
glMatrixMode(GL_MODELVIEW);
}
void main(int argc,char **argv)
{
qobj = gluNewQuadric();
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutCreateWindow("pendulum");
glutDisplayFunc(display);
myInit();
glutMainLoop();
}
- Essere più specifico. Che cosa hai provato?
- Si prega di mostrare il codice che non funziona.
- volevo sapere come posso implementare una sfera 3D per il mio mini progetto ,che è un pendolo, in opengl..sto usando visual c++.
- Correlate: il Disegno di una sfera in OpenGL, senza l’utilizzo di
gluSphere
?
In OpenGL non creano oggetti, disegnare loro. Una volta disegnato, OpenGL non è più interessato a che la geometria è inviato.
glutSolidSphere
è solo l’invio di comandi di disegno per OpenGL. Tuttavia non c’è niente di speciale su di esso. E poiché è legato all’ECCESSO, mi piacerebbe non la utilizza. Invece, se si ha realmente bisogno di qualche sfera nel codice, che ne dite di creare se per te?Model
classe in cui i vertici, calibri, ecc sono gli attributi esolidSphere()
sarebbe uno dei tanti metodi utilizzati per generare la geometria che, in seguito viene disegnato utilizzandodraw()
.glDrawElement()
chiamata dovrebbe essere utilizzandoGL_UNSIGNED_INT
dato il vettore negoziGLuint
s), ma è solo la generazione di quarto inferiore della sfera e anche backface culling è l’abbattimento al di fuori della sfera, a meno di non utilizzareglFrontFace(GL_CW)
per cambiare l’avvolgimento. Potete aiutare con questi problemi? Mi dispiace di essere un dolore, so cosa significa cercare di aiutare e quindi farsi carico le richieste di supporto :-/rings * sectors * 4
, mentre il vertex array è creato tra le facce; solo perché una sfera è ciclico coordina i passanti sembrano identici.const
modificatore dopo il tipo. Non vedi che abbastanza spesso. 🙂(rings-1) * (sectors-1) * 4
. Si potrebbe desiderare di correzione.rings * sectors * 4
indici, ma solo la scrittura(rings - 1) * (sectors - 1) * 4
indici del vettore sembra male comunque ? Hai unset indici alla fine. O vuoi dire che questi ultimi indici di dovrebbe essere 0 ?Non sembra come nessuno finora ha affrontato il problema con il codice originale, così ho pensato di farlo anche se la questione è abbastanza vecchio, a questo punto.
Il problema, in origine, aveva a che fare con la proiezione in relazione al raggio e la posizione della sfera. Penso che il problema non è troppo complicato. Effettivamente il programma funziona correttamente, è solo che cosa rappresenta il disegno è molto difficile da vedere.
Prima, una proiezione ortogonale è stato creato utilizzando la chiamata
che “è equivalente alla chiamata glOrtho con vicino = -1 e far = 1.” Questo significa che la visualizzazione tronco ha una profondità di 2. Così una sfera con un raggio di qualcosa di più grande di 1 (diametro = 2) non si adatta completamente all’interno della visualizzazione tronco.
Allora le chiamate
sono utilizzati, che carica la matrice identità di model-view matrix e poi “[r]enders una sfera centrata in modellazione coordinate di origine di raggio specificato.” Significato, la sfera viene reso all’origine, (x, y, z) = (0, 0, 0), e con un raggio di 5.
Ora, il problema è triplice:
pi*5^2/499^2
, che è più vicino a circa 1/3170th) di tutta la finestra, in modo potrebbe essere difficile vedere. Questo è supponendo che il cerchio è disegnato all’interno dell’area della finestra. Non è, tuttavia, come vedremo nel punto 2.pi*5^2/(4*499^2)
, che è più vicino a 1/12,682 nd) delle dimensioni della finestra. Questo renderebbe ancora più difficile vedere. Soprattutto dal momento che la sfera è resa così vicino ai bordi/angoli dello schermo in cui si potrebbe non pensare al look.La soluzione è semplice per cambiare la visualizzazione tronco e il raggio della sfera. Per esempio,
rende l’immagine seguente.
Come si può vedere, solo una piccola parte è visibile in tutto il “equatore”, di una sfera con un raggio di 5. (Ho cambiato la proiezione per riempire la finestra con la sfera.) Un altro esempio,
rende l’immagine seguente.
L’immagine sopra mostra più la sfera all’interno della visualizzazione tronco, ma la sfera è di 0,2 unità di misura della profondità maggiore di visualizzazione tronco. Come si può vedere, le “calotte” della sfera sono mancanti, sia da nord che da sud. Così, se si desidera che l’intera sfera adatta la visualizzazione di tronco che ha profondità di 2, dobbiamo fare in modo che il raggio inferiore o uguale a 1.
rende l’immagine seguente.
Spero che questo ha aiutato qualcuno. Fate attenzione!
Non capisco come si può datenwolf indice di generazione può essere corretto. Ma ancora trovare la sua soluzione, piuttosto chiaro. Questo è quello che ottengo dopo qualche pensiero:
glutSolidSphere
come la questione chiamato per esso.Ecco il codice:
Mi piace la risposta di moneta. E ‘ semplice da capire e lavora con i triangoli. Tuttavia gli indici del suo programma sono a volte oltre i limiti. Così I post qui il suo codice con due piccole correzioni:
Datanewolf codice è QUASI giusto. Ho dovuto invertire sia l’avvolgimento e normali per farlo funzionare correttamente con la fixed pipeline. Il seguito funziona correttamente con cull si o no per me:
Edit: C’era una domanda su come disegnare questo… nel mio codice ho incapsulare questi valori in un G3DModel classe. Questo è il mio codice per l’installazione del telaio, disegnare il modello, e fine: