Effet miroir

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Effet miroir

Message 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
        }
	}
  }
}
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Effet miroir

Message 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.
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Effet miroir

Message 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 :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Effet miroir

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Effet miroir

Message par G-Rom »

tu dois replacer ta "camera miroir" , elle doit être symétrique au plan du mirroir.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Effet miroir

Message 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 ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Effet miroir

Message 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 ^^
Répondre