Page 1 sur 1

Mirror Experience

Publié : lun. 22/déc./2014 1:57
par falsam
La solution est de créer une seconde camera et d'utiliser la fonction CreateRenderTexture() afin d'obtenir le rendu de cette caméra dans une texture qui sera afficher sur la face cachée d'un plan.

Code : Tout sélectionner

EnableExplicit

InitEngine3D()
InitKeyboard()
InitSprite()
;InitMouse()

Global Window, Event
Global Camera, CameraMirror, Animation.s
Global Texture, Material, Entity, Player, PlayerSpeed.f, CameraSpeed = 30, Mirror

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

Add3DArchive(#PB_Compiler_Home + "Examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/desert.zip", #PB_3DArchive_Zip)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/Sinbad.zip", #PB_3DArchive_Zip)
Parse3DScripts()

;Ambiance
SkyBox("desert07.jpg")
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -10, 100, -500)
WorldShadows(#PB_Shadow_Additive)

;Camera 
Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)

;Ground
Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "Dirt.jpg")))
Entity = CreateEntity(#PB_Any, MeshID(CreatePlane(#PB_Any, 5000, 5000, 100, 100, 400, 400)), MaterialID(Material))
CreateEntityBody(Entity, #PB_Entity_PlaneBody, 1,1,1)
Fog(RGB(139, 69, 19), 20, 40, 200)

;Player
Player = CreateEntity(#PB_Any, MeshID(LoadMesh(#PB_Any, "Sinbad.mesh")), #PB_Material_None, 0, 5, -25)
CreateEntityBody(Player, #PB_Entity_ConvexHullBody, 1, 0, 1)
EntityAngularFactor(Player, 0, 1, 0)

;Mirror - Camera 
CameraMirror = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(CameraMirror, 0, 4, 0, #PB_Absolute)
CameraLookAt(CameraMirror,  EntityX(Player), EntityY(Player), EntityZ(Player))
CameraFOV(CameraMirror, 95) 

;Mirror - Background 
Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "Wood.jpg")))
Entity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 1)), MaterialID(Material), 0, 5, 0.7)
ScaleEntity(Entity, 10, 10, 1)

