Forums Développement Multimédia

Aller au contenu

- - - - -

Image de fond dans ma scène 3d

background CODE Actionscript

7 réponses à ce sujet

#1 loudoweb

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 213 messages

Posté 07 August 2012 - 17:12 PM

Bonjour,

Puisqu'il est impossible d'avoir des éléments 2d de la display list à la fois derrière et devant, il me faut alors gérer mon image de fond avec Minko.

Je dois être capable de générer une scène 3d avec des paramètres différents qui sont les suivants :
  • position du modèle 3d (en réalité je pense que je le placerai toujours en 0,0,0)
  • position de la caméra et orientation de celle-ci
  • image de fond devant absolument prendre la taille du viewport et dont je peut paramétrer la position par rapport au modèle 3d
  • la position de la caméra est fixée une seule fois
J'ai donc retenu quelques solutions et j'aimerai avoir votre avis sur leur faisabilité (et puis si vous avez d'autres idées...)

1. Création d'un plan qui contiendra mon image de fond sous forme de texture. Le plan devra être généré à une distance donnée et devra se créer face à la caméra. Il faut également que ce plan prenne toute la scène.

2. J'ai vu que le viewport utilisait pour son background color la classe RenderTarget et que celle-ci pourrait utiliser une texture. Je peux peut-etre alors créer une classe qui hérite de Viewport et ajouter comme paramètre la texture pour l'ajouter dans ce RenderTarget.

3. Sinon je créé des plans dans un logiciel 3d comme ça j'ai tous mes plans lorsque je charge mon fichier et j'ajoute au bon plan la bonne texture. Mais cela risque d'être long et contraignant. Je préférerai passer par le code pour paramétrer cela plus facilement.

Quel est votre avis ? Avez-vous de meilleures solutions ?

Merci
---------------------------------
loudo
______________________
@loudoweb
http://www.loudoweb.fr
_____________________

#2 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 08 August 2012 - 12:25 PM

Citation

2. J'ai vu que le viewport utilisait pour son background color la classe RenderTarget et que celle-ci pourrait utiliser une texture. Je peux peut-etre alors créer une classe qui hérite de Viewport et ajouter comme paramètre la texture pour l'ajouter dans ce RenderTarget.
RenderTarget c'est ce dans quoi le viewport dessine. Avant de dessiner dedans, la texture est vidée. Sinon, elle contiendrait la frame précédente. Donc ça ne sert pas à ce que tu veux faire.

Citation

1. Création d'un plan qui contiendra mon image de fond sous forme de texture. Le plan devra être généré à une distance donnée et devra se créer face à la caméra. Il faut également que ce plan prenne toute la scène.

Tu peux créer un shader qui servirait à rendre un quad qui prend tout l'écran:


public class BackgroundShader extends Shader
{
  private var _diffuse : DiffuseShaderPart;

  public function BackgroundShader()
  {
        _diffuse = new DiffuseShaderPart(this);
  }

  override protected function initializeSettings(settings : ShaderSettings) : void
  {
        // s'assure que la passe est toujours faite en 1er
        settings.priority = Number.MAX_VALUE;
        // désactive l'écriture dans le z-buffer
        settings.depthWriteEnabled = false;
  }

  override protected function getVertexPosition() : SFloat
  {
        // scale le quad x2 pour qu'il prenne tout l'écran
        return multiply(vertexXYZ, float4(2, 2, 1, 1));
  }

  override protected function getPixelColor() : SFloat
  {
        return _diffuse.getDiffuseColor();
  }
}
 


// ajoute le background à la scène
scene.addChild(new Mesh(
  QuadGeometry.quadGeometry,
  new Material(
        new Effect(new BackgroundShader()),
        { diffuseMap : TextureLoader.load(new URLRequest('background.jpg')) }
  )
));
 

Tu peux même faire un noeud "Background":


public class Background extends Mesh
{
  public function Background(texture : TextureResource)
  {
        super(
          QuadGeometry.quadGeometry,
          new Material(
                new Effect(new BackgroundShader()),
                { diffuseMap : texture }
          )
        );
  }
}

scene.addChild(new Background(TextureLoader.load(new URLRequest('background.jpg')));
 

Modifié par Jean-Marc Le Roux, 08 August 2012 - 12:32 PM.


#3 loudoweb

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 213 messages

Posté 08 August 2012 - 14:35 PM

Merci Jean-Marc pour ta réponse très complète.

J'ai donc bien un fond d'écran qui prend toute ma scène en BasicEffect.

Par contre, quand j'ajoute un RealisticEffect à ma scène afin d'obtenir visuellement de bons résultats sur mon modèle 3d situé devant, le fond d'écran disparaît (le fond est noir).

Est-ce un problème de Triangle Culling sur le mesh Background ?
Ou de lumière (diffuse, multiplier) ?
Et comment je peux faire pour corriger cela ?

Merci
---------------------------------
loudo
______________________
@loudoweb
http://www.loudoweb.fr
_____________________

#4 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 08 August 2012 - 15:38 PM

Citation

Et comment je peux faire pour corriger cela ?
Je ne vois pas trop où pourrait être le problème.
Tu peux poster ton code ?

#5 loudoweb

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 213 messages

Posté 08 August 2012 - 16:43 PM

Bon je vais essayer de condenser le code :


_scene.addChild(camera);
//correspond au background de ton poste précédent
_scene.addChild(__background);
 
_lightingEffect = new RealisticEffect(scene)

_light = new DirectionalLight();
_light.shadowCastingType = ShadowMappingType.MATRIX;
_light.shadowMapSize  = 2048;
 
_scene.addChild(_light).addChild(new AmbientLight());


options  = new ParserOptions();
options.parser   = MKParser;
options.loadDependencies  = true;
options.mipmapTextures   = true;
options.dependencyLoaderClosure = dependencyLoaderClosure;
//quand je commente la ligne ci-dessous je vois mon background sinon je ne le vois pas
options.effect = _lightingEffect;

_loader = new SceneLoader(options);
_loader.complete.add(sceneLoaded);
_loader.load(new URLRequest('modele3d.mk'));
 

C'est vraiment tout simple, je me base sur MinkoExampleApplication.
---------------------------------
loudo
______________________
@loudoweb
http://www.loudoweb.fr
_____________________

#6 skyrick

    Ceinture Orange

  • Members
  • PipPipPip
  • 43 messages

Posté 11 August 2012 - 18:50 PM

Bonjour, pas de code mais une info :

Dans quasiment la totalité des jeux vidéos / scène 3D etc, on passe plutôt par un énorme Cube (souvent appelé Skybox) qu'on place autour de la scène.

Auquel on flip les faces et leurs appliques les textures adéquates :

Image IPB

Edit : autant pour moi, je n'avais pas vu que tu as une contrainte de caméra fixe

#7 loudoweb

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 213 messages

Posté 22 August 2012 - 08:59 AM

Merci skyrick pour l'info, j'ai testé la skybox par curiosité et je ne retrouve pas le même problème qu'avec l'image de fond associée au RealisticEffect.

Pour en revenir au Background + RealisticEffect , j'ai trouvé la source du problème. Il s'agit en fait d'un problème de lumières et d'ombres.


Voici le résultat de mes tests (cf mon code plus haut pour le code original):

J'ai d'abord retiré la DirectionalLight et ai constaté que l'image de fond était désormais apparente avec le RealisticEffect.

Puis ensuite je l'ai remise en modifiant cela :
_light.shadowCastingType = ShadowMappingType.MATRIX;
par
_light.shadowCastingType = ShadowMappingType.NONE;
Et là aussi ça marche !

J'ai donc l'impression que l'effet d'ombre et lumière de la DirectionalLight empêche au background d'être visible malgré la présence de l'AmbientLight.
Une petite explication svp ?

Modifié par loudoweb, 24 August 2012 - 09:59 AM.

---------------------------------
loudo
______________________
@loudoweb
http://www.loudoweb.fr
_____________________

#8 loudoweb

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 213 messages

Posté 21 September 2012 - 14:38 PM

Voici ci-joint un exemple de mon application (j'ai utilisé les derniers fichiers se trouvant sur github (minko et minko lighting))

J'ai placé 2 cubes sur la scène ainsi qu'une DirectionalLight et une AmbientLight et mon image de fond.
Par défaut, j'ai mis le shadowCastingType de la lumière à ShadowMappingType.NONE.
Pour mettre la valeur de cette propriété à ShadowMappingType.MATRIX, il suffit de faire un clic droit.
Vous verrez alors l'image de fond disparaitre alors que l'ombre apparaitra sur le cube du fond.

Toute aide est la bienvenue pour comprendre le bogue ou l'erreur.
Merci

A+

Fichier(s) joint(s)


---------------------------------
loudo
______________________
@loudoweb
http://www.loudoweb.fr
_____________________



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP