Get the Mytodolist Free Android app from SlideME.

dimanche 8 juin 2014

6/ Manipulez les matériaux dans JMonkey Engine




Le terme "matériel" comprend tout ce qui influe sur ce que la surface d'un modèle 3D ressemble: La couleur, la texture, la brillance et l'opacité / transparence. La coloration pleine est couverte dans "Créer vos scènes 3D avec les noeuds et géométries" .Les modèles de chargement qui viennent avec des matériaux est couvert dans Charger des modèles 3D et du texte avec Assets (actifs).. Dans ce tutoriel, vous apprendrez à créer et à définir des matériaux personnalisé dans JME3.






Pour utiliser les exemples sur les assets dans un nouveau projet moteur jmonkeyengine SDK, faites un clic droit votre projet, sélectionnez "Propriétés", aller à "Bibliothèques", appuyez sur "Ajouter Library" et ajouter la bibliothèque "jme3-test-données".

Exemple de code


package jme3test.helloworld;
 
import com.jme3.app.SimpleApplication;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.renderer.queue.RenderQueue.Bucket;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Sphere;
import com.jme3.texture.Texture;
import com.jme3.util.TangentBinormalGenerator;
 
/** Sample 6 - how to give an object's surface a material and texture.
 * How to make objects transparent. How to make bumpy and shiny surfaces.  */
public class HelloMaterial extends SimpleApplication {
 
  public static void main(String[] args) {
    HelloMaterial app = new HelloMaterial();
    app.start();
  }
 
  @Override
  public void simpleInitApp() {
 
    /** A simple textured cube -- in good MIP map quality. */
    Box cube1Mesh = new Box( 1f,1f,1f);
    Geometry cube1Geo = new Geometry("My Textured Box", cube1Mesh);
    cube1Geo.setLocalTranslation(new Vector3f(-3f,1.1f,0f));
    Material cube1Mat = new Material(assetManager, 
        "Common/MatDefs/Misc/Unshaded.j3md");
    Texture cube1Tex = assetManager.loadTexture(
        "Interface/Logo/Monkey.jpg");
    cube1Mat.setTexture("ColorMap", cube1Tex);
    cube1Geo.setMaterial(cube1Mat);
    rootNode.attachChild(cube1Geo);
 
    /** A translucent/transparent texture, similar to a window frame. */
    Box cube2Mesh = new Box( 1f,1f,0.01f);
    Geometry cube2Geo = new Geometry("window frame", cube2Mesh);
    Material cube2Mat = new Material(assetManager, 
        "Common/MatDefs/Misc/Unshaded.j3md");
    cube2Mat.setTexture("ColorMap", 
        assetManager.loadTexture("Textures/ColoredTex/Monkey.png"));
    cube2Mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
    cube2Geo.setQueueBucket(Bucket.Transparent);
    cube2Geo.setMaterial(cube2Mat);
    rootNode.attachChild(cube2Geo);
 
    /** A bumpy rock with a shiny light effect.*/
    Sphere sphereMesh = new Sphere(32,32, 2f);
    Geometry sphereGeo = new Geometry("Shiny rock", sphereMesh);
    sphereMesh.setTextureMode(Sphere.TextureMode.Projected); // better quality on spheres
    TangentBinormalGenerator.generate(sphereMesh);           // for lighting effect
    Material sphereMat = new Material(assetManager, 
        "Common/MatDefs/Light/Lighting.j3md");
    sphereMat.setTexture("DiffuseMap", 
        assetManager.loadTexture("Textures/Terrain/Pond/Pond.jpg"));
    sphereMat.setTexture("NormalMap", 
        assetManager.loadTexture("Textures/Terrain/Pond/Pond_normal.png"));
    sphereMat.setBoolean("UseMaterialColors",true);    
    sphereMat.setColor("Diffuse",ColorRGBA.White);
    sphereMat.setColor("Specular",ColorRGBA.White);
    sphereMat.setFloat("Shininess", 64f);  // [0,128]
    sphereGeo.setMaterial(sphereMat);
    sphereGeo.setLocalTranslation(0,2,-2); // Move it a bit
    sphereGeo.rotate(1.6f, 0, 0);          // Rotate it a bit
    rootNode.attachChild(sphereGeo);
 
    /** Must add a light to make the lit object visible! */
    DirectionalLight sun = new DirectionalLight();
    sun.setDirection(new Vector3f(1,0,-2).normalizeLocal());
    sun.setColor(ColorRGBA.White);
    rootNode.addLight(sun);
 
  }
}

