image en perspective
Publié : mar. 11/sept./2007 13:08
Bonjour,
je voudrais pouvoir transformer une image 2D en image en perspective (un peu comme une page ouverte).
J'ai bidouillé le code suivant (avec des sprites 3D) mais j'ai 2 problèmes :
1) le sprite 3D étant géré comme 2 triangles, la mise en perspective n'est pas bonne... (ça marchait avec l'image de l'exemple initial mais j'ai dû... trop bidouiller
)
2) dans le code suivant, je n'arrive même pas à avoir une image (on dirait que j'ai une zone mémoire quelquonque).
Quelqu'un peut-il m'aider ? dois-je essayer de plaquer mon image sur un véritable objet 3D ?
je ne maitrise pas du tout la 3D
Merci d'avance !
je voudrais pouvoir transformer une image 2D en image en perspective (un peu comme une page ouverte).
J'ai bidouillé le code suivant (avec des sprites 3D) mais j'ai 2 problèmes :
1) le sprite 3D étant géré comme 2 triangles, la mise en perspective n'est pas bonne... (ça marchait avec l'image de l'exemple initial mais j'ai dû... trop bidouiller

2) dans le code suivant, je n'arrive même pas à avoir une image (on dirait que j'ai une zone mémoire quelquonque).
Quelqu'un peut-il m'aider ? dois-je essayer de plaquer mon image sur un véritable objet 3D ?
je ne maitrise pas du tout la 3D



Merci d'avance !
Code : Tout sélectionner
;
; ------------------------------------------------------------
;
; PureBasic - Sprite example file
;
; (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;
#image = 0
#img_ori = 1
#spri = 2
Resultat = GetClipboardImage(#Img_ori)
If Resultat = 0
Fichier$ = OpenFileRequester("Choisissez une image à mettre en perpective", "", "Images |*.jpg;*.bmp;*.png", 0)
If fichier$ =""
End
EndIf
EndIf
UseJPEGImageDecoder()
UsePNGImageDecoder()
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Error", "Can't open DirectX 7 Or later", 0)
End
EndIf
If InitSprite3D() = 0
MessageRequester("Error", "Direct3D system can't be initialized correctly", 0)
End
EndIf
;
; Now, open a 16 bits (65000 colours) screen
;
Xscreen = 1024
Yscreen = 768
If OpenScreen(Xscreen, Yscreen, 32, "Sprite")
; Load our 16 bit sprite (which is a 24 bit picture in fact, as BMP doesn't support 16 bit format)
;
FlipBuffers()
ClearScreen(RGB(cr,cv,cb))
StartDrawing(ScreenOutput())
; If resultat = 0
LoadImage(#img_ori, Fichier$)
DrawImage(#img_ori,0,0)
; Else
; DrawImage(#img_ori,0,0,Xscreen,Yscreen)
; EndIf
Circle(Xscreen/2, Yscreen/2, 100, RGB(255,0,0))
DrawText(10,50,Fichier$,RGB(0,255,0),RGB(0,0,0))
StopDrawing()
FlipBuffers()
Delay(2000)
Re = GrabSprite(#spri,0,0,Xscreen, Xscreen,#PB_Sprite_Texture)
; LoadSprite(#image, Fichier$, #PB_Sprite_Texture)
CreateSprite3D(#image, #spri)
Sprite3DQuality(1)
res = InitMouse()
cr = 255
cv = 255
cb = 255
side = 0 ; 0: Gauche, 1: droite
brelease = 0
Repeat
; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
FlipBuffers()
ClearScreen(RGB(cr,cv,cb))
; Draw our sprite
;
If Start3D()
; Traitement des paramètres SOURIS
ExamineMouse()
x = MouseX()
y = MouseY()
ymiddle = yscreen/2
dy = Abs(ymiddle-y)
;
If MouseButton(2) And brelease = 0
side = ~side
brelease = 1
EndIf
If MouseButton(2) = 0
brelease = 0
EndIf
If MouseButton(1) And brelease = 0
EndIf
; Traitement des paramètres CLAVIER
ExamineKeyboard()
If KeyboardInkey() = " "
If cr = 0
cr = 255
cv = 255
cb = 255
Else
cr = 0
cv = 0
cb = 0
EndIf
EndIf
; Préparation du dessin
If side = 0
TransformSprite3D(#image,0,0,x,ymiddle-dy,x,ymiddle+dy,0,Yscreen)
Else
TransformSprite3D(#image,x,ymiddle-dy,Xscreen,0,Xscreen, Yscreen,x,ymiddle+dy)
EndIf
DisplaySprite3D(#image, 0, 0)
;RotateSprite3D(1, x, 0)
;DisplaySprite3D (1, 0, 100, x/2)
;DisplaySprite3D (1, x*2, 100, x)
;DisplaySprite3D (1, 0, 100, x/2)
;DisplaySprite3D (1, x*2, 200+x, x)
Stop3D()
EndIf
Until KeyboardPushed(#PB_Key_Escape)
Else
MessageRequester("Error", "Can't open a 640*480 - 16 bit screen !", 0)
EndIf
End