Partage
  • Partager sur Facebook
  • Partager sur Twitter

Assombrir ou éclaircir une Couleur en Java

Sujet résolu
    23 novembre 2014 à 14:47:19

    Bonjours tt le monde.

    Voila le topo:

    je suis en troisième semestre de DUT et notre projet est un logiciel de modélisation 3D. Dans les fonctionnalité à implémenter il faut pouvoir mettre de la lumière. Pour donner cet effet de lumière il faut donc jouer sur la couleur.

    Admettons que les rayons de lumières soit dirigé par un vecteur AO où A = {0.0.1} et O = {0.0.0}, c'est à dire que le vecteur suit l'axe z.

    L'objet modélisé en 3D est composé en réalité de plusieurs triangles ainsi pour un cube chaque face est composé de deux triangles. Voir l'image.

    Admettons que l'on choisisse d'afficher la couleur en jaune.

    Pour modifier les couleurs il faut que un triangle est parallèle au rayons lumineux soit noir et que les triangles perpendiculaires soit dans une teinte la plus claire possible du jaune (bon la face ne doit pas être jaune bien-sûr). Pour calculer ensuite le pourcentage d'inclinaison de la face j'utilise la formule (|<v,n>|)/(||v||*||n||) ou v est le vecteur directeur d'un rayon lumineux et n le vecteur normal de la face, c(est à dire le vecteur perpendiculaire à la face. ||v|| et ||n|| sont les normes de chaque vecteur. En utilisant cette formule j'obtient un cosinus compris entre 0 et 1 cela me permet donc de calculer le pourcentage dont on doit assombrir la couleur. Alors avec ce résultat si on obtient 0 c'est que la face est parallèle au rayons lumineux donc elle doit être noir si on obtient 1 c'est que la face au contraire est perpendiculaire aux rayons lumineux donc la couleur doit être d'un jaune très clair. Donc du coup on admet que 0.5 est la couleur jaune standard de l'API java.

    D'où ma question comment je peux assombrir la couleur jaune ou l'éclaircir suivant le chiffre obtenu par la formule?

    voila merci par avance et voici un screen de mon logiciel avec un cube mais je peux faire des figures de tt genre avec un fichier du type gts

    • Partager sur Facebook
    • Partager sur Twitter
      23 novembre 2014 à 15:32:16

      Il existe une méthode java RGBtoHSB(int r, int g, int b, float[] hsbvals) je pense qu'elle pourrait être utile mais je ne comprend pas encore trop comment elle fonctionne.
      • Partager sur Facebook
      • Partager sur Twitter
        23 novembre 2014 à 16:02:13

        Pourquoi pas multiplier chaque composante de la couleur par le pourcentage obtenu ?

        Color couleurAttenuee = new Color(c.getRed() * pourcent, c.getGreen() * pourcent, c.getBlue() * pourcent);



        • Partager sur Facebook
        • Partager sur Twitter
          23 novembre 2014 à 16:11:31

          Bon ba finalement j'ai trouvé comment fonctionnait tout ça. Je laisse le topique pour ceux qui ont le même genre de question

          Voici le code de l'a fonction:

          public void setColor(Color col){
          		Point ab = new Point(b.x-a.x,b.y-a.y,b.z-a.z); //on calcule le vecteur ab directeur du plan
          		Point ac = new Point(c.x-a.x,c.y-a.y,c.z-a.z); //on calcule le vecteur ac directeur du plan
          		Point normal = new Point((ab.y*ac.z-ab.z*ac.y),-(ab.x*ac.z-ab.z*ac.x),(ab.x*ac.y-ab.y*ac.x)); //vecteur normal au plan
          /* un point comporte trois coordonnée x y z comme un vecteur donc je ne redéfini pas une classe vecteur comme elle est
          identique à la classe point.*/
          		Point lumiere = new Point(0,0,-1); //vecteur directeur des rayons de lumière lumière
          		double percent = Outils.scalaire(normal, lumiere); //on calcule le scalaire des deux vecteurs
          		percent = percent / (Outils.norme(normal)*Outils.norme(lumiere)); //on divise par la multiplication des deux normes pour un résultat compris entre 0 et 1
          		float[] hsbCol = Color.RGBtoHSB(col.getRed(), col.getGreen(), col.getBlue(), null); //on utilise un autre format pour définir une couleur
          		hsbCol[2] = (float) percent; //la colonne 2 permet de jouer sur la brillance de la couleur on peux jour sur la saturation avec la 1 colonne
          		this.color = Color.getHSBColor(hsbCol[0], hsbCol[1], hsbCol[2]); //et on reconvertit en color
          	}

          alors il faut savoir que une face a trois points a b et c.

          • Partager sur Facebook
          • Partager sur Twitter
            23 novembre 2014 à 16:16:04

            brubru777 a écrit:

            Pourquoi pas multiplier chaque composante de la couleur par le pourcentage obtenu ?

            Color couleurAttenuee = new Color(c.getRed() * pourcent, c.getGreen() * pourcent, c.getBlue() * pourcent);



            ça aurait pour effet de modifier complètement la couleur j'ai dans un programme antérieur programmé un colorChooser car celui proposé par java me plaisait vraiment pas et j'ai ajouté des sliders pour R G et B quand tu modifie les trois ça modif la couleur. Si tu en modif que un ça fonctionnerais mais comment savoir quelle est la couleur que tu veux modifier par exemple pour un bleu c'est le sliders correspondant au bleu pour le rouge le rouge et le vert le vert donc ce n'est pas aisé...

            • Partager sur Facebook
            • Partager sur Twitter
              23 novembre 2014 à 16:43:36

              voici un aperçu de ce que ça donne

              -
              Edité par Motain 23 novembre 2014 à 16:44:51

              • Partager sur Facebook
              • Partager sur Twitter

              Assombrir ou éclaircir une Couleur en Java

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown