Domanda

Sto usando freeglut per il rendering di Opengl ...

Ho bisogno di disegnare una busta che assomigli a un cono (2D) che deve essere riempito con un po 'di colore e un po' di trasparenza applicata.

Il toolkit freeglut è dotato di una tale funzionalità integrata per disegnare geometrie riempite (o qualche trucco)? o c'è qualche altra API che ha un supporto integrato per geometrie riempite ..

Edit1: solo per chiarire la cosa del cono 2D ... l'inviluppo è l'interpretazione grafica dell'area di copertura di un aereo durante l'intercettazione (di un aereo nemico) ... che ricorda un settore di un cerchio ... avrei dovuto invece menzionare settore. .

e glutSolidCone non mi aiuta perché voglio disegnare un settore pieno di un cerchio ... cosa che ho già fatto ... ciò che resta da fare è riempirlo con un po 'di colore ... come riempire le geometrie con il colore in opengl?

Edit2: Tutte le risposte inviate a queste domande possono funzionare in qualche modo per il mio problema. Ma vorrei sicuramente sapere un modo per riempire una geometria con un po 'di colore. Dimmi se voglio disegnare una busta che è una parabola ... in quel caso non ci sarebbe alcuna funzione di glut predefinita per disegnare effettivamente una parabola piena (o ce n'è?). Quindi, per generalizzare questa domanda ... come disegnare una geometria personalizzata in un colore solido?

Edit3: La risposta che mstrobl ha pubblicato funziona per GL_TRIANGLES ma per tale codice:

glBegin(GL_LINE_STRIP);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

che disegna un quadrato ... viene disegnato solo un quadrato cablato ... devo riempirlo di colore blu.

comunque per farlo?

se inserisco alcuni comandi di disegno per una curva chiusa..come una torta..e devo riempirlo con un colore c'è un modo per renderlo possibile ...

Non so come sia possibile per GL_TRIANGLES ... ma come farlo per qualsiasi curva chiusa?

È stato utile?

Soluzione

Su Edit3: il modo in cui capisco la tua domanda è che vuoi che OpenGL disegni i bordi e che qualsiasi cosa tra loro debba essere riempita di colori.

L'idea che avevi era giusta, ma una striscia di linea è proprio questa: una striscia di linee e non ha alcuna area.

Puoi, tuttavia, avere le linee collegate tra loro per definire un poligono. Ciò riempirà l'area del poligono su una base per vertice. Adattamento del codice:

glBegin(GL_POLYGON);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

Si noti tuttavia che disegnare un poligono in questo modo ha due limiti:

  • Il poligono deve essere convesso.
  • Questa è un'operazione lenta.

Ma suppongo che tu voglia solo fare il lavoro, e questo lo farà. Per il futuro potresti considerare di triangolare il tuo poligono.

Altri suggerimenti

Non sono sicuro di cosa intendi per "un involucro", ma un cono è un primitivo che ha un eccesso:

glutSolidCone(radius, height, number_of_slices, number_of_stacks)

Il modo più semplice per riempirlo di colore è disegnarlo con il colore. Dato che vuoi renderlo in qualche modo trasparente, hai bisogno anche di un valore alfa:

glColor4f(float red, float green, float blue, float alpha)
// rgb and alpha run from 0.0f to 1.0f; in the example here alpha of 1.0 will
// mean no transparency, 0.0 total transparency. Call before drawing.

Per eseguire il rendering in modo traslucido, la fusione deve essere abilitata. E devi impostare la funzione di fusione da usare. Quello che vuoi fare sarà probabilmente ottenuto con quanto segue. Se vuoi saperne di più, lasciami un commento e cercherò alcuni buoni suggerimenti. Ma ecco la tua configurazione:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Chiamalo prima di fare qualsiasi operazione di disegno, possibilmente durante l'inizializzazione del programma. :)

Dato che hai dichiarato la tua domanda per chiedere una torta: c'è un modo semplice per disegnarla anche usando primitive opengl:

Disegneresti una sfera solida usando gluSolidSphere (). Tuttavia, poiché vuoi solo disegnarne una parte, devi solo ritagliare le parti indesiderate:

void glClipPlane(GLenum plane, const GLdouble * equation);

