Mirror Experience
Publié : lun. 22/déc./2014 1:57
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. Utilisez les flèches pour vous déplacer et pivoter. F1 F2 & F3 pour quelques animations et Esc pour quitter
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