;Mirror - Texture & Material 
Texture = CreateRenderTexture(#PB_Any, CameraID(CameraMirror), 1024, 768, #PB_Texture_AutomaticUpdate)
Material = CreateMaterial(#PB_Any, TextureID(Texture))
SetMaterialColor(Material, #PB_Material_SelfIlluminationColor, RGB(255, 255, 255))
MaterialCullingMode(Material, #PB_Material_NoCulling)

;Mirror - Entity
Mirror = CreateEntity(#PB_Any, MeshID(CreatePlane(#PB_Any, 8, 8, 1, 1, 1, 1)), MaterialID(Material), 0, 5, 0)
CreateEntityBody(Mirror, #PB_Entity_StaticBody)
RotateEntity(Mirror, -90, 180, 0)

Repeat
  Repeat   
    Event  = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End
        
    EndSelect
  Until Event = 0
      
  If ExamineKeyboard()
    
    If KeyboardPushed (#PB_Key_Escape)
     Break
    EndIf
    
    Animation = "IdleBase"
    
    If KeyboardPushed(#PB_Key_F1)
      Animation = "SliceVertical"
    EndIf
    
    If KeyboardPushed(#PB_Key_F2)
      Animation = "SliceHorizontal"
    EndIf
    
    If KeyboardPushed(#PB_Key_F3)
      Animation = "Dance"
    EndIf
    
    If KeyboardPushed (#PB_Key_Up)
      PlayerSpeed = 8
      Animation = "IdleBase"
      
    ElseIf KeyboardPushed (#PB_Key_Down)
      PlayerSpeed = -8
      Animation = "IdleBase"
    Else
      PlayerSpeed = 0
    EndIf
    
    If KeyboardPushed (#PB_Key_Left)
      RotateEntity(Player, 0, 3, 0, #PB_Relative)
    ElseIf KeyboardPushed (#PB_Key_Right)
      RotateEntity(Player, 0, -3, 0, #PB_Relative)
    EndIf    
    
    If PlayerSpeed <> 0 
      DisableEntityBody(Player, #False) ; Wake up entity (BugWare)
      MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
      
      If EntityAnimationStatus(Player, "RunBase") = #PB_EntityAnimation_Stopped
        StartEntityAnimation(Player, "RunBase")
      EndIf
    Else
      If EntityAnimationStatus(Player, Animation) = #PB_EntityAnimation_Stopped
        StartEntityAnimation(Player, Animation)
      EndIf
    EndIf 
    
    CameraFollow(Camera, EntityID(PLayer), -180, EntityY(Player)+3, 15, 0.5, 0.5, #True)
  EndIf
  
  RenderWorld(50)
  FlipBuffers()  
ForEver
Utilisez les flèches pour vous déplacer et pivoter. F1 F2 & F3 pour quelques animations et Esc pour quitter

Re: Se voir dans un miroir

Publié : lun. 22/déc./2014 10:19
par klystron
Bonjour Falsam,
super ton code.

bonne journée.

Re: Se voir dans un miroir

Publié : lun. 22/déc./2014 10:26
par kelebrindae
Hé, hé! Marrant, cet exemple; s'il y avait des animations pour que le perso puisse faire des pitreries devant le miroir, je crois que j'y passerais des heures... :wink:

As tu essayé de placer un second miroir en face du premier, pour voir si ça explose?

Re: Se voir dans un miroir

Publié : lun. 22/déc./2014 11:01
par klystron
ha oui tiens ... dans un monde parallèle 8O

Re: Se voir dans un miroir

Publié : lun. 22/déc./2014 13:52
par falsam
kelebrindae et klystron merci pour vos commentaires.
kelebrindae a écrit :s'il y avait des animations pour que le perso puisse faire des pitreries devant le miroir, je crois que j'y passerais des heures.
Tu ne passeras peut-être pas quelques heures mais j'ai ajouté 3 animations accessibles depuis les touches F1, F2 et F3. Ces animations sont issus des exemples de Pure Basic.

Re: Se voir dans un miroir

Publié : lun. 22/déc./2014 14:14
par klystron
oui super.
bonne apres-midi Falsam.

Re: Se voir dans un miroir

Publié : lun. 22/déc./2014 15:11
par kelebrindae
Ah ben non, tiens; ça n'explose pas... (presque déçu :( )

Code : Tout sélectionner

EnableExplicit

InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()

Global Window, Event
Global Camera, CameraMirror, CameraMirror2
Global Animation.s
Global Texture, Material, Entity, Mirror
Global Texture2, Material2, Entity2, Mirror2
Global Player, PlayerSpeed.f, CameraSpeed = 30, materialBg

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

Add3DArchive(#PB_Compiler_Home + "Examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/desert.zip", #PB_3DArchive_Zip)
Add3DArchive(#PB_Compiler_Home+"Examples/3D/Data/Packs/Sinbad.zip", #PB_3DArchive_Zip)
Parse3DScripts()

;Ambiance
SkyBox("desert07.jpg")
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -10, 100, -500)
WorldShadows(#PB_Shadow_Additive)

;Camera
Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
;MoveCamera(Camera,10,0,0)

;Ground
Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "Dirt.jpg")))
Entity = CreateEntity(#PB_Any, MeshID(CreatePlane(#PB_Any, 5000, 5000, 100, 100, 400, 400)), MaterialID(Material))
EntityPhysicBody(Entity, #PB_Entity_StaticBody, 0,0,1)
Fog(RGB(139, 69, 19), 20, 40, 200)

;Player
Player = CreateEntity(#PB_Any, MeshID(LoadMesh(#PB_Any, "Sinbad.mesh")), #PB_Material_None, 0, 5, -10)
EntityPhysicBody(Player, #PB_Entity_CylinderBody, 1, 1, 1)

;Mirror - Camera
CameraMirror = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(CameraMirror, 0, 4, 0, #PB_Absolute)
CameraLookAt(CameraMirror,  EntityX(Player), EntityY(Player), EntityZ(Player))
;CameraFOV(CameraMirror, 95)

;Mirror - Background
MaterialBg = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "Wood.jpg")))
Entity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 1)), MaterialID(MaterialBg), 0, 5, 0.7)
ScaleEntity(Entity, 10, 10, 1)

;Mirror - Texture & Material
Texture = CreateRenderTexture(#PB_Any, CameraID(CameraMirror), 1024, 768, #PB_Texture_AutomaticUpdate)
Material = CreateMaterial(#PB_Any, TextureID(Texture))
SetMaterialColor(Material, #PB_Material_SelfIlluminationColor, RGB(255, 255, 255))
MaterialCullingMode(Material, #PB_Material_NoCulling)

;Mirror - Entity
Mirror = CreateEntity(#PB_Any, MeshID(CreatePlane(#PB_Any, 8, 8, 1, 1, 1, 1)), MaterialID(Material), 0, 5, 0)
EntityPhysicBody(Mirror, #PB_Entity_StaticBody)
RotateEntity(Mirror, -90, 180, 0)


;Mirror2 - Camera
CameraMirror2 = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(CameraMirror2, 0, 4, -20, #PB_Absolute)
CameraLookAt(CameraMirror2,  EntityX(Player), EntityY(Player), EntityZ(Player))
;CameraFOV(CameraMirror2, 95)

;Mirror2 - Background
Entity2 = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 1)), MaterialID(MaterialBg), 0, 5, -20 - 0.7)
ScaleEntity(Entity2, 10, 10, 1)

;Mirror2 - Texture & Material
Texture2 = CreateRenderTexture(#PB_Any, CameraID(CameraMirror2), 1024, 768, #PB_Texture_AutomaticUpdate)
Material2 = CreateMaterial(#PB_Any, TextureID(Texture2))
SetMaterialColor(Material2, #PB_Material_SelfIlluminationColor, RGB(255, 255, 255))
MaterialCullingMode(Material2, #PB_Material_NoCulling)

;Mirror2 - Entity
Mirror2 = CreateEntity(#PB_Any, MeshID(CreatePlane(#PB_Any, 8, 8, 1, 1, 1, 1)), MaterialID(Material2), 0, 5, -20)
EntityPhysicBody(Mirror2, #PB_Entity_StaticBody)
RotateEntity(Mirror2, -90, 180, 0)

Repeat
  Repeat   
    Event  = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End
       
    EndSelect
  Until Event = 0
     
  If ExamineKeyboard()
   
    If KeyboardPushed (#PB_Key_Escape)
     Break
    EndIf
   
    Animation = "IdleBase"
   
    If KeyboardPushed(#PB_Key_F1)
      Animation = "SliceVertical"
    EndIf
   
    If KeyboardPushed(#PB_Key_F2)
      Animation = "SliceHorizontal"
    EndIf
   
    If KeyboardPushed(#PB_Key_F3)
      Animation = "Dance"
    EndIf
       
   
    If KeyboardPushed (#PB_Key_Up)
      PlayerSpeed = 5
      Animation = "IdleBase"
     
    ElseIf KeyboardPushed (#PB_Key_Down)
      PlayerSpeed = -5
      Animation = "IdleBase"
    Else
      PlayerSpeed = 0
    EndIf
   
    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) ; Wake up entity (BugWare)
      MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
     
      If EntityAnimationStatus(Player, "RunBase") = #PB_EntityAnimation_Stopped
        StartEntityAnimation(Player, "RunBase")
      EndIf
    Else
      If EntityAnimationStatus(Player, Animation) = #PB_EntityAnimation_Stopped
        StartEntityAnimation(Player, Animation)
      EndIf
    EndIf
   
    CameraFollow(Camera, EntityID(Player), 0, EntityY(Player)+0.5, -15, 0.5, 0.5, #True)   
   
  EndIf
 
  RenderWorld(40)
  FlipBuffers() 
ForEver

Re: Se voir dans un miroir

Publié : lun. 22/déc./2014 15:32
par falsam
Merci kelebrindae:)

Un labyrinthe avec plein de miroirs ? :mrgreen:

Re: Mirror Experience

Publié : mer. 24/déc./2014 20:47
par graph100
ya un piti problème avec vos miroirs :lol:

Surtout celui qu'a ajouté Kelebrindae : il ne montre pas le personnage du bon coté.
Et le 'miroir' n'a pas les propriétés d'un miroir.

Re: Mirror Experience

Publié : mar. 28/mars/2017 17:24
par falsam
Modification du code pour être en conformité avec PureBasic 5.60.

Re: Mirror Experience

Publié : ven. 31/mars/2017 20:34
par venom
Bonjour,

Mince chez moi le compilateur plante des l'ouverture de la fenêtre. 8O :(
Sa doit être mon ordi en carton :lol:






@++

Re: Mirror Experience

Publié : ven. 31/mars/2017 22:23
par Shadow
Sympa tous ça :D

Re: Mirror Experience

Publié : ven. 31/mars/2017 22:56
par SPH
Dans les 2 codes, erreur de engine3D.dll avec mon ordi portable qui date de 5 ans. :oops:

Re: Mirror Experience

Publié : ven. 31/mars/2017 23:05
par falsam
venom a écrit :Mince chez moi le compilateur plante des l'ouverture de la fenêtre.
Si tu es sous windows7 il est possible que DirectX9c ne soit pas installer. Dans ce cas il faut soit installer DirectX9c ou bien compiler avec la librairie OpenGL.
:idea: menu Compiler => option compilation => Library SubSystem : OpenGL

Re: Mirror Experience

Publié : sam. 01/avr./2017 9:15
par Mindphazer
Impressionnant 8O
Ca marche nickel sur mon Mac :wink:

Merci Falsam