Page 1 sur 1

Effet miroir

Publié : ven. 09/août/2013 14:40
par falsam
Pure Basic 5.20

Un cube que vous pouvez diriger avec les touches du clavier et qui souhaite se voir dans un miroir. Souci ..... il ne se voit pas bien.

Est il possible d'améliorer ce code que vous pouvez télécharger depuis le lien ci-dessous ?
:arrow: Effet Miroir.zip (Source 79 Ko)

Je poste aussi le code si vous ne souhaites pas downloader.

Code : Tout sélectionner

; Naissance d'un cube : Suis je beau en ce miroir

EnableExplicit

InitEngine3D()
InitKeyboard()
InitSprite()

Global Window, Event
Global Camera

Global Texture, Material, Mesh, Entity, Ground, Player, PlayerSpeed.f
Global Miror_Mesh, Miror, CubeMap, CubeMap_Material


Window = OpenWindow(#PB_Any,0,0,1024,768,"Mon beau miroir")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

Add3DArchive("Data/scripts/materials", #PB_3DArchive_FileSystem)
Add3DArchive("Data/skybox/morning.zip", #PB_3DArchive_Zip)
Parse3DScripts()

;
; Activation Physics et Collisions (A mon avis ça ne sert à rien)
EnableWorldPhysics(#True) 
EnableWorldCollisions(#True)

;
; Ambiance
SkyBox("morning.jpg")
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))

;
; Materiel (texture) qui servira pour le sol et le cube
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(0, 0, 0))
Box(1,1,252,252,RGB(255, 216, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))
MaterialFilteringMode(Material, #PB_Material_Anisotropic, 6) ;Meilleurs rendu de la texture

;
; Sol
Mesh = CreatePlane(#PB_Any, 50, 50, 1, 1, 6, 6)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
EntityPhysicBody(Entity, #PB_Entity_StaticBody, 0,0,1)

;
; Player
Mesh = CreateCube (#PB_Any, 1)
Player = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0, 0.5, 0)
EntityPhysicBody(Player, #PB_Entity_BoxBody, 1, 0.1, 0.2)


; Miroir
Mesh = CreateCube(#PB_Any, 1) ;Support du miroir
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0,1.5,10.10)
ScaleEntity(Entity, 4.25,3.25,0.10)

Mesh = CreatePlane(#PB_Any, 4, 3, 1, 1, 1, 1) ;Miroir
Material = GetScriptMaterial(#PB_Any, "CubeMapMaterial")
CubeMap =  CreateCubeMapTexture(#PB_Any, 512,512, "CubeMapTexture") ;Une texture cube map refléchit le milieu qui l'entoure

Miror = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0, 1.55, 10)
EntityCubeMapTexture(CubeMap, Miror) ;Applique la texture cube map à l'entité. 
EntityPhysicBody(Miror, #PB_Entity_StaticBody)
RotateEntity(Miror, -90, 0, 0)


Repeat
  Event = WindowEvent()
  
  If ExamineKeyboard()
    
    ;Sortie du jeu
    If KeyboardPushed (#PB_Key_Escape)
     Break
    EndIf
       
    ;En avant ou en arriére
    If KeyboardPushed (#PB_Key_Up)
      PlayerSpeed = 4
    ElseIf KeyboardPushed (#PB_Key_Down)
      PlayerSpeed = - 4
    Else
      PlayerSpeed = 0
    EndIf
    
    ;A gauche ou à droite
    If KeyboardPushed (#PB_Key_Left)
      RotateEntity(Player, 0, 1.5, 0, #PB_Relative)
    ElseIf KeyboardPushed (#PB_Key_Right)
      RotateEntity(Player, 0, -1.5, 0, #PB_Relative)
    EndIf
       
    
    If PlayerSpeed <>0
      DisableEntityBody(Player, #False) ; Pour réveiller le player qui parfois reste bloquer
      MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
    EndIf 
    
    ; Caméra suiveuse (PB 5.20)
    CameraFollow(Camera, EntityID(Player), -180, 1.5, 5, 0.05, 0.05)   
    
  EndIf
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld(40)
  FlipBuffers()  
ForEver
CubeMap.Material

Code : Tout sélectionner

material CubeMapMaterial
{
  technique
  {
  	pass
  	{
		ambient 1.0 1.0 1.0
        diffuse 2.0 2.0 2.0
        specular 1.0 1.0 1.0 9800.0
		
        texture_unit
        {
			cubic_texture CubeMapTexture combinedUVW
		    tex_address_mode clamp
			env_map cubic_reflection
        }
	}
  }
}

Re: Effet miroir

Publié : ven. 09/août/2013 17:23
par G-Rom
un cube map ne peu pas être utilisé comme un mirroir , un cube map créer 6 camera en interne avec un fov de 90° , la position des cameras est relative au mesh auquel l'effet est appliqué , dans le cas d'un plan , ça ne marchera pas bien , l'effet est prévu pour simuler des reflets sur des formes plus complexe , sphère par exemple.
je pense qu'il faudrais le faire avec une camera & un RTT ( render to texture ) , tu réfléchis la caméra sur l'axe de ton plan , tu rends la reflection dans la rtt & tu as ton mirroir.

Re: Effet miroir

Publié : ven. 09/août/2013 17:32
par falsam
Merci G-Rom.
je pense qu'il faudrais le faire avec une camera & un RTT ( render to texture ) , tu réfléchis la caméra sur l'axe de ton plan , tu rends la reflection dans la rtt & tu as ton mirroir.
Bon .... et bien je vais tacher de démêler cette réflexion :)

Re: Effet miroir

Publié : ven. 09/août/2013 18:27
par falsam
G-Rom ayant donner quelques conseils, je vous donne un premier jet d'un code presque adéquate car, vous allez le voir, la réflexion de l'image du cube super sur le miroir n'est pas symétrique.

Code : Tout sélectionner

; Naissance d'un cube : Suis je beau en ce miroir

EnableExplicit

InitEngine3D()
InitKeyboard()
InitSprite()

Global Window, Event
Global Camera, CameraMiror

Global Texture, Material, Mesh, Entity, Ground, Player, PlayerSpeed.f
Global Miror_Mesh, Miror, CubeMap, CubeMap_Material


Window = OpenWindow(#PB_Any,0,0,1024,768,"Mon beau miroir")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

Add3DArchive("Data/skybox/morning.zip", #PB_3DArchive_Zip)

;
; Activation Physics et Collisions (A mon avis ça ne sert à rien)
EnableWorldPhysics(#True) 
EnableWorldCollisions(#True)

;
; Ambiance
SkyBox("morning.jpg")
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Camera 
Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
CameraBackColor(Camera, RGB(145, 182, 201))

;
; Materiel (texture) qui servira pour le sol et le cube
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(0, 0, 0))
Box(1,1,252,252,RGB(255, 216, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))
MaterialFilteringMode(Material, #PB_Material_Anisotropic, 6) ;Meilleurs rendu de la texture

;
; Sol
Mesh = CreatePlane(#PB_Any, 50, 50, 1, 1, 6, 6)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
EntityPhysicBody(Entity, #PB_Entity_StaticBody, 0,0,1)

;
; Player
Mesh = CreateCube (#PB_Any, 1)
Player = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0, 0.5, 0)
EntityPhysicBody(Player, #PB_Entity_BoxBody, 1, 0.1, 0.2)

; Miroir 
CameraMiror = CreateCamera(#PB_Any, 0, 0, 1, 1) ;Caméra du miroir
MoveCamera(CameraMiror, 0, 1.5, 13) ;Caméra en retrait derriere le miroir
CameraFOV(CameraMiror, 55) ;Champs de vision de la caméra en degrés (FOV: Field Of Vision)
;CameraLookAt(CameraMiror,  0, 1.5, 10)
Texture = CreateRenderTexture(#PB_Any, CameraID(CameraMiror), 800, 600, #PB_Texture_AutomaticUpdate) ;TextureRTT (Render to texture)
Material = CreateMaterial(#PB_Any, TextureID(Texture))
SetMaterialColor(material, #PB_Material_SelfIlluminationColor, RGB(255, 255, 255))

Mesh = CreatePlane(#PB_Any, 4, 3, 1, 1, 1, 1) ;Support de l'image
Miror = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0, 1.55, 10)
EntityPhysicBody(Miror, #PB_Entity_StaticBody)
RotateEntity(Miror, -90, 0, 0)

Repeat
  Event = WindowEvent()
  
  If ExamineKeyboard()
    
    ;Sortie du jeu
    If KeyboardPushed (#PB_Key_Escape)
     Break
    EndIf
       
    ;En avant ou en arriére
    If KeyboardPushed (#PB_Key_Up)
      PlayerSpeed = 4
    ElseIf KeyboardPushed (#PB_Key_Down)
      PlayerSpeed = - 4
    Else
      PlayerSpeed = 0
    EndIf
    
    ;A gauche ou à droite
    If KeyboardPushed (#PB_Key_Left)
      RotateEntity(Player, 0, 1.5, 0, #PB_Relative)
    ElseIf KeyboardPushed (#PB_Key_Right)
      RotateEntity(Player, 0, -1.5, 0, #PB_Relative)
    EndIf
       
    
    If PlayerSpeed <>0
      DisableEntityBody(Player, #False) ; Pour réveiller le player qui parfois reste bloquer
      MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
    EndIf 
    
    ; Caméra suiveuse (PB 5.20)
    CameraFollow(Camera, EntityID(Player), -180, 1.5, 5, 0.05, 0.05)   
    
  EndIf
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld(40)
  FlipBuffers()  
ForEver

Re: Effet miroir

Publié : ven. 09/août/2013 20:06
par G-Rom
tu dois replacer ta "camera miroir" , elle doit être symétrique au plan du mirroir.

Re: Effet miroir

Publié : ven. 09/août/2013 20:37
par graph100
comment ça se passe si ya des objets derrière le miroir (ex : miroir contre un mur) ? cad entre la caméra et son plan focal ?
ils apparaissent dans le champ ou pas ?

Re: Effet miroir

Publié : ven. 09/août/2013 21:12
par G-Rom
Pour faire compliqué , il faut effectivement trier ce que l'on voit ou pas. et prendre en compte aussi la direction de la camera mirroir.
C'est compliqué un mirroir ^^