Vous devriez voir :
A gauche - Un cube avec un singe brun texture.
A droite - Une image de singe translucide en face d'un rocher cahoteuse brillant.
Déplacez vous avec les touches WASD pour voir de plus près la translucidité et l' indivisibilité de la roche.


Texture sans ombre simple 

        En général, vous voulez mettre des objets dans vos textures de la scène: Il peut être un rocher, une herbe, les briques, le bois, l'eau, le métal, du papier ... Une texture est un fichier image normale au format JPG ou PNG. Dans cet exemple, vous pouvez créer une boîte avec une simple texture de singe sans ombre en tant que matériel.


 /** A simple textured cube -- in good MIP map quality. */
    Box cube1Mesh = new Box( 1f,1f,1f);
    Geometry cube1Geo = new Geometry("My Textured Box", cube1Mesh);
    cube1Geo.setLocalTranslation(new Vector3f(-3f,1.1f,0f));
    Material cube1Mat = new Material(assetManager, 
        "Common/MatDefs/Misc/Unshaded.j3md");
    Texture cube1Tex = assetManager.loadTexture(
        "Interface/Logo/Monkey.jpg");
    cube1Mat.setTexture("ColorMap", cube1Tex);
    cube1Geo.setMaterial(cube1Mat);
    rootNode.attachChild(cube1Geo);

Voici ce que nous avons fait: pour créer une zone de texture:

1/ Créer une géométrie cube1Geo d'une boîte de maille cube1Mesh.
2/ Créer un cube1Mat Matériau à base Unshaded.j3md définition matérielle de jME3 par défaut.
3/ Créer une texture cube1Tex à partir du fichier monkey.jpg dans les actifs / Interface / Logo / répertoire du projet.
4/ Chargez la texture cube1Tex dans la couche de ColorMap du matériel cube1Mat. 
5/ Appliquez le matériel au cube, et fixez le cube au noeud racine (RootNode).


Texture sans ombre transparente 


Monkey.png a la même texture que monkey.jpg, mais avec un canal alpha ajoutée. Le canal alpha vous permet de spécifier les domaines de texture que vous voulez: opaque ou transparent: les zones noires du canal alpha restent opaques, des zones d'ombre deviennent translucides, et les zones blanches deviennent transparents.

Pour une texture partiellement translucide / transparent, vous devez avoir :


  • Une texture avec un canal alpha 
  • Une texture avec un mélange de mode BlendMode.ALPHA 
  • Une géométrie dans Bucket.Transparent rend le bucket (ou seau). 

Ce bucket garantit que l'objet transparent est attirée sur des objets derrière lui, et ils montrent correctement dans les parties transparentes.



   /** A translucent/transparent texture, similar to a window frame. */
    Box cube2Mesh = new Box( 1f,1f,0.01f);
    Geometry cube2Geo = new Geometry("window frame", cube2Mesh);
    Material cube2Mat = new Material(assetManager, 
    "Common/MatDefs/Misc/Unshaded.j3md");
    cube2Mat.setTexture("ColorMap", 
        assetManager.loadTexture("Textures/ColoredTex/Monkey.png"));
    cube2Mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);  // !
    cube2Geo.setQueueBucket(Bucket.Transparent);                        // !
    cube2Geo.setMaterial(cube2Mat);
    rootNode.attachChild(cube2Geo);
Pour les objets non transparents, l'ordre de dessin n'est pas si important, parce que le z-buffer maintient déjà trace de savoir si un pixel est derrière les autres ou pas quelque chose, et la couleur d'un pixel opaque ne dépend pas des pixels en dessous, c'est pourquoi les Géométries opaques peuvent être tirés dans n'importe quel ordre.

Qu'est-ce que vous avez fait pour que la texture transparente soit le même que la précédente, avec une seule étape supplémentaire pour la transparence.

1/ Créer une géométrie cube2Geo d'une boîte de maille cube2Mesh. Cette géométrie Box est la boîte verticale plat (car z = 0.01f).
2/ Créer un matériel cube2Mat à basé sur la définition matériel de jME3 sur Unshaded.j3md.
3/ Créer une texture cube2Tex à partir du fichier Monkey.png dans les actifs / Textures / ColoredTex / répertoire du projet. Ce fichier PNG doit avoir une couche alpha.
4/ Activer la transparence en la matière en réglant le mode de fusion à Alpha.
5/ Réglez la QueueBucket de la géométrie à Bucket.Transparent.
6/ Chargez la texture de cube2Tex dans la couche de ColorMap du matériel cube2Mat .
7/ Appliquer le matériel au cube, et fixez le cube au noeud racine ( RootNode ).

