TransformSprite3D : explication concrète demandée
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
TransformSprite3D : explication concrète demandée
Salut
Qui pourrait m'expliquer beaucoup clairement que le doc comment fonctionne la commande TransFormSprite3D() ???
je capte rien aux x1 à x4, y1 à y4 e tz1 à z4.
par exemple, si j'ai un sprite(3D) positionné en 320,240 (sur un écran de 640x480), comment transformer ce sprite pour qu'il se retourne progressivement, se retourne pas dans le sens horaire, mais plutôt comme si on voyait son "dos" ???
merci d'avance
Qui pourrait m'expliquer beaucoup clairement que le doc comment fonctionne la commande TransFormSprite3D() ???
je capte rien aux x1 à x4, y1 à y4 e tz1 à z4.
par exemple, si j'ai un sprite(3D) positionné en 320,240 (sur un écran de 640x480), comment transformer ce sprite pour qu'il se retourne progressivement, se retourne pas dans le sens horaire, mais plutôt comme si on voyait son "dos" ???
merci d'avance
Re: TransformSprite3D : explication concrète demandée
J'avais codé les SuperSprite3D , qui permettais une rotation comme tu le souhaites.
penche toi vers les vecteurs 3d & matrices.
il faut recalculé la formule de projection en fait
penche toi vers les vecteurs 3d & matrices.
il faut recalculé la formule de projection en fait

- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Re: TransformSprite3D : explication concrète demandée
Meri Caporal, tu fais référence à ce topic : SuperSprite3D
parce que les liens sont invalides, du coup, pas facile de voir ce que tu avais fait
merci pour le tuyau vecteurs 3D et matrices, mais c'est un sujet dont j'ignore tout.
Néanmoins, la doc devrait être un peu plus explicite, et surtout il devrait y avoir un exemple de cette fonction !!!
Fred, si jamais tu lis ce post...
parce que les liens sont invalides, du coup, pas facile de voir ce que tu avais fait

merci pour le tuyau vecteurs 3D et matrices, mais c'est un sujet dont j'ignore tout.
Néanmoins, la doc devrait être un peu plus explicite, et surtout il devrait y avoir un exemple de cette fonction !!!
Fred, si jamais tu lis ce post...
Re: TransformSprite3D : explication concrète demandée
Merde , Purestorage est fermé , plop les sources... si Dobro à une copie sur son DD 
Un Sprite3D , c'est ni plus ni moins que 4 coordonnées 2D
Chaque coordonnées représente un bord du sprite. (oublie le z... il est foireux)
x1,y1 , ce couple ( vecteur 2d) represente le bord haut gauche du sprite.
x2,y2 , haut droit
x3,y3 , bas droit
x4,y4 , bas gauche
un coup de trigo sur les 4 vecteurs , et tu fait des miracles
un Allemand dont j'ai zappé le nom à repris un de mes code (indispo du coup...)
et à rajouté une voiture :
http://www.bmi-online.de/public/GTA_LIKE.exe
On croirais de la 3D??
, bah , y a que de la 2D et de la trigo la dedans ^^

Un Sprite3D , c'est ni plus ni moins que 4 coordonnées 2D
Chaque coordonnées représente un bord du sprite. (oublie le z... il est foireux)
x1,y1 , ce couple ( vecteur 2d) represente le bord haut gauche du sprite.
x2,y2 , haut droit
x3,y3 , bas droit
x4,y4 , bas gauche
un coup de trigo sur les 4 vecteurs , et tu fait des miracles
un Allemand dont j'ai zappé le nom à repris un de mes code (indispo du coup...)
et à rajouté une voiture :
http://www.bmi-online.de/public/GTA_LIKE.exe
On croirais de la 3D??

