
en fouinant sur le site j'ai vu que je suis pas le premier a me casser les dents sur la réflexion
point de vue géométrie c'est pourtant simple:
créer une camera "miroir" symétrique à la camera principale par rapport au plan de reflexion
et plaquer la texture (venant de CreateRenderTexture de la camera miroir) (inversé) sur le mesh
le problème c'est qu'il faut faire un plaquage 2D tout bête et la je vois pas comment m'y prendre
j'ai pallier à ce problème "segmentant" le mesh du miroir et en mettant à jour les coordonnées UV
ça fait un effet un peu crado si on regarde le miroir de façon "rasante"
ça s’atténue en augmentant le nombre de facette
mais c'est vexant de faire tous ce ça alors qu'y des matières dans les scriptes Ogres qui font ce genre de truc tres bien
genre "SphereMap/SphereMappedRustySteel"
ou la fonction EntityCubeMapTexture qui fait bien plus balaise
je sais pas si vous comprendrez quelque chose à mes explications un peu rapides
j'ai fait 2 fonctions, une pour un miroir limité et l'autre pour un miroir illimité (pour faire le reflet sur un lac)
(la première présente un défaut sur les bords à cause de CameraDirection qui retourne -1 quand on sort de l'écran)
Code : Tout sélectionner
;reflexion - Pf shadoko - 2015
EnableExplicit
Global.w ex,ey,dx,dx1,dy,dy1,nb,typemiroir=1
Global Dim e(19)
Procedure.f POM(v.f)
ProcedureReturn (Random(v*1000)-v*500)/500
EndProcedure
Procedure limite(V, i, s)
If V < i :ProcedureReturn i:EndIf
If V > s :ProcedureReturn s:EndIf
ProcedureReturn V
EndProcedure
Procedure scene()
Protected i,j,k,c,x,y,dx=8,dy=8
Protected nbs=8,nbf=6
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/desert.zip", #PB_3DArchive_Zip)
Parse3DScripts()
;######################################## cameras
;principale
CreateCamera(0, 0, 0, 100, 100):MoveCamera(0, 2000, 500, 0, #PB_Absolute):CameraLookAt(0, 0, 100, 0):CameraBackColor(0, $ff4444)
;miroir
CreateCamera(1, 0, 0,50,50):CameraBackColor(1, $ff4444)
SkyBox("desert07.jpg")
CreateLight(0,$ffffff, 10000, 10000, 5000)
AmbientColor($222222)
;######################################## textures
CreateTexture(0,512,512)
StartDrawing(TextureOutput(0))
For i=0 To 1000
Line(Random(511),0,1,511,RGB(255,Random(255),128))
Line(0,Random(511),511,1,RGB(Random(255),255,0))
Next
StopDrawing()
CreateTexture(1,512,512)
StartDrawing(TextureOutput(1))
For i=0 To 1000
Line(Random(511),0,1,511,RGB(128,255,Random(255)))
Line(0,Random(511),511,1,RGB(0,128,Random(255)))
Next
StopDrawing()
CreateRenderTexture(10,CameraID(1),ex,ey)
;######################################## material
CreateMaterial(0, TextureID(0))
CreateMaterial(1, TextureID(1))
CreateMaterial(10, TextureID(10)):SetMaterialColor(10,#PB_Material_AmbientColor,$ff0000)
;######################################## mesh
CreateSphere(0,64)
CreatePlane(1,2000,2000,16,16,1,1)
CreateSphere(3,128)
;######################################## entity
Define h.f
CreateEntity(1, MeshID(1), MaterialID(10),0,0,0,1)
For i=0 To 19:e(i)=CreateEntity(-1, MeshID(0), MaterialID(0),0,0,0,1):Next
For i=1 To 40
h=1+pom(0.5)
c= CreateEntity(-1, MeshID(3), MaterialID(1),pom(2000),128*h,pom(2000),1)
ScaleEntity(c,1+pom(0.5),h,1+pom(0.5))
Next
EndProcedure
Procedure rendermirror1(mesh,camP,camM)
Protected i,j,c,cy1,cy2,px,py,r
Protected.f x,y,z,xp,yp,zp,xd,yd,zd,d
Protected Dim T.PB_MeshVertex(0)
xp=CameraX(camP):xd=CameraDirectionX(camP)
yp=CameraY(camP):yd=CameraDirectionY(camP)
zp=CameraZ(camP):zd=CameraDirectionZ(camP)
CameraDirection(camM,xd,-yd,zd)
MoveCamera(camM,xp,-yp,zp,#PB_Absolute)
r=yp*500
cy1=limite(CameraProjectionY(camP,xp+xd*r,0,zp+zd*r),0,ey-1)
GetMeshData(mesh,0,t(),#PB_Mesh_Vertex|#PB_Mesh_UVCoordinate,0,MeshVertexCount(mesh)-1):c=-1
For j=0 To 16 :py=cy1+j*(ey-1-cy1)/16
For i=16 To 0 Step -1:px=i*(ex-1)/16
PointPick(camP,px,py):x=PickX():y=PickY():z=PickZ()
d=-yp/y
c+1
With t(c)
\u=px/ex
\v=1-py/ey
\x=x*d+xp
\y=y*d+yp
\z=z*d+zp
EndWith
Next
Next
SetMeshData(mesh,0,t(),#PB_Mesh_Vertex|#PB_Mesh_UVCoordinate,0,MeshVertexCount(mesh)-1)
EndProcedure
Procedure rendermirror2(mesh,camP,camM)
Protected c,n,mx,my
Protected.f xp,yp,zp,xd,yd,zd
Protected Dim T.PB_MeshVertex(0)
xp=CameraX(camP):xd=CameraDirectionX(camP)
yp=CameraY(camP):yd=CameraDirectionY(camP)
zp=CameraZ(camP):zd=CameraDirectionZ(camP)
CameraDirection(camM,xd,-yd,zd)
MoveCamera(camM,xp,-yp,zp,#PB_Absolute)
mx=ex ;CameraViewWidth (camM) ;marche pas,
my=ey ;CameraViewHeight(camM) ;pas compris !
n=MeshVertexCount(mesh)-1
GetMeshData(mesh,0,t(),#PB_Mesh_Vertex|#PB_Mesh_UVCoordinate ,0,n)
For c=0 To n
With t(c)
\u= CameraProjectionX(1,\x, 0,\z)/mx
\v= CameraProjectionY(1,\x, 0,\z)/my
EndWith
Next
SetMeshData(mesh,0,t(),#PB_Mesh_Vertex|#PB_Mesh_UVCoordinate,0,MeshVertexCount(mesh)-1)
EndProcedure
Define.f KeyX, KeyY,keyz, MouseX, MouseY,time,v,a,x,y,z,r.l
Define i,j,c,px,py,p
InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
OpenWindow(0, 0, 0, 0,0, "reflexion",#PB_Window_Maximize)
ex=WindowWidth (0,#PB_Window_InnerCoordinate)
ey=WindowHeight(0,#PB_Window_InnerCoordinate)
OpenWindowedScreen(WindowID(0), 0, 0, ex, ey, 0, 0, 0)
Macro DT(t1,t2)
DrawText(4,p,t1)
DrawText(60,p,t2)
p+16
EndMacro
CreateSprite(0,120,170,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(0))
DrawingMode(#PB_2DDrawing_AlphaClip|#PB_2DDrawing_Outlined )
Box(0,0,120,170)
BackColor($0000ff)
dt("Déplacements:","")
dt("[Left]","")
dt("[Right]","")
dt("[Up]","")
dt("[Down]","")
dt("Mouse+wheel","")
dt("","")
dt("Commandes:","")
dt("[F1]","Limité")
dt("[F2]","Ilimité")
StopDrawing()
scene()
Repeat
For i=0 To 19:MoveEntity(e(i),Cos(Radian(time+18*i))*400,64+Abs(Cos(Radian(i*36+time*10)))*100,Sin(Radian(time+18*i))*400,#PB_Absolute):RotateEntity(e(i),time+i*20,time+i*20,time+i*20):Next
WindowEvent()
ExamineMouse()
MouseX = -MouseDeltaX() * 0.05
MouseY = -MouseDeltaY() * 0.05
ExamineKeyboard()
keyx=(-Bool(KeyboardPushed(#PB_Key_Left)<>0)+Bool(KeyboardPushed(#PB_Key_Right)<>0))*4
keyz=(-Bool(KeyboardPushed(#PB_Key_Down)<>0)+Bool(KeyboardPushed(#PB_Key_Up )<>0))*4+MouseWheel()*50
RotateCamera(0, MouseY, MouseX, 0, #PB_Relative):MoveCamera (0, KeyX, keyy, -keyz)
If KeyboardPushed(#PB_Key_F1):CreatePlane(1,2000,2000,16,16,1,1):CreateEntity(1, MeshID(1), MaterialID(10),0,0,0,1):typemiroir=1:EndIf
If KeyboardPushed(#PB_Key_F2):CreatePlane(1,2000,2000,16,16,1,1):CreateEntity(1, MeshID(1), MaterialID(10),0,0,0,1):typemiroir=2:EndIf
Select typemiroir
Case 1:rendermirror1(1,0,1)
Case 2:rendermirror2(1,0,1)
EndSelect
time+RenderWorld()/200
DisplayTransparentSprite(0, 8,8,128)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End