Page 1 sur 3

TransformSprite3D : explication concrète demandée

Publié : lun. 21/sept./2009 15:59
par TazNormand
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

Re: TransformSprite3D : explication concrète demandée

Publié : lun. 21/sept./2009 19:34
par Anonyme
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 ;)

Re: TransformSprite3D : explication concrète demandée

Publié : lun. 21/sept./2009 20:04
par TazNormand
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...

Re: TransformSprite3D : explication concrète demandée

Publié : lun. 21/sept./2009 20:18
par Anonyme
Merde , Purestorage est fermé , plop les sources... si Dobro à une copie sur son DD :D

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?? :mrgreen: , bah , y a que de la 2D et de la trigo la dedans ^^

Re: TransformSprite3D : explication concrète demandée

Publié : mar. 22/sept./2009 9:17
par kernadec
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

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

Publié : mer. 23/sept./2009 10:17
par Anonyme
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


Re: TransformSprite3D : explication concrète demandée

Publié : mer. 23/sept./2009 10:26
par TazNormand
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 :D

merci encore

Re: TransformSprite3D : explication concrète demandée

Publié : jeu. 24/sept./2009 16:06
par TazNormand
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 :oops: ), 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 :

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
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 :
Image

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

Publié : jeu. 24/sept./2009 16:16
par Backup
TazNormand a écrit :ce que je cherche à faire, c'est une scrolling-text (encore un :oops: ), 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'avais fait un truc dans le genre a une epoque epique, lointaine ;)

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 

Re: TransformSprite3D : explication concrète demandée

Publié : dim. 29/août/2010 18:22
par TazNormand
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

Re: TransformSprite3D : explication concrète demandée

Publié : dim. 29/août/2010 18:50
par Ar-S
Dobro a écrit : j'avais fait un truc dans le genre a une epoque epique, lointaine ;)
En le modifiant un peu on obtiens un effet de déformation genre "reflet" assez fun

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  
Image

Re: TransformSprite3D : explication concrète demandée

Publié : dim. 29/août/2010 19:16
par Backup
pas mal en effet :)

Re: TransformSprite3D : explication concrète demandée

Publié : dim. 29/août/2010 19:24
par djes
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   

Re: TransformSprite3D : explication concrète demandée

Publié : jeu. 02/sept./2010 6:19
par TazNormand
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 Image.

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 :cry: .

Faut que je me bouge le c :oops: l pour la prochaine compét.

encore Image

Re: TransformSprite3D : explication concrète demandée

Publié : jeu. 02/sept./2010 12:55
par djes
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.