Con il piano da GL_CLIPPLANE0 a GL_CLIPPLANEn e l'equazione essendo un'equazione del piano in forma normale (un x + b y + c * z + d = 0 significherebbe che l'equazione conterrebbe i valori { a, b, c, d} . Si noti che quelli sono doppi e non float.

Ricordo che c'era una subroutine per quello. Ma non è nemmeno troppo difficile da fare da soli.

Ma non capisco la cosa 2D. Cono in 2D? Non è solo un triangolo?

Comunque, ecco un algoritmo per disegnare un cono in apertura

Per prima cosa prendi un cerchio, suddividilo uniformemente in modo da ottenere una buona quantità di bordi. Ora scegli il centro del cerchio, crea dei triangoli dai bordi al centro del cerchio. Quindi seleziona un punto sopra il cerchio e crea dei triangoli dai bordi a quel punto.

La forma e l'orientamento delle dimensioni dipendono dai valori utilizzati per generare il cerchio e due punti. Ogni passaggio è piuttosto semplice e non dovrebbe causare problemi per te.

Per prima cosa basta suddividere un valore scalare. Inizia da [0-2] -range. Prendi il punto medio ((inizio + fine) / 2) e dividi l'intervallo con esso. Memorizza i valori come coppie. Ad esempio, suddividere una volta dovrebbe darti: [(0,1), (1,2)] Fallo ricorsivamente un paio di volte, quindi calcola quali punti si trovano sul cerchio. Trigonometria semplice, basta ricordare di moltiplicare i valori con p prima di procedere. Dopo questo hai una certa quantità di spigoli. 2 ^ n dove n è la quantità di suddivisioni. Quindi puoi semplicemente trasformarli in triangoli dando loro un punto di vertice in più. La quantità di triangoli finisce per essere quindi: 2 ^ (n + 1). (Gli importi sono utili per sapere se lo stai facendo con array di dimensioni fisse.

Modifica: ciò che vuoi davvero è una torta. (Scusate il gioco di parole)

È altrettanto semplice renderizzare. Puoi di nuovo usare solo triangoli. Basta selezionare un intervallo scalare [-0,25 - 0,25], suddividere, proiettare su cerchio e generare un set di triangoli.

La proiezione scalare - cerchio è semplice come: x = cos (v * pi) r, y = sin (v pi) * r dove (x, y) è il punto di vertice risultante, r è un raggio e le funzioni trigonometriche agiscono sulle radiazioni, non sui gradi. (se funzionano con gradi, sostituisci pi con 180)

Usa buffer o elenchi di vertici per renderizzarlo tu stesso.

Modifica: informazioni sulla domanda di colorazione. glColor4f, se si desidera che alcune parti della geometria differiscano in base al colore, è possibile assegnare un colore per ciascun vertice nel buffer dei vertici stesso. Al momento non conosco tutte le chiamate API per farlo, ma il riferimento API in opengl è abbastanza comprensibile.

Sulla modifica dei colori:

OpenGL è in realtà una macchina a stati. Ciò significa che il materiale corrente e / o la posizione del colore vengono utilizzati durante il disegno. Dal momento che probabilmente non utilizzerai materiali, ignoralo per ora. Vuoi colori.

glColor3f(float r, float g, float b) // draw with r/g/b color and alpha of 1
glColor4f(float r, float g, float b, float alpha)

Ciò influenzerà i colori di tutti i vertici che disegni, di qualsiasi geometria che rendi, sia essa glu o la tua, dopo che la chiamata glColorXX è stata eseguita. Se si disegna una faccia con vertici e si cambia il colore tra le chiamate glVertex3f / glVertex2f, i colori vengono interpolati.

Prova questo:

glBegin(GL_TRIANGLES);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(-3.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 3.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(3.0, 0.0, 0.0);
glEnd();

Ma ho già indicato glColor4f, quindi presumo che tu voglia impostare i colori su base per vertice. E vuoi renderizzare usando gli elenchi di visualizzazione.

Proprio come puoi visualizzare elenchi di vertici, puoi anche farli avere un elenco di colori: tutto ciò che devi fare è abilitare gli elenchi di colori e dire a Opengl dove risiede l'elenco. Naturalmente, devono avere lo stesso equipaggiamento dell'elenco dei vertici (stesso ordine).

Se tu avessi

glEnableClientState(GL_VERTEX_ARRAY);   
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glDisableClientState(GL_VERTEX_ARRAY);

dovresti aggiungere i colori in questo modo. Non devono essere galleggianti; in effetti, gli dici che formato dovrebbe essere. Per un elenco di colori con 1 byte per canale e 4 canali (R, G, B e A) usa questo:

glEnableClientState(GL_VERTEX_ARRAY);   
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors_);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

EDIT: ho dimenticato di aggiungere che devi dire a OpenGL quali elementi disegnare richiamando glDrawElements .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top