Astuce: En savoir plus sur la création d'images PNG avec une couche alpha dans le système d'aide de votre éditeur.


Brillance et bosselage 


       Les textures ne sont pas tout. Jetez un coup d'oeil sur la sphère brillante - vous ne pouvez pas obtenir un si beau matériel bosselé avec juste une texture uniforme. Vous remarquerez que JME3 prend également en compte le matériel appelée  Phong-illuminated (phong éclairé):

Dans un matériel éclairé, la couche de texture standard est mensionnée comme DiffuseMap, tout matériel peut utiliser cette couche. Un matériel éclairé peut en outre avoir des effets d'éclairage tels que la brillance utilisée conjointement avec la couche SpecularMap et couleur spéculaire (Specular color). Vous pouvez même obtenir une surface bosselée réaliste ou fissurée avec l'aide de la couche de NormalMap. 

Ayons un regard sur la partie de l'exemple de code dans lequel vous créez la roche bosselée brillant.

1/ Créer une géométrie à partir d'une forme de sphère. Notez que cette forme est un maillage de la sphère normale en douceur.


Sphere sphereMesh = new Sphere(32,32, 2f);
    Geometry sphereGeo = new Geometry("Shiny rock", sphereMesh);
         I/(Seulement pour les sphères) Changer le TextureMode de la sphère pour rendre la texture carré du projet mieux adapté à la sphère.
sphereMesh.setTextureMode(Sphere.TextureMode.Projected);

         II/Vous devez générer TangentBinormals pour le maillage de sorte que vous pouvez utiliser la couche de NormalMap de la texture.
TangentBinormalGenerator.generate(sphereMesh);

2/ Créer un matériel à base de la matière par défaut Lighting.j3md.


 Material sphereMat = new Material(assetManager, 
        "Common/MatDefs/Light/Lighting.j3md");

        I/ Définir une texture rocheuse standard dans la couche de DiffuseMap.
 sphereMat.setTexture("DiffuseMap", 
        assetManager.loadTexture("Textures/Terrain/Pond/Pond.jpg"));

       II/ Mettez le calque de NormalMap qui contient le bumpiness. Le NormalMap a été généré pour ce DiffuseMap notamment avec un outil spécial (par exemple Blender).
   sphereMat.setTexture("NormalMap", 
        assetManager.loadTexture("Textures/Terrain/Pond/Pond_normal.png"));

        III/ Réglez la Brillance du matériel à une valeur comprise entre 1 et 128. Pour un rocher, une brillance floue basse est appropriée. Utilisez des couleurs matérielles pour définir la couleur de la brillance spéculaire.
sphereMat.setBoolean("UseMaterialColors",true);    
    sphereMat.setColor("Diffuse",ColorRGBA.White);  // minimum material color
    sphereMat.setColor("Specular",ColorRGBA.White); // for shininess
    sphereMat.setFloat("Shininess", 64f); // [1,128] for shininess

2/  Attribuez votre matériel nouvellement créée à la géométrie.
 sphereGeo.setMaterial(sphereMat);

3/ déplaçez et faite tourner la géométrie pour mieux la positionner.
 sphereGeo.setLocalTranslation(0,2,-2); // Move it a bit
    sphereGeo.rotate(1.6f, 0, 0);          // Rotate it a bit
    rootNode.attachChild(sphereGeo);

N'oubliez pas que tout matériel à base de Lighting.j3md nécessite une source de lumière, comme le montre l'exemple de code complet ci-dessus. 

Astuce: Pour désactiver la brillance, ne réglez pas Shininess à 0, mais à la place la couleur spéculaire Specular à ColorRGBA.Black.


Définitions des matériels par défaut

Comme vous l'avez vu, vous pouvez trouver les matériaux par défaut suivantes dans  jme/core-data/Common/…


Définition par défautUtilisationParamètres
Common/MatDefs/Misc/Unshaded.j3mdColorier: utilisé avec mat.setColor() et ColorRGBA.
Texture: utilisé avec mat.setTexture() et Texture.
Color : Color
ColorMap : Texture2D
Common/MatDefs/Light/Lighting.j3mdutilisé avec shiny Textures, Bump- and NormalMaps textures.
Requiert une source de lumière: light source.
Ambient, Diffuse, Specular : Color
DiffuseMap, NormalMap, SpecularMap : Texture2D
Shininess : Float

<<< Précédent                                          Sommaire                                                  Suivant >>>






Aucun commentaire:

Enregistrer un commentaire