Effet miroir
Publié : jeu. 16/févr./2023 12:02
C'est un essai de reflection de l'environnement 3D.
Testé avec PB 5.73 et PB 6.0
■ Objectif: Création d'un sol miroir sur lequel se projette le ciel, un cube et une sphére.
■ Comment ca fonctionne ?
Une caméra principale.
Ajout d'une caméra miroir.
- Création d'une texture qui sera le reflet de la caméra miroir.
- Création d'une matière (Material) basée sur cette texture de projection.
- Active la texturation projective en spécifiant la camera miroir à utiliser.
Le reflet final se projetant sur le sol, on ajoute la matière du sol à la matière précédente.
La mise à jour du rendu se fera dans la boucle de rendering de votre code.
■ Code commenté. Escape ou bouton milieu de la souris pour quitter
25 Février 2023 - Ouverture full screen.
Testé avec PB 5.73 et PB 6.0
■ Objectif: Création d'un sol miroir sur lequel se projette le ciel, un cube et une sphére.
■ Comment ca fonctionne ?
Une caméra principale.

- Création d'une texture qui sera le reflet de la caméra miroir.
- Création d'une matière (Material) basée sur cette texture de projection.
- Active la texturation projective en spécifiant la camera miroir à utiliser.


■ Code commenté. Escape ou bouton milieu de la souris pour quitter
Code : Tout sélectionner
; Effet miroir
;
; PureBasic 5.73, 6.0
EnableExplicit
; Caméras
Define Camera, CameraMirror, CameraTexture, Rot.f
; Entités
Define Mesh, Material, Ground, Sphere, Cube
; DeltaTime
Global dt.f
; Initialisatio environnement 3D
ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "Effet mirroir")
; Localisation des assets
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/desert.zip", #PB_3DArchive_Zip)
; Un peu de lumiere
CreateLight(#PB_Any, RGB(255, 255, 255), 10, 10, 10)
SkyBox("desert07.jpg")
; Camera principale
Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
; Camera mirroir
CameraMirror = CreateCamera(#PB_Any, 0, 0, 100,100)
; Texture associé à la camera mirroir qui sera plaquée sur le sol
CameraTexture = CreateRenderTexture(#PB_Any, CameraID(CameraMirror), 512, 512, #PB_Texture_AutomaticUpdate)
; Création du material basé sur la texture caméra
Material = CreateMaterial(#PB_Any, TextureID(CameraTexture))
; Active la texturation projective en spécifiant la camera à utiliser.
SetMaterialAttribute(Material, #PB_Material_ProjectiveTexturing, CameraMirror)
; Ajoute une nouvelle couche à notre material
AddMaterialLayer(Material,TextureID(LoadTexture(#PB_Any, "MRAMOR6X6.jpg")), #PB_Material_Modulate)
; Création des différents entités (Sol, Sphere, Cube)
Mesh = CreatePlane(#PB_Any, 100, 100, 1, 1, 4, 4)
Ground = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
Mesh = CreateSphere(#PB_Any, 5)
Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "RustySteel.jpg")))
Sphere = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
MoveEntity(Sphere, -10, 5, 0)
Mesh = CreateCube(#PB_Any, 6)
Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))
Cube = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
MoveEntity(Cube, 10, 5, 0)
; Boucle 3D
Repeat
ExamineKeyboard()
ExamineMouse()
; Rotation des entités
RotateEntity(Sphere, 20*dt, 20*dt, 20*dt, #PB_Relative)
RotateEntity(Cube, 20*dt, 20*dt, 20*dt, #PB_Relative)
; Rotation de la camera principale
Rot + 0.3*dt
MoveCamera(Camera, Cos(Rot)*50, 15, Sin(Rot)*50, #PB_Absolute)
CameraLookAt(Camera, 0, 0, 0)
; Affichage de la camera miroir sur le sol
CameraReflection(CameraMirror, Camera, EntityID(Ground))
; Rendering
dt = RenderWorld()/1000
FlipBuffers()
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)