Re: TransformSprite3D : explication concrète demandée
bonjour
voila un exemple de transformSprite3D obtenu à cette adresse du forum allemand.
http://www.purebasic.fr/german/viewtopi ... rn#p167136
un tutoriel sur les matrices
http://www.siteduzero.com/tutoriel-3-50 ... rices.html
cordialement
voila un exemple de transformSprite3D obtenu à cette adresse du forum allemand.
http://www.purebasic.fr/german/viewtopi ... rn#p167136
un tutoriel sur les matrices
http://www.siteduzero.com/tutoriel-3-50 ... rices.html
cordialement
Code : Tout sélectionner
;use transform3d on a sprite for an rotating cube
;lot of code (most) done by DarkDragon, thx for this
#UsePNG =0 ;use for loading from disk
#Usewebpictures=1; use for load from web
#UseOwnerDrawpictures=0; use for drawing spites itself
#UseWindowMode=0 ;windowmode or Fullscreen ?
#Screen_Width=1024 ;size of screen
#Screen_Height=768
Global SP_W.l,SP_H.l
sp_w=256;128 ;breite und höhe
sp_h=256;128
;{ init stuff
InitSprite()
InitSprite3D()
InitKeyboard()
InitMouse()
InitNetwork()
#TIMEOUT = 1500
Enumeration
#PLANE_TOP
#PLANE_BOTTOM
#PLANE_LEFT
#PLANE_RIGHT
#PLANE_FRONT
#PLANE_BACK
EndEnumeration
Structure SVector
x.f
y.f
z.f
EndStructure
Structure SCube
distance.f
*v.SVector[4]
sprite.l
EndStructure
;}
Procedure.l RandomColor()
ProcedureReturn RGB( Random(255), Random(255), Random(255) )
EndProcedure
Procedure.f _cos(angle)
ProcedureReturn Cos(angle * #PI / 180.0)
EndProcedure
Procedure.f _sin(angle)
ProcedureReturn Sin(angle * #PI / 180.0)
EndProcedure
Procedure Rotate(*v.SVector, angleX, angleY)
If angleX <> 0
KA.f = *v\y : KB.f = *v\z
*v\y = _cos(angleX) * KA + _sin(angleX) * KB
*v\z = _cos(angleX) * KB - _sin(angleX) * KA
EndIf
If angleY <> 0
KA.f = *v\z : KB.f = *v\x
*v\z = _cos(angleY) * KA + _sin(angleY) * KB
*v\x = _cos(angleY) * KB - _sin(angleY) * KA
EndIf
EndProcedure
Procedure DisplayCube(SpriteTop, SpriteBottom, SpriteLeft, SpriteRight, SpriteFront, SpriteBack, RotationX, RotationY, Scale, MoveX, MoveY)
Protected Dim v.SVector(7)
Protected Dim planes.SCube(5)
Protected k.l
v(0)\x =-1.0 : v(0)\y = 1.0 : v(0)\z = 1.0
v(1)\x = 1.0 : v(1)\y = 1.0 : v(1)\z = 1.0
v(2)\x = 1.0 : v(2)\y = 1.0 : v(2)\z =-1.0
v(3)\x =-1.0 : v(3)\y = 1.0 : v(3)\z =-1.0
v(4)\x =-1.0 : v(4)\y =-1.0 : v(4)\z = 1.0
v(5)\x = 1.0 : v(5)\y =-1.0 : v(5)\z = 1.0
v(6)\x = 1.0 : v(6)\y =-1.0 : v(6)\z =-1.0
v(7)\x =-1.0 : v(7)\y =-1.0 : v(7)\z =-1.0
; v0
; v3 v1
; v2
;
;
; v4
; v7 v5
; v6
For k=0 To 7
Rotate(@v(k), RotationX, RotationY)
v(k)\x * Scale
v(k)\y * Scale
v(k)\z * Scale + 1000.0
Next k
; Top
planes(0)\v[0] = @v(0)
planes(0)\v[1] = @v(1)
planes(0)\v[2] = @v(2)
planes(0)\v[3] = @v(3)
planes(0)\sprite = SpriteTop
; Back
planes(1)\v[0] = @v(3)
planes(1)\v[1] = @v(2)
planes(1)\v[2] = @v(6)
planes(1)\v[3] = @v(7)
planes(1)\sprite = SpriteBack
; Right
planes(2)\v[0] = @v(2)
planes(2)\v[1] = @v(1)
planes(2)\v[2] = @v(5)
planes(2)\v[3] = @v(6)
planes(2)\sprite = SpriteRight
; Front
planes(3)\v[0] = @v(1)
planes(3)\v[1] = @v(0)
planes(3)\v[2] = @v(4)
planes(3)\v[3] = @v(5)
planes(3)\sprite = SpriteFront
; Left
planes(4)\v[0] = @v(0)
planes(4)\v[1] = @v(3)
planes(4)\v[2] = @v(7)
planes(4)\v[3] = @v(4)
planes(4)\sprite = SpriteLeft
; Bottom
planes(5)\v[0] = @v(4)
planes(5)\v[1] = @v(7)
planes(5)\v[2] = @v(6)
planes(5)\v[3] = @v(5)
planes(5)\sprite = SpriteBottom
For k=0 To 5
planes(k)\distance = (planes(k)\v[0]\z + planes(k)\v[1]\z + planes(k)\v[2]\z + planes(k)\v[3]\z) * 0.25
Next k
SortStructuredArray(planes(), 1, OffsetOf(SCube\distance), #PB_Sort_Float)
For k=0 To 5
TransformSprite3D(planes(k)\sprite, planes(k)\v[0]\x, planes(k)\v[0]\y, planes(k)\v[0]\z, planes(k)\v[1]\x, planes(k)\v[1]\y, planes(k)\v[1]\z, planes(k)\v[2]\x, planes(k)\v[2]\y, planes(k)\v[2]\z, planes(k)\v[3]\x, planes(k)\v[3]\y, planes(k)\v[3]\z)
DisplaySprite3D(planes(k)\sprite, MoveX, MoveY)
Next k
EndProcedure
Procedure.s ReceiveLine(ConnectionID)
Text.s = ""
While char.b <> #LF
char = 0
ReceiveNetworkData(ConnectionID, @char, 1)
If char <> 0
Text.s + Chr(char)
EndIf
Wend
ProcedureReturn RemoveString(RemoveString(Text, #CR$), #LF$)
EndProcedure
Procedure HTTPRequest(URL.s, *EndSize.LONG, PacketSize, *Callback)
Protected Size.l, Data_.s, s.l, Method.s, File.s, Content.s, Text.s, Length.l, Line.s
Protected CurSize.l, oSize.l, t.l, ConnectionID.l
If Left(URL, 7) = "http://" : URL = Right(URL, Len(URL)-7) : EndIf
s = FindString(URL, "/", 1)
Host.s = "" : File.s = ""
If s <> 0 : Host.s = Left(URL, s-1) : File.s = Right(URL, Len(URL)-s) : Else : Host = URL : EndIf
s = FindString(File, "?", 1)
If s <> 0
Method.s = "POST"
Content.s = Right(File, Len(File)-s)
File = Left(File, s-1)
Else
Method.s = "GET"
Content.s = ""
EndIf
ConnectionID = OpenNetworkConnection(Host, 80)
If ConnectionID
Data_.s = Method+" /"+File+" HTTP/1.0"+#CRLF$
Data_.s + "Host: "+Host+#CRLF$
Data_.s + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7"+#CRLF$
If Content <> ""
Data_.s + "Connection: close"+#CRLF$
Data_.s + "Content-Type: application/x-www-form-urlencoded"+#CRLF$
Data_.s + "Content-Length: "+Str(Len(Content))+#CRLF$
Data_.s + #CRLF$ + Content.s + #CRLF$+#CRLF$
Else
Data_.s + "Connection: close"+#CRLF$+#CRLF$
EndIf
SendNetworkString(ConnectionID, Data_)
While NetworkClientEvent(ConnectionID) <> 2 : Delay(10) : Wend
Length = 0
Line.s = ""
Repeat
Line = ReceiveLine(ConnectionID)
Select LCase(StringField(Line, 1, ":"))
Case "content-length"
Length = Val(Trim(StringField(Line, 2, ":")))
EndSelect
Until Len(Trim(Line)) <= 4
Size = 0
If Length <> 0
*Result = AllocateMemory(Length)
While Size < Length
If CurSize > 0
Size + CurSize
If *Callback
CallFunctionFast(*Callback, Size, Length)
EndIf
EndIf
If Size > (Length-PacketSize)
PacketSize = Length-Size
EndIf
If PacketSize > 0
CurSize = ReceiveNetworkData(ConnectionID, *Result+Size, PacketSize)
EndIf
Wend
Else
*Buffer = AllocateMemory(PacketSize)
*Result = AllocateMemory(1)
t = ElapsedMilliseconds()
While ElapsedMilliseconds()-t <= #TIMEOUT
If NetworkClientEvent(ConnectionID) = 2
CurSize = ReceiveNetworkData(ConnectionID, *Buffer, PacketSize)
If CurSize > 0
oSize = Size
Size + CurSize
*Result = ReAllocateMemory(*Result, Size)
CopyMemory(*Buffer, *Result+oSize, CurSize)
If *Callback
CallFunctionFast(*Callback, Size, 0)
EndIf
EndIf
t = ElapsedMilliseconds()
EndIf
Wend
Length = Size
EndIf
*EndSize\l = Length
If *Callback
CallFunctionFast(*Callback, Size, Length)
EndIf
CloseNetworkConnection(ConnectionID)
ProcedureReturn *Result
EndIf
EndProcedure
UsePNGImageDecoder()
CompilerIf #UseWindowMode
OpenWindow(0, 0, 0, #Screen_Width, #Screen_height, "Rotating Cube", #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0), 0, 0, #Screen_Width, #Screen_Height, 1, 0, 0)
CompilerElse
If OpenScreen(#Screen_Width,#Screen_Height,16,"WeatherCube")=0:EndIf
CompilerEndIf
;{ using PNG from Harddisk
CompilerIf #usePNG
path.s="media\"
UsePNGImageDecoder()
LoadSprite(0, path + "imgradio.png", #PB_Sprite_Texture)
LoadSprite(1, path + "imgWeather.png", #PB_Sprite_Texture)
LoadSprite(2, path + "imgtv.png", #PB_Sprite_Texture)
CreateSprite3D(0,0)
CreateSprite3D(1,1)
CreateSprite3D(2,2)
CompilerEndIf
;}
;{ using Pictures from the web
CompilerIf #Usewebpictures
;search for weather information
UseJPEGImageDecoder()
adress.s="http://image.de.weather.com/web/maps/satellite/regions/europesat_720x486.jpg"
*Buffer = HTTPRequest(adress, @Size, 16, 0)
CatchSprite(0, *Buffer, #PB_Sprite_Texture)
FreeMemory(*Buffer)
CreateSprite3D(0,0)
adress.s="http://image.de.weather.com/images/maps/de_DE/satellite/regions/germany_sat_600_nl.jpg"
*Buffer = HTTPRequest(adress, @Size, 16, 0)
CatchSprite(1, *Buffer, #PB_Sprite_Texture)
FreeMemory(*Buffer)
CreateSprite3D(1,1)
adress.s="http://image.de.weather.com/web/maps/de_DE/weather/forecast/germany_outlook_day1_720_de.jpg"
*Buffer = HTTPRequest(adress, @Size, 16, 0)
CatchSprite(2, *Buffer, #PB_Sprite_Texture)
FreeMemory(*Buffer)
CreateSprite3D(2,2)
CompilerEndIf
;}
;{ creating sprites with 2d-commands
CompilerIf #UseOwnerDrawpictures
; ;3d sprites als seitenflächen
For n=0 To 2;seiten
CreateSprite(n,sp_w,sp_h,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(n))
FrontColor(RandomColor() )
Box(0, 0, sp_w, sp_h)
;DrawingFont(FontID(0))
DrawingMode(3)
FrontColor( RandomColor() )
Circle(sp_w/2, sp_h/2, sp_w/3 ,RandomColor())
DrawText(sp_w/2,sp_h/2,Str(n),RandomColor(),RandomColor())
StopDrawing()
CreateSprite3D(n,n)
Next
CompilerEndIf
;}
Define mdx.d
Define mdy.d
Define mdx2.d
Define mdy2.d
Define lastTime.l
Define currentTime.l
currentTime = ElapsedMilliseconds()
Repeat
CompilerIf #UseWindowMode
WindowEvent()
CompilerEndIf
ExamineKeyboard()
ExamineMouse()
lastTime = currentTime
currentTime = ElapsedMilliseconds()
mdx + (lastTime - currentTime) * MouseDeltaX()/20
mdy + (lastTime - currentTime) * MouseDeltaY()/20
;mdx + 0.1
ClearScreen(0)
Start3D()
DisplayCube(0, 0, 1, 1, 2, 2, mdy, mdx, 200.0, #Screen_Width/2, #Screen_height/2)
mdx2 + 0.5
mdy2 + 0.5
DisplayCube(0, 0, 1, 1, 2, 2, mdx2,mdy2, 50.0, 100, #Screen_height-100)
Stop3D()
StartDrawing(ScreenOutput())
DrawText(10,10,"Move your mouse to rotate cube " +StrD(mdx,2) + " " + StrD(mdy,2) )
StopDrawing()
FlipBuffers(2)
CompilerIf #UseWindowMode
Until WindowEvent() = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
CompilerElse
Until KeyboardPushed(#PB_Key_Escape)
CompilerEndIf
End
Re: TransformSprite3D : explication concrète demandée
j'ai retrouvé le code sur un vieux DD , par contre j'ai pas d'exemple qui va avec ^^
Code : Tout sélectionner
; - SUPERSPRITE3D
; - PAR CPL.BATOR
;
; PUREBASIC 4.0
ProcedureDLL InitSuperSprite3D()
#Flip_Verticaly = $001
#Flip_Horizontaly = $010
Structure MATRIX4x4
_11.f : _21.f : _31.f : _41.f
_12.f : _22.f : _32.f : _42.f
_13.f : _23.f : _33.f : _43.f
_14.f : _24.f : _34.f : _44.f
EndStructure
Structure VECTOR2
x.f : y.f
EndStructure
Structure VECTOR3
x.f:y.f:z.f
EndStructure
Structure CAMERA
Position.VECTOR3
LookAT.VECTOR3
Rotation.VECTOR3
Pitch.f
Yaw.f
Roll.f
EndStructure
Structure vertex
sx.f
sy.f
sz.f
rhw.f
Color.l
specular.l
tu.f
tv.f
EndStructure
Structure SuperSprite3D
No.l
Size_X.l
Size_Y.l
A3D.VECTOR3 : A2D.VECTOR2
B3D.VECTOR3 : B2D.VECTOR2
C3D.VECTOR3 : C2D.VECTOR2
D3D.VECTOR3 : D2D.VECTOR2
VA3D.VECTOR3
VB3D.VECTOR3
VC3D.VECTOR3
VD3D.VECTOR3
MatriceProjection.MATRIX4x4
MatriceRotation.MATRIX4x4
MatriceTranslation.MATRIX4x4
Camera.CAMERA
EndStructure
Structure PB_Sprite3D
Texture.l
Vertice.vertex[4]
Width.w
Height.w
EndStructure
Global NewList SS3D.l()
EndProcedure
;============================================================================================
;-PROCEDURES MATHEMATIQUES | CALCULS MATRICIELLES
;============================================================================================
Procedure MATRICE_Rotate_XYZ(*MATRICE.MATRIX4x4 , Xa.f,Ya.f,Za.f)
*MATRICE\_11 = Cos(Za)*Cos(Ya) : *MATRICE\_21 = Sin(Za)*Cos(Ya) : *MATRICE\_31 = -Sin(Ya) : *MATRICE\_41 = 0
*MATRICE\_12 = Cos(Za)*Sin(Ya)*Sin(Xa) - Sin(Za)*Cos(Xa) : *MATRICE\_22 = Sin(Za)*Sin(Ya)*Sin(Xa) + Cos(Xa)*Cos(Za) : *MATRICE\_32 = Sin(Xa)*Cos(Ya) : *MATRICE\_42 = 0
*MATRICE\_13 = Cos(Za)*Sin(Ya)*Cos(Xa) + Sin(Za)*Sin(Xa) : *MATRICE\_23 = Sin(Za)*Sin(Ya)*Cos(Xa) - Cos(Za)*Sin(Xa) : *MATRICE\_33 = Cos(Xa)*Cos(Ya) : *MATRICE\_43 = 0
*MATRICE\_14 = 0 : *MATRICE\_24 = 0 : *MATRICE\_34 = 0 : *MATRICE\_44 = 1
EndProcedure
Procedure MATRICE_Translate_XYZ(*MATRICE.MATRIX4x4 , x.f,y.f,z.f)
Global V.VECTOR3
*MATRICE\_11 = 1 : *MATRICE\_21 = 0 : *MATRICE\_31 = 0 : *MATRICE\_41 = x
*MATRICE\_12 = 0 : *MATRICE\_22 = 1 : *MATRICE\_32 = 0 : *MATRICE\_42 = y
*MATRICE\_13 = 0 : *MATRICE\_23 = 0 : *MATRICE\_33 = 1 : *MATRICE\_43 = z
*MATRICE\_14 = 0 : *MATRICE\_24 = 0 : *MATRICE\_34 = 0 : *MATRICE\_44 = 1
V\x=*MATRICE\_41
V\y=*MATRICE\_42
V\z=*MATRICE\_43
EndProcedure
Procedure MATRICE_MULTIPLY(*m1.MATRIX4x4,*m2.MATRIX4x4,*MatriceF.MATRIX4x4)
*MatriceF\_11 = *m1\_11 * *m2\_11 + *m1\_12 * *m2\_21 + *m1\_13 * *m2\_31 + *m1\_14 * *m2\_41
*MatriceF\_12 = *m1\_11 * *m2\_12 + *m1\_12 * *m2\_22 + *m1\_13 * *m2\_32 + *m1\_14 * *m2\_42
*MatriceF\_13 = *m1\_11 * *m2\_13 + *m1\_12 * *m2\_23 + *m1\_13 * *m2\_33 + *m1\_14 * *m2\_43
*MatriceF\_14 = *m1\_11 * *m2\_14 + *m1\_12 * *m2\_24 + *m1\_13 * *m2\_34 + *m1\_14 * *m2\_44
*MatriceF\_21 = *m1\_21 * *m2\_11 + *m1\_22 * *m2\_21 + *m1\_23 * *m2\_31 + *m1\_24 * *m2\_41
*MatriceF\_22 = *m1\_21 * *m2\_12 + *m1\_22 * *m2\_22 + *m1\_23 * *m2\_32 + *m1\_24 * *m2\_42
*MatriceF\_23 = *m1\_21 * *m2\_13 + *m1\_22 * *m2\_23 + *m1\_23 * *m2\_33 + *m1\_24 * *m2\_43
*MatriceF\_24 = *m1\_21 * *m2\_14 + *m1\_22 * *m2\_24 + *m1\_23 * *m2\_34 + *m1\_24 * *m2\_44
*MatriceF\_31 = *m1\_31 * *m2\_11 + *m1\_32 * *m2\_21 + *m1\_33 * *m2\_31 + *m1\_34 * *m2\_41
*MatriceF\_32 = *m1\_31 * *m2\_12 + *m1\_32 * *m2\_22 + *m1\_33 * *m2\_32 + *m1\_34 * *m2\_42
*MatriceF\_33 = *m1\_31 * *m2\_13 + *m1\_32 * *m2\_23 + *m1\_33 * *m2\_33 + *m1\_34 * *m2\_43
*MatriceF\_34 = *m1\_31 * *m2\_14 + *m1\_32 * *m2\_24 + *m1\_33 * *m2\_34 + *m1\_34 * *m2\_44
*MatriceF\_41 = *m1\_41 * *m2\_11 + *m1\_42 * *m2\_21 + *m1\_43 * *m2\_31 + *m1\_44 * *m2\_41
*MatriceF\_42 = *m1\_41 * *m2\_12 + *m1\_42 * *m2\_22 + *m1\_43 * *m2\_32 + *m1\_44 * *m2\_42
*MatriceF\_43 = *m1\_41 * *m2\_13 + *m1\_42 * *m2\_23 + *m1\_43 * *m2\_33 + *m1\_44 * *m2\_43
*MatriceF\_44 = *m1\_41 * *m2\_14 + *m1\_42 * *m2\_24 + *m1\_43 * *m2\_34 + *m1\_44 * *m2\_44
EndProcedure
Procedure CopyMatrice(*MatriceSource.MATRIX4x4,*MatriceTo.MATRIX4x4)
*MatriceTo\_11 = *MatriceSource\_11
*MatriceTo\_12 = *MatriceSource\_12
*MatriceTo\_13 = *MatriceSource\_13
*MatriceTo\_14 = *MatriceSource\_14
*MatriceTo\_21 = *MatriceSource\_21
*MatriceTo\_22 = *MatriceSource\_22
*MatriceTo\_23 = *MatriceSource\_23
*MatriceTo\_24 = *MatriceSource\_24
*MatriceTo\_31 = *MatriceSource\_31
*MatriceTo\_32 = *MatriceSource\_32
*MatriceTo\_33 = *MatriceSource\_33
*MatriceTo\_34 = *MatriceSource\_34
*MatriceTo\_41 = *MatriceSource\_41
*MatriceTo\_42 = *MatriceSource\_42
*MatriceTo\_43 = *MatriceSource\_43
*MatriceTo\_44 = *MatriceSource\_44
EndProcedure
ProcedureDLL SetPerspective(_Xoff.l,_Yoff.l)
Global Xoff.l=_Xoff
Global Yoff.l=_Yoff
EndProcedure
ProcedureDLL CreateSuperSprite3D(Sprite.l,Width.l,Height.l)
Protected *Temp.SuperSprite3D = AllocateMemory(SizeOf(SuperSprite3D))
*Temp\No = Sprite
*Temp\Size_X = Width
*Temp\Size_Y = Height
*Temp\VA3D\x = -Width/2 : *Temp\VB3D\x = Width/2 : *Temp\VC3D\x = Width/2 : *Temp\VD3D\x = -Width/2
*Temp\VA3D\y = -Height/2 : *Temp\VB3D\y = -Height/2 : *Temp\VC3D\y = Height/2 : *Temp\VD3D\y = Height/2
*Temp\VA3D\z = 0 : *Temp\VB3D\z = 0 : *Temp\VC3D\z = 0 : *Temp\VD3D\z = 0
AddElement(SS3D())
SS3D()= *Temp
ProcedureReturn *Temp
EndProcedure
ProcedureDLL DisplaySuperSprite3D(*Sprite.SuperSprite3D,Transparency=255)
Protected ax.f,ay.f,az.f
Protected bx.f,by.f,bz.f
Protected cx.f,cy.f,cz.f
Protected dx.f,dy.f,dz.f
MATRICE_Translate_XYZ(*Sprite\MatriceTranslation,*Sprite\Camera\Position\x,*Sprite\Camera\Position\y,*Sprite\Camera\Position\z)
MATRICE_Rotate_XYZ(*Sprite\MatriceRotation,*Sprite\Camera\Rotation\x,*Sprite\Camera\Rotation\y,*Sprite\Camera\Rotation\z)
MATRICE_MULTIPLY(*Sprite\MatriceRotation,*Sprite\MatriceTranslation,*Sprite\MatriceProjection)
*Sprite\A3D\x = *Sprite\MatriceProjection\_11**Sprite\VA3D\x + *Sprite\MatriceProjection\_21**Sprite\VA3D\y + *Sprite\MatriceProjection\_31**Sprite\VA3D\z + *Sprite\MatriceProjection\_41
*Sprite\A3D\y = *Sprite\MatriceProjection\_12**Sprite\VA3D\x + *Sprite\MatriceProjection\_22**Sprite\VA3D\y + *Sprite\MatriceProjection\_32**Sprite\VA3D\z + *Sprite\MatriceProjection\_42
*Sprite\A3D\z = *Sprite\MatriceProjection\_13**Sprite\VA3D\x + *Sprite\MatriceProjection\_23**Sprite\VA3D\y + *Sprite\MatriceProjection\_33**Sprite\VA3D\z + *Sprite\MatriceProjection\_43
*Sprite\B3D\x = *Sprite\MatriceProjection\_11**Sprite\VB3D\x + *Sprite\MatriceProjection\_21**Sprite\VB3D\y + *Sprite\MatriceProjection\_31**Sprite\VB3D\z + *Sprite\MatriceProjection\_41
*Sprite\B3D\y = *Sprite\MatriceProjection\_12**Sprite\VB3D\x + *Sprite\MatriceProjection\_22**Sprite\VB3D\y + *Sprite\MatriceProjection\_32**Sprite\VB3D\z + *Sprite\MatriceProjection\_42
*Sprite\B3D\z = *Sprite\MatriceProjection\_13**Sprite\VB3D\x + *Sprite\MatriceProjection\_23**Sprite\VB3D\y + *Sprite\MatriceProjection\_33**Sprite\VB3D\z + *Sprite\MatriceProjection\_43
*Sprite\C3D\x = *Sprite\MatriceProjection\_11**Sprite\VC3D\x + *Sprite\MatriceProjection\_21**Sprite\VC3D\y + *Sprite\MatriceProjection\_31**Sprite\VC3D\z + *Sprite\MatriceProjection\_41
*Sprite\C3D\y = *Sprite\MatriceProjection\_12**Sprite\VC3D\x + *Sprite\MatriceProjection\_22**Sprite\VC3D\y + *Sprite\MatriceProjection\_32**Sprite\VC3D\z + *Sprite\MatriceProjection\_42
*Sprite\C3D\z = *Sprite\MatriceProjection\_13**Sprite\VC3D\x + *Sprite\MatriceProjection\_23**Sprite\VC3D\y + *Sprite\MatriceProjection\_33**Sprite\VC3D\z + *Sprite\MatriceProjection\_43
*Sprite\D3D\x = *Sprite\MatriceProjection\_11**Sprite\VD3D\x + *Sprite\MatriceProjection\_21**Sprite\VD3D\y + *Sprite\MatriceProjection\_31**Sprite\VD3D\z + *Sprite\MatriceProjection\_41
*Sprite\D3D\y = *Sprite\MatriceProjection\_12**Sprite\VD3D\x + *Sprite\MatriceProjection\_22**Sprite\VD3D\y + *Sprite\MatriceProjection\_32**Sprite\VD3D\z + *Sprite\MatriceProjection\_42
*Sprite\D3D\z = *Sprite\MatriceProjection\_13**Sprite\VD3D\x + *Sprite\MatriceProjection\_23**Sprite\VD3D\y + *Sprite\MatriceProjection\_33**Sprite\VD3D\z + *Sprite\MatriceProjection\_43
DFOV = 768
If *Sprite\A3D\z>0
*Sprite\A2D\x = ( *Sprite\A3D\x*DFOV ) / ( *Sprite\A3D\z) + Xoff
*Sprite\A2D\y = ( *Sprite\A3D\y*DFOV ) / ( *Sprite\A3D\z) + Yoff
EndIf
If *Sprite\B3D\z>0
*Sprite\B2D\x = ( *Sprite\B3D\x*DFOV ) / ( *Sprite\B3D\z) + Xoff
*Sprite\B2D\y = ( *Sprite\B3D\y*DFOV ) / ( *Sprite\B3D\z) + Yoff
EndIf
If *Sprite\C3D\z>0
*Sprite\C2D\x = ( *Sprite\C3D\x*DFOV ) / ( *Sprite\C3D\z) + Xoff
*Sprite\C2D\y = ( *Sprite\C3D\y*DFOV ) / ( *Sprite\C3D\z) + Yoff
EndIf
If *Sprite\D3D\z>0
*Sprite\D2D\x = ( *Sprite\D3D\x*DFOV ) / ( *Sprite\D3D\z) + Xoff
*Sprite\D2D\y = ( *Sprite\D3D\y*DFOV ) / ( *Sprite\D3D\z) + Yoff
EndIf
ax=*Sprite\A2D\x : bx=*Sprite\B2D\x : cx=*Sprite\C2D\x : dx=*Sprite\D2D\x
ay=*Sprite\A2D\y : by=*Sprite\B2D\y : cy=*Sprite\C2D\y : dy=*Sprite\D2D\y
az=*Sprite\A3D\z : bz=*Sprite\B3D\z : cz=*Sprite\C3D\z : dz=*Sprite\D3D\z
If *Sprite\Camera\Position\z>100
TransformSprite3D(*Sprite\No,ax,ay,az,bx,by,bz,dx,dy,dz,cx,cy,cz)
DisplaySprite3D(*Sprite\No,0,0,Transparency)
EndIf
EndProcedure
ProcedureDLL RotateSuperSprite3D(*Sprite.SuperSprite3D,x.f,y.f,z.f)
*Sprite\Camera\Rotation\x = x*#PI/180
*Sprite\Camera\Rotation\y = y*#PI/180
*Sprite\Camera\Rotation\z = z*#PI/180
EndProcedure
ProcedureDLL SetSuperSpritePosition(*Sprite.SuperSprite3D,x.f,y.f,z.f)
*Sprite\Camera\Position\x = x
*Sprite\Camera\Position\y = y
*Sprite\Camera\Position\z = z
EndProcedure
ProcedureDLL BlurSuperSprite3D(*Sprite.SuperSprite3D,Value=1)
Protected DB_.l,DBPF.l,PF.l,Color.l,r.f,V.f,B.f
Protected NbPixel.l
Protected Dim Blur.l(SpriteWidth(*Sprite\No),SpriteHeight(*Sprite\No))
StartDrawing(SpriteOutput(*Sprite\No))
DB_ = DrawingBuffer()
DBPF = DrawingBufferPixelFormat()
Select DBPF
Case #PB_PixelFormat_8Bits : PF=1
Case #PB_PixelFormat_15Bits : PF=2
Case #PB_PixelFormat_16Bits : PF=2
Case #PB_PixelFormat_24Bits_RGB : PF=3
Case #PB_PixelFormat_24Bits_BGR : PF=3
Case #PB_PixelFormat_32Bits_RGB : PF=4
Case #PB_PixelFormat_32Bits_BGR : PF=4
EndSelect
For y = 0 To SpriteHeight(*Sprite\No)-1
For x = 0 To SpriteWidth(*Sprite\No)-1
Blur(x,y) = PeekL(DB_+ ((x)*PF) + SpriteWidth(*Sprite\No)* ((y)*PF))
Next
Next
For y = 0 To SpriteHeight(*Sprite\No)-1
For x = 0 To SpriteWidth(*Sprite\No)-1
r = 0
V = 0
B = 0
NbPixel = 0
For Py = -Value To Value
For Px = -Value To Value
If Px + x >= 0 And Px + x < SpriteWidth(*Sprite\No)
If Py + y >= 0 And Py + y < SpriteHeight(*Sprite\No)
Color = Blur(x+Px,y+Py)
r = r + Red(Color)
V = V + Green(Color)
B = B + Blue(Color)
NbPixel + 1
EndIf
EndIf
Next
Next
Color = RGB( r/NbPixel,V/NbPixel,B/NbPixel)
PokeL(DB_+ ((x)*PF) + SpriteWidth(*Sprite\No)* ((y)*PF),Color)
Next
Next
StopDrawing()
EndProcedure
Procedure FlipSuperSprite3D(*Sprite.SuperSprite3D,Mode.l)
Protected DB_.l,DBPF.l,PF.l,r.f,V.f,B.f
Protected sx.l,sy.l
Protected Dim Spr.l(SpriteWidth(*Sprite\No),SpriteHeight(*Sprite\No))
StartDrawing(SpriteOutput(*Sprite\No))
DB_ = DrawingBuffer()
DBPF = DrawingBufferPixelFormat()
Select DBPF
Case #PB_PixelFormat_8Bits : PF=1
Case #PB_PixelFormat_15Bits : PF=2
Case #PB_PixelFormat_16Bits : PF=2
Case #PB_PixelFormat_24Bits_RGB : PF=3
Case #PB_PixelFormat_24Bits_BGR : PF=3
Case #PB_PixelFormat_32Bits_RGB : PF=4
Case #PB_PixelFormat_32Bits_BGR : PF=4
EndSelect
DBL = DrawingBufferPitch() / PF
For y = 0 To SpriteHeight(*Sprite\No)-1
For x = 0 To SpriteWidth(*Sprite\No)-1
Spr(x,y) = PeekL(DB_+ ((x)*PF) + DBL * ((y)*PF))
Next
Next
If Mode = #Flip_Horizontaly
For y = SpriteHeight(*Sprite\No)-1 To 0 Step -1
For x = 0 To SpriteWidth(*Sprite\No)-1
PokeL(DB_+ ((x)*PF) + DBL * ((y)*PF),Spr(sx,sy))
sx+1
Next
sy+1
sx=0
Next
EndIf
If Mode = #Flip_Verticaly
For y = 0 To SpriteHeight(*Sprite\No)-1
For x = SpriteWidth(*Sprite\No)-1 To 0 Step -1
PokeL(DB_+ ((x)*PF) + DBL * ((y)*PF),Spr(sx,sy))
sx+1
Next
sy+1
sx=0
Next
EndIf
If Mode = #Flip_Verticaly | #Flip_Horizontaly
For y = SpriteHeight(*Sprite\No)-1 To 0 Step -1
For x = SpriteWidth(*Sprite\No)-1 To 0 Step -1
PokeL(DB_+ ((x)*PF) + DBL * ((y)*PF),Spr(sx,sy))
sx+1
Next
sy+1
sx=0
Next
EndIf
StopDrawing()
EndProcedure
ProcedureDLL InvertColorSuperSprite3D(*Sprite.SuperSprite3D)
Protected DB_.l,DBPF.l,PF.l,Color.l,r.f,V.f,B.f
Protected Dim Spr.l(SpriteWidth(*Sprite\No),SpriteHeight(*Sprite\No))
StartDrawing(SpriteOutput(*Sprite\No))
DB_ = DrawingBuffer()
DBPF = DrawingBufferPixelFormat()
Select DBPF
Case #PB_PixelFormat_8Bits : PF=1
Case #PB_PixelFormat_15Bits : PF=2
Case #PB_PixelFormat_16Bits : PF=2
Case #PB_PixelFormat_24Bits_RGB : PF=3
Case #PB_PixelFormat_24Bits_BGR : PF=3
Case #PB_PixelFormat_32Bits_RGB : PF=4
Case #PB_PixelFormat_32Bits_BGR : PF=4
EndSelect
For y = 0 To SpriteHeight(*Sprite\No)-1
For x = 0 To SpriteWidth(*Sprite\No)-1
Spr(x,y) = PeekL(DB_+ ((x)*PF) + SpriteWidth(*Sprite\No)* ((y)*PF))
r= 255 - Red(Spr(x,y))
V= 255 - Green(Spr(x,y))
B= 255 - Blue(Spr(x,y))
PokeL(DB_+ ((x)*PF) + SpriteWidth(*Sprite\No)* ((y)*PF),RGB(r,V,B))
Next
Next
StopDrawing()
EndProcedure
ProcedureDLL SuperSprite3DChangeColor(*Sprite.SuperSprite3D,ColorToFind.l,ColorToChange.l)
StartDrawing(SpriteOutput(*Sprite\No))
DB_ = DrawingBuffer()
DBPF = DrawingBufferPixelFormat()
Select DBPF
Case #PB_PixelFormat_8Bits : PF=1
Case #PB_PixelFormat_15Bits : PF=2
Case #PB_PixelFormat_16Bits : PF=2
Case #PB_PixelFormat_24Bits_RGB : PF=3
Case #PB_PixelFormat_24Bits_BGR : PF=3
Case #PB_PixelFormat_32Bits_RGB : PF=4
Case #PB_PixelFormat_32Bits_BGR : PF=4
EndSelect
For y = 0 To SpriteHeight(*Sprite\No)-1
For x = 0 To SpriteWidth(*Sprite\No)-1
If PeekL(DB_+ ((x)*PF) + SpriteWidth(*Sprite\No)* ((y)*PF)) = ColorToFind
PokeL(DB_+ ((x)*PF) + SpriteWidth(*Sprite\No)* ((y)*PF),ColorToChange)
EndIf
Next
Next
StopDrawing()
EndProcedure
; ProcedureDLL RGBA(Red,Green,Blue,Alpha)
; ProcedureReturn RGB(Blue,Green,Red) + Alpha << 24
; EndProcedure
ProcedureDLL SetSuperSprite3DVertexColor(*Sprite.SuperSprite3D,A.l,B.l,C.l,D.l)
Protected *VertexSprite.PB_Sprite3D = IsSprite3D(*Sprite\No)
*VertexSprite\Vertice[0]\Color = A
*VertexSprite\Vertice[1]\Color = B
*VertexSprite\Vertice[2]\Color = D
*VertexSprite\Vertice[3]\Color = C
EndProcedure
ProcedureDLL SetSuperSprite3DUV(*Sprite.SuperSprite3D,T_u.f,T_v.f)
Protected *VertexSprite.PB_Sprite3D = IsSprite3D(*Sprite\No)
*VertexSprite\Vertice[0]\tu = 0
*VertexSprite\Vertice[0]\tv = 0
*VertexSprite\Vertice[1]\tu = T_u
*VertexSprite\Vertice[1]\tv = 0
*VertexSprite\Vertice[3]\tu = T_u
*VertexSprite\Vertice[3]\tv = T_v
*VertexSprite\Vertice[2]\tu = 0
*VertexSprite\Vertice[2]\tv = T_v
EndProcedure
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Re: TransformSprite3D : explication concrète demandée
Merci Caporal, j'ai pas le temps de m'en occuper ce matin, les enfants me prennent tout mon temps, mais cet ap midi devrait être un peu plus cool
merci encore

merci encore
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Re: TransformSprite3D : explication concrète demandée
Salut
bon, alors moi et la trigo ça fait 12 !!!
Cpl.Bator, tu me conseilles de ne pas tenir compte de la coordonnée Z, est-ce que cela revient à dire qu'il faut que je la laisse à 0 (zéro) ?
Je vous explique ce que je cherche à faire, je voudrais poster un code pour le PurePunch #4 de Djes, ce que je cherche à faire, c'est une scrolling-text (encore un
), dont les lettres donneraient l'impression de tourner autour d'un rouleau, où on les verrait "de dos" à un moment donné de la rotation. Je sais pas si c'est clair ce que je dis.
J'ai donc pensé à un sprite3D sur lequel je ferai une sorte de flip progressif pour simuler "l'enroulement" du sprite.
Je croyais faire ça via un TransformSprite3D où, d'après tes explications sur les x1/y1 à x4/y4, j'aurai "déplacé" uniquement les x2 et x3 de -1 jusqu'à ce qu'on arrive à la largeur du sprite en (x1-largeur), et refaire du +1 surx2 et x3 jusqu'à ce que x2 soit égal à largeur_sprite.
mais ça marche pas du tout. Voilà le code d'exemple de Sprite3D que j'ai essayé de modifier :
Je ne veux pas du code tout cuit, sinon, je ne pourrais pas participer au PurePunch #4 (d'ailleurs à mon avis c'est grillé), mais une explication simple pour mon esprit simple sur comment faire ce que je demande.
Si je me représente l'affichage de mon Sprite3D, j'imagine ça :

donc pour moi, pour faire un effet de rotation sur lui même en 2D, il me suffisait de déplacer les X2 et X3 progressivement vers la droite, puis vers la gauche (une fois affiché complètement à l'envers).
J'ai mal compris Docteur ?
merci pour vos explications
bon, alors moi et la trigo ça fait 12 !!!
Cpl.Bator, tu me conseilles de ne pas tenir compte de la coordonnée Z, est-ce que cela revient à dire qu'il faut que je la laisse à 0 (zéro) ?
Je vous explique ce que je cherche à faire, je voudrais poster un code pour le PurePunch #4 de Djes, ce que je cherche à faire, c'est une scrolling-text (encore un

J'ai donc pensé à un sprite3D sur lequel je ferai une sorte de flip progressif pour simuler "l'enroulement" du sprite.
Je croyais faire ça via un TransformSprite3D où, d'après tes explications sur les x1/y1 à x4/y4, j'aurai "déplacé" uniquement les x2 et x3 de -1 jusqu'à ce qu'on arrive à la largeur du sprite en (x1-largeur), et refaire du +1 surx2 et x3 jusqu'à ce que x2 soit égal à largeur_sprite.
mais ça marche pas du tout. Voilà le code d'exemple de Sprite3D que j'ai essayé de modifier :
Code : Tout sélectionner
;
; ------------------------------------------------------------
;
; PureBasic - Sprite example file
;
; (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Error", "Sprite system can't be initialized", 0)
End
EndIf
If InitSprite3D() = 0
MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
End
EndIf
;
; Now, open a 640*480 - 16 bits (65000 colours) screen
;
If OpenScreen(640, 480, 16, "Sprite")
; Load our 16 bit sprite (which is a 24 bit picture in fact, as BMP doesn't support 16 bit format)
;
LoadSprite(0, "Data/Geebee2.bmp", #PB_Sprite_Texture)
CreateSprite3D(0, 0)
CreateSprite3D(1, 0)
CreateSprite3D(2, 0)
Sprite3DQuality(1)
TransparentSpriteColor(0, RGB(255, 0, 255)) ; Our pink is transparent :)
angle=-1
x1=320
y1=240
x2=x1+SpriteWidth(0)
x3=x2
x4=x1
y2=y1
y3=y1+SpriteHeight(0)
y4=y3
largeur=SpriteWidth(0)
Repeat
; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
FlipBuffers()
ClearScreen(RGB(0,50,128))
; Draw our sprite
StartDrawing(ScreenOutput())
DrawText(100,0,"Largeur : "+Str(largeur))
DrawText(100,20,"x1 : "+Str(x1))
DrawText(320,0,"x2 : " + Str(x2))
DrawText(320,20,"x3 : " + Str(x3))
DrawText(320,40,"ang: " + Str(angle))
StopDrawing()
;
If Start3D()
DisplaySprite3D(0, 0, 30)
;DisplaySprite3D(0, x+100, 100, x)
;DisplaySprite3D(0, x*2, 100, x)
; Zoom..
;
;ZoomSprite3D(1, x, x)
;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)
DisplaySprite3D(1, 320,240)
x2+angle
x3+angle
TransformSprite3D(1,x1,y1,0,x2,y2,0,x3,y3,0,x4,y4,0)
Stop3D()
EndIf
ExamineKeyboard()
If x2=x1-largeur Or x2=x1+largeur
angle*-1
EndIf
Until KeyboardPushed(#PB_Key_Escape)
Else
MessageRequester("Error", "Can't open a 640*480 - 16 bit screen !", 0)
EndIf
End
Si je me représente l'affichage de mon Sprite3D, j'imagine ça :
donc pour moi, pour faire un effet de rotation sur lui même en 2D, il me suffisait de déplacer les X2 et X3 progressivement vers la droite, puis vers la gauche (une fois affiché complètement à l'envers).
J'ai mal compris Docteur ?
merci pour vos explications
Re: TransformSprite3D : explication concrète demandée
j'avais fait un truc dans le genre a une epoque epique, lointaineTazNormand a écrit :ce que je cherche à faire, c'est une scrolling-text (encore un), dont les lettres donneraient l'impression de tourner autour d'un rouleau, où on les verrait "de dos" à un moment donné de la rotation. Je sais pas si c'est clair ce que je dis.

Code : Tout sélectionner
; auteur DOBRO http://michel.dobro.free.fr/
LoadFont(1, "arial", 50 )
LoadFont(2, "arial", 50 )
Resultat = InitSprite()
Global Angle,amplitude
amplitude=25
Texte.s="Pure Basic 4.40 !"
WindowID = OpenWindow(1, 50, 50, 640, 200, "hello", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget )
OpenWindowedScreen(WindowID, 0, 0, 640, 200, 1, 0, 0)
CreateImage(100, 640, 100)
StartDrawing( ImageOutput(100))
FrontColor(RGB($0,$FF,$FF))
BackColor(RGB(0, 0, 0))
DrawingFont(FontID(1))
DrawingMode(1)
DrawText(0,0,Texte.s)
StopDrawing()
For t=0 To 100
GrabImage(100, t, 0, t, 640,1)
Next t
Repeat
For y= 0 To 100
StartDrawing(ScreenOutput())
Angle+1 :If Angle=360*100: Angle=0 :EndIf
x=1+(1*Cos(Angle*2*3.1415926/100)*amplitude)+40
x1=1+(1*Sin(Angle*2*3.1415926/100)*amplitude*5)+40
DrawImage( ImageID(y), x+40, x1+y,640,1)
StopDrawing()
dep+1 :If dep>640 :dep=-100:EndIf
Next y
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
Event=WindowEvent()
Delay(1)
Until Event=#PB_Event_CloseWindow
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Re: TransformSprite3D : explication concrète demandée
Bon désolé de ressortir ce vieux topic, mais jene m'en sors pas avec cette fichue commande TransformSprite3D.
Je ne connais rien en Trigo, et je n'arrive pas à faire ce que je veux.
Qui peut m'expliquer comment utiliser cette fonction pour pouvoir faire faire une rotation sur l'axe Y d'un sprite.
merci d'avance
Je ne connais rien en Trigo, et je n'arrive pas à faire ce que je veux.
Qui peut m'expliquer comment utiliser cette fonction pour pouvoir faire faire une rotation sur l'axe Y d'un sprite.
merci d'avance
Re: TransformSprite3D : explication concrète demandée
En le modifiant un peu on obtiens un effet de déformation genre "reflet" assez funDobro a écrit : j'avais fait un truc dans le genre a une epoque epique, lointaine![]()
Code : Tout sélectionner
LoadFont(1, "arial", 50 )
Resultat = InitSprite()
Global Angle,amplitude
amplitude=3
Texte.s="OH UN REFLET"
WindowID = OpenWindow(1, 50, 50, 600, 200, "hello", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget )
OpenWindowedScreen(WindowID, 0, 0, 640, 200, 1, 0, 0)
CreateImage(100, 600, 100)
StartDrawing( ImageOutput(100))
FrontColor(RGB($FF,$CC,$00))
BackColor(RGB(0, 0, 0))
DrawingFont(FontID(1))
DrawingMode(1)
DrawText(0,0,Texte.s)
StopDrawing()
For t=0 To 100 step 2
GrabImage(100, t, 0, t, 640,1)
Next t
Repeat
For y= 0 To 100 step 2
For i = 1 to 12
StartDrawing(ScreenOutput())
Angle+i :If Angle=360*100: Angle=0 :EndIf
x=1+(1*Cos(Angle*2*3.1415926/100)*amplitude)+40
x1=1+(1*Sin(Angle*2*3.1415926/100)*amplitude*5)+40
DrawImage( ImageID(y), x+40, x1+y,640,1)
StopDrawing()
dep+1 :
If dep>600
:dep=-100
EndIf
Next i
Next y
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
Event=WindowEvent()
Delay(1)
Until Event=#PB_Event_CloseWindow

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: TransformSprite3D : explication concrète demandée
pas mal en effet 

Re: TransformSprite3D : explication concrète demandée
Un truc vite fait à partir de vieux sources (sinon le mieux pour les exemples c la lib supersprite3d de cpl, j'en ai une copie)
Code : Tout sélectionner
;
; ------------------------------------------------------------
;
;
; ------------------------------------------------------------
;
Structure vector
x.f
y.f
z.f
EndStructure
Procedure vector_rotate(*vertex.vector, tangage.f, cap.f, roulis.f)
If roulis <> 0
x.f = Cos(roulis) * *vertex\x - Sin(roulis) * *vertex\z
*vertex\z = Sin(roulis) * *vertex\x + Cos(roulis) * *vertex\z
*vertex\x = x
EndIf
If tangage <> 0
y.f = Cos(tangage) * *vertex\y - Sin(tangage) * *vertex\z
*vertex\z = Sin(tangage) * *vertex\y + Cos(tangage) * *vertex\z
*vertex\y = y
EndIf
If cap <> 0
x.f = Cos(cap) * *vertex\x - Sin(cap) * *vertex\y
*vertex\y = Sin(cap) * *vertex\x + Cos(cap) * *vertex\y
*vertex\x = x
EndIf
EndProcedure
Dim vertices.vector(4)
Define.f tangage, cap, roulis
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Error", "Sprite system can't be initialized", 0)
End
EndIf
If InitSprite3D() = 0
MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
End
EndIf
;
; Now, open a 640*480 - 16 bits (65000 colours) screen
;
If OpenScreen(1024, 768, 32, "Sprite")
; Load our 16 bit sprite (which is a 24 bit picture in fact, as BMP doesn't support 16 bit format)
;
LoadSprite(0, "Data/Geebee2.bmp", #PB_Sprite_Texture|#PB_Sprite_Alpha )
CreateSprite3D(0, 0)
CreateSprite3D(1, 0)
Sprite3DQuality(1)
TransparentSpriteColor(0, RGB(255, 0, 255)) ; Our pink is transparent :)
Repeat
; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)
FlipBuffers()
ClearScreen(RGB(0,50,128))
tangage + 0.1
angle.f = #PI + #PI / 4
For i = 0 To 3
;calcule un simple carré
vertices(i)\x = 64 * Sin(angle)
vertices(i)\y = 64 * Cos(angle)
vertices(i)\z = 0
angle - ((2*#PI)/4) ;prochain angle du carré
vector_rotate(vertices(i), tangage.f, cap.f, roulis.f)
Next i
; Draw our sprite
;
If Start3D()
TransformSprite3D(0, vertices(0)\x, vertices(0)\y, vertices(1)\x, vertices(1)\y, vertices(2)\x, vertices(2)\y, vertices(3)\x, vertices(3)\y)
DisplaySprite3D(0, 256, 256)
Stop3D()
EndIf
ExamineKeyboard()
x+1
Until KeyboardPushed(#PB_Key_Escape)
Else
MessageRequester("Error", "Can't open a 640*480 - 16 bit screen !", 0)
EndIf
End
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Re: TransformSprite3D : explication concrète demandée
Merci à tous
@ Djes, je veux bien un zip/rar avec ta copie de la librairie SuperSprite3D de G-Rom/Cpl.Bator.
Il m'avait donné un source qu'il avait retrouvé, si ta version est la même je vais tâcher de vraiment la comprendre
.
Je suis un peu vert de ne pas m'en être sorti avec cette fonction, elle devait déjà me servir pour le PurePunch 4, et je viens encore de rater la Summer 2010
.
Faut que je me bouge le c
l pour la prochaine compét.
encore
@ Djes, je veux bien un zip/rar avec ta copie de la librairie SuperSprite3D de G-Rom/Cpl.Bator.
Il m'avait donné un source qu'il avait retrouvé, si ta version est la même je vais tâcher de vraiment la comprendre

Je suis un peu vert de ne pas m'en être sorti avec cette fonction, elle devait déjà me servir pour le PurePunch 4, et je viens encore de rater la Summer 2010

Faut que je me bouge le c

encore

Re: TransformSprite3D : explication concrète demandée
Sinon, c'est relativement simple, avec cette commande on donne les coordonnées X et Y (le Z ne fonctionne pas), que l'on veut à chaque coin du sprite. Du coup on peut les calculer indépendamment soi-même, par exemple en 3d, comme je le fais dans mon exemple. Par contre, il apparait souvent des déformations quand on déforme un peu trop, du fait que les sprites sont composés de deux triangles.