Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C++] Lampada con OpenGL

    Ciao a tutti. Sto creando un'interfaccia grafica per il mio progetto e per rendere il tutto più carino ho deciso di creare una lampada che illumini la simulazione.

    Questa é la classe:

    codice:
    #ifndef LAMPADA_H
    #define LAMPADA_H
    
    #include "wxincludes.h"
    #include "Typedef.h"
    #include "Vettore.h"
    
    class Lampada
    {
    public:
    	// --- COSTRUTTORI ---
    	Lampada(const Vettore& = {0,-5,2}, const Vettore& = {0,5,-2}, double = 90);
    	Lampada(const vector&, const vector&, double = 90);
    	Lampada(const list&, const list&, double = 90);
    	
    	// --- METODI ---
    	void illumina() const;
    	
    private:
    	// --- ATTRIBUTI ---
    	Vettore posizione;
    	Vettore direzione;
    	double ampiezza;
    };
    
    #endif
    codice:
    #include "Lampada.h"
    
    // *** PRIVATE *** 
    
    // --- COSTRUTTORI ---
    
    Lampada::Lampada(const Vettore& p, const Vettore& d, double a)
    : posizione(p), direzione(d), ampiezza(a)
    {}
    
    Lampada::Lampada(const vector& p, const vector& d, double a)
    : posizione(p), direzione(d), ampiezza(a)
    {}
    
    Lampada::Lampada(const list& p, const list& d, double a)
    : posizione(p), direzione(d), ampiezza(a)
    {}
    	
    // --- METODI ---
    
    void Lampada::illumina() const
    {
    	GLfloat light_ambient[]= {0.1, 0.1, 0.1, 0.1};
    	GLfloat light_diffuse[]= {1.0, 1.0, 1.0, 0.0};
    	GLfloat light_specular[]= {1.0, 1.0, 1.0, 0.0};
    	
    	GLfloat light_position[]= {posizione[0], posizione[1], posizione[2], 1.0};
    	
    	glLightfv (GL_LIGHT1, GL_AMBIENT, light_ambient);
    	glLightfv (GL_LIGHT1, GL_DIFFUSE, light_diffuse);
    	glLightfv (GL_LIGHT1, GL_SPECULAR, light_specular);
    	glLightfv (GL_LIGHT1, GL_POSITION, light_position);
    	
    	glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, ampiezza);
    	
    	GLfloat spot_direction[] = {direzione[0], direzione[1], direzione[2]};
    	
    	glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
    	
    	glEnable (GL_LIGHT1);
    	glEnable (GL_LIGHTING);
    	
    }
    Il problema é che, pur avendo colorato una palla di rosso, quest'ultima appari si correttamente illuminata, ma in scala di grigi...

    In più anche gli assi cartesiani che avevo disegnato al centro dell'immagine appaiono grigi e non più colorati, risultando così praticamente invisibili sullo sfondo nero.

    Qualcuno sa come migliorare la lampada e far si che gli oggetti si colorino correttamente? Grazie.

    Ps: L'interfaccia grafica é costituita dalle seguenti classi: GUI, Finestra e Vista. GUI (wxApp) implementa semplicemente l'applicazione. Finestra si occupa della gestione della finestra (wxFrame), mentre la classe vista si occupa della simulazione vera e propria (timing e disegno). Questa classe contiene una classe Camera e appunto la classe Lampada.

    Grazie,
    R.
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Intanto sembra che usi light1 e light0 e abiliti solo light1, quindi forse qualche valore di default puo causare problemi
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Originariamente inviato da linoma
    Intanto sembra che usi light1 e light0 e abiliti solo light1, quindi forse qualche valore di default puo causare problemi
    Vero: ho abilitato anche LIGHT0 ma non cambia molto (tranne che l'intensità della luce che arriva da sinistra sulla palla é molto più marcata). Ma allora non capisco come specificare la posizione dello spot: ho provato con GL_SPOT_POSITION ma non funziona... In poche parole non so bene come comportarmi e come creare un'illuminazione ideale... Puoi darmi qualche dritta?
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Sono visibili le diverse componenti della luce? Proverei prima con una luce piu semplice come quella direzionale. Puoi trovare alcuni esempi qui
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Originariamente inviato da linoma
    Sono visibili le diverse componenti della luce? Proverei prima con una luce piu semplice come quella direzionale. Puoi trovare alcuni esempi qui
    Cosa intendi per componenti della luce? Comunque un cono di luce direzionale é quello che vorrei creare, ma non ho ben capito come fare. Ho letto il capitolo 6 del Red Book, ma non mi ha aiutato molto... =(.
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  6. #6
    Intendevi qualcosa del genere?

    codice:
    GLfloat sun_direction[] = { 0.0, 2.0, -1.0, 1.0};
    GLfloat sun_intensity[] = { 0.7, 0.7, 0.7, 1.0};
    GLfloat ambient_intensity[] = { 0.3, 0.3, 0.3 ,1.0};
    						
    glEnable(GL_LIGHTING);            	
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient_intensity);
    				
    glEnable(GL_LIGHT0);              
    glLightfv(GL_LIGHT0, GL_POSITION, sun_direction);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_intensity);
    				
    glEnable(GL_COLOR_MATERIAL);       
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  7. #7
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Visivamente, riesci a distinguere almeno la parte esposta e non della tua palla? La tua palla ha le normali? Usi il colore rosso per la tua palla? Prova con una luce direzionale.
    Per gli Spartani e Sparta usa spartan Il mio github

  8. #8
    Originariamente inviato da linoma
    Visivamente, riesci a distinguere almeno la parte esposta e non della tua palla? La tua palla ha le normali? Usi il colore rosso per la tua palla? Prova con una luce direzionale.
    Questa é l'immagine prima di aggiungere

    codice:
    glEnable(LIGHT0);
    Immagini allegate Immagini allegate
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  9. #9
    Questa invece dopo l'aggiunta di quella linea di codice.

    La palla é stata colorata di rosso:

    codice:
    glPushMatrix();
    glRotated(posizione, 0.0, 0.0, 1.0);
    glTranslated(2.0, 0.0, 0.0);
    glColor4d(1.0, 0.0, 0.0, 0.6);
    gluSphere(sfera, 0.1, 30, 30); // sfera é GLUquadric*
    glPopMatrix();
    Immagini allegate Immagini allegate
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  10. #10
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Ma che colore usi per disegnare la sfera? Usi un materiale?
    Per gli Spartani e Sparta usa spartan Il mio github

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.