[REGLE] Sprite3D & Rotation

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

[REGLE] Sprite3D & Rotation

Message par Progi1984 »

Bonjour, j'utilise un petite map pour afficher différents sprites3D.

Je charge mes sprites carrés (multiples ou non de 2), pas de problème lors de rotation.

Je charge un de mes sprites rectangles, si je fais un simple rotatesprite3d avec angle=0, bah mon sprite3D devient carré et est affiché avec une rotation d'environ -15°.

Que se passe t il ?
Dernière modification par Progi1984 le jeu. 23/nov./2006 9:31, modifié 1 fois.
Anonyme

Message par Anonyme »

cela me fait la même chose, utilise des sprites multiple de 2 uniquement est fait le rotate avant le display.

@++
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Je fais toujours le rotate avant le display quoiqu'il en soit ! Mais je suis ibligé d'utiliser des tiles rectangulaires ... comment faire ?
Anonyme

Message par Anonyme »

Bah, tu les fait carré puis tu les recentres suivant leurs tailles.

@++
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Progi1984 a écrit :Je fais toujours le rotate avant le display quoiqu'il en soit ! Mais je suis ibligé d'utiliser des tiles rectangulaires ... comment faire ?
Avec ClipSprite3D... Cherches sur le forum ;)

Dri
Anonyme

Message par Anonyme »

Alors , tu as trouvé ?

@++
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Non, je n'ai pas trouvé !

Je m'y rattaque en ce moment !

@Dri : Je ne comprends pas pourquoi tu me demandes d'utiliser ClipSprite3D !
Anonyme

Message par Anonyme »

Fait voir a quoi ressemble ton sprite rectangulaire.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

C'est un sprite quelconque de 64 * 96 !
Anonyme

Message par Anonyme »

le problème est là , 64*96 déconne avec les rotations, il faut qu'il soit en 96x96, ensuite du fait un décalage pour recentrer ton sprite là ou il faut!
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Je sais que c'est parce qu'il est rectangulaire ! Mais je cherche une solution sans modifier les sprites !
Anonyme

Message par Anonyme »

une solution consisterais à modifier directement les vertices de chaque sprite3D, je fais des essais, et je te tiens au courant.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

oki Merci beaucoup !
Anonyme

Message par Anonyme »

Modifie la ligne 113 pour mettre ton sprite, par contre ca bug avec d'autre sprite3D :? peut être par ce que j'ai rajouté des champs ds la structure PB_Sprite3D ?
mais bon, je t'ai mis sur la voie je pense.

@++

Code : Tout sélectionner

Structure vertex
    sx.f
    sy.f
    sz.f
    rhw.f
    Color.l
    specular.l
    tu.f
    tv.f
EndStructure

Structure PB_Sprite3D
     Texture.l          
     Vertice.vertex[4] 
     Width.w
     Height.w
     AA.f:AB.f:AC.f:AD.f
     DA.f:DB.f:DC.f:DD.f
EndStructure


#Deg = #PI/180

Procedure Distance(x1,y1,x2,y2)
Protected Result.f
Result = Sqr(  Pow(x1-x2,2) + Pow(y1-y2,2) + Pow(z1-z2,2) )
ProcedureReturn Result
EndProcedure


Procedure ReturnAngle(x1,y1,x2,y2)
Protected Distance.l,Xa.l,Ya.l

Distance = Distance(x1,y1,x2,y2)

For A = 0 To 360

Xa = x1 + Distance * Cos(A*#Deg)
Ya = y1 + Distance * Sin(A*#Deg)

If Xa > x2 -5 And Xa < x2 + 5
 If Ya > y2 -5 And Ya < y2 + 5
  ProcedureReturn A
 EndIf
EndIf

Next A


EndProcedure







Procedure CreateSprite3DEX(Sprite3D)
Protected *VertexSprite.PB_Sprite3D = IsSprite3D(SpriteID)

SizeW.f = *VertexSprite\Width/2
SizeH.f = *VertexSprite\Height/2

*VertexSprite\AA = ReturnAngle(*VertexSprite\Vertice[0]\sx,*VertexSprite\Vertice[0]\sy,SizeW,SizeH)
*VertexSprite\AB = ReturnAngle(*VertexSprite\Vertice[1]\sx,*VertexSprite\Vertice[1]\sy,SizeW,SizeH)
*VertexSprite\AC = ReturnAngle(*VertexSprite\Vertice[2]\sx,*VertexSprite\Vertice[2]\sy,SizeW,SizeH)
*VertexSprite\AD = ReturnAngle(*VertexSprite\Vertice[3]\sx,*VertexSprite\Vertice[3]\sy,SizeW,SizeH)

*VertexSprite\DA = Distance(*VertexSprite\Vertice[0]\sx,*VertexSprite\Vertice[0]\sy,SizeW,SizeH) 
*VertexSprite\DB = Distance(*VertexSprite\Vertice[1]\sx,*VertexSprite\Vertice[1]\sy,SizeW,SizeH) 
*VertexSprite\DC = Distance(*VertexSprite\Vertice[2]\sx,*VertexSprite\Vertice[2]\sy,SizeW,SizeH) 
*VertexSprite\DD = Distance(*VertexSprite\Vertice[3]\sx,*VertexSprite\Vertice[3]\sy,SizeW,SizeH) 

EndProcedure



Procedure RotateSprite3DEX(SpriteID,Angle.f,x.f,y.f)
Protected *VertexSprite.PB_Sprite3D = IsSprite3D(SpriteID)
Protected CenterX.f,CenterY.f,SizeW2.l,SizeH2.l

CenterX = x
CenterY = y

SizeW = *VertexSprite\Width
SizeH = *VertexSprite\Height

SizeW2 = *VertexSprite\Width/2
SizeH2 = *VertexSprite\Height/2


      *VertexSprite\Vertice[0]\sx = x - *VertexSprite\DA  * Cos((Angle+*VertexSprite\AA)*#PI/180)
      *VertexSprite\Vertice[0]\sy = y - *VertexSprite\DA  * Sin((Angle+*VertexSprite\AA)*#PI/180)
       
      *VertexSprite\Vertice[1]\sx = x - *VertexSprite\DB  * Cos((Angle+*VertexSprite\AB)*#PI/180)
      *VertexSprite\Vertice[1]\sy = y - *VertexSprite\DB  * Sin((Angle+*VertexSprite\AB)*#PI/180)
                           ; ;         
     *VertexSprite\Vertice[3]\sx =  x - *VertexSprite\DD  * Cos((Angle+*VertexSprite\AD)*#PI/180)
     *VertexSprite\Vertice[3]\sy =  y - *VertexSprite\DD  * Sin((Angle+*VertexSprite\AD)*#PI/180)
                              ; ;                       
     *VertexSprite\Vertice[2]\sx =  x - *VertexSprite\DC  * Cos((Angle+*VertexSprite\AC)*#PI/180)     
     *VertexSprite\Vertice[2]\sy =  y - *VertexSprite\DC  * Sin((Angle+*VertexSprite\AC)*#PI/180)  
                                     
EndProcedure




InitSprite() : InitSprite3D() : InitKeyboard()
OpenScreen(800,600,32,"")


LoadSprite(0,"spr.bmp",#PB_Sprite_Texture)
CreateSprite3D(0,0)
CreateSprite3DEX(0)



Repeat
r.f+0.05
 ExamineKeyboard()
 ClearScreen(0)
 Start3D()
 
 RotateSprite3DEX(0,r,48,32)
 DisplaySprite3D(0,100,100)
 Stop3D()
 
 
 StartDrawing(ScreenOutput())
 Line(100,100,96,0,RGB(255,0,0))
 Line(100,100,0,64,RGB(255,0,0))
 Line(196,100,0,64,RGB(255,0,0))
 Line(196,164,-96,0,RGB(255,0,0))
 
 StopDrawing()
 
 FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

Anonyme

Message par Anonyme »

c'est corrigé :D

LoadSprite(0,"spr.bmp",#PB_Sprite_Texture)
CreateSprite3D(0,0)
A = CreateSprite3DEX(0)


A contiendra ton Sprite3DEX

RotateSprite3DEX(A,angle.f,48,32)

les deux derniers chiffre represente le point de pivot du sprite (relatif au sprite)

Code : Tout sélectionner

#Deg = #PI/180

Structure vertex
    sx.f
    sy.f
    sz.f
    rhw.f
    Color.l
    specular.l
    tu.f
    tv.f
EndStructure

Structure PB_Sprite3D
     Texture.l          
     Vertice.vertex[4] 
     Width.w
     Height.w

EndStructure

Structure PB_Sprite3DEX
No.l
AA.f:AB.f:AC.f:AD.f
DA.f:DB.f:DC.f:DD.f
EndStructure





Procedure Distance(x1,y1,x2,y2)
Protected Result.f
Result = Sqr(  Pow(x1-x2,2) + Pow(y1-y2,2) + Pow(z1-z2,2) )
ProcedureReturn Result
EndProcedure


Procedure ReturnAngle(x1,y1,x2,y2)
Protected Distance.l,Xa.l,Ya.l

Distance = Distance(x1,y1,x2,y2)

For A = 0 To 360

Xa = x1 + Distance * Cos(A*#Deg)
Ya = y1 + Distance * Sin(A*#Deg)

If Xa > x2 -5 And Xa < x2 + 5
 If Ya > y2 -5 And Ya < y2 + 5
  ProcedureReturn A
 EndIf
EndIf

Next A


EndProcedure







Procedure CreateSprite3DEX(Sprite3D)
Protected *VertexSprite.PB_Sprite3D = IsSprite3D(SpriteID)
Protected *VertexSpriteEX.PB_Sprite3DEX = AllocateMemory(SizeOf(PB_Sprite3DEX))

*VertexSpriteEX\No = Sprite3D

SizeW.f = *VertexSprite\Width/2
SizeH.f = *VertexSprite\Height/2

*VertexSpriteEX\AA = ReturnAngle(*VertexSprite\Vertice[0]\sx,*VertexSprite\Vertice[0]\sy,SizeW,SizeH)
*VertexSpriteEX\AB = ReturnAngle(*VertexSprite\Vertice[1]\sx,*VertexSprite\Vertice[1]\sy,SizeW,SizeH)
*VertexSpriteEX\AC = ReturnAngle(*VertexSprite\Vertice[2]\sx,*VertexSprite\Vertice[2]\sy,SizeW,SizeH)
*VertexSpriteEX\AD = ReturnAngle(*VertexSprite\Vertice[3]\sx,*VertexSprite\Vertice[3]\sy,SizeW,SizeH)

*VertexSpriteEX\DA = Distance(*VertexSprite\Vertice[0]\sx,*VertexSprite\Vertice[0]\sy,SizeW,SizeH) 
*VertexSpriteEX\DB = Distance(*VertexSprite\Vertice[1]\sx,*VertexSprite\Vertice[1]\sy,SizeW,SizeH) 
*VertexSpriteEX\DC = Distance(*VertexSprite\Vertice[2]\sx,*VertexSprite\Vertice[2]\sy,SizeW,SizeH) 
*VertexSpriteEX\DD = Distance(*VertexSprite\Vertice[3]\sx,*VertexSprite\Vertice[3]\sy,SizeW,SizeH) 
ProcedureReturn *VertexSpriteEX
EndProcedure



Procedure RotateSprite3DEX(*SpriteIDEX.PB_Sprite3DEX,Angle.f,x.f,y.f)
Protected *VertexSprite.PB_Sprite3D = IsSprite3D(*SpriteIDEX\No)
Protected CenterX.f,CenterY.f,SizeW2.l,SizeH2.l

CenterX = x
CenterY = y

SizeW = *VertexSprite\Width
SizeH = *VertexSprite\Height

SizeW2 = *VertexSprite\Width/2
SizeH2 = *VertexSprite\Height/2


      *VertexSprite\Vertice[0]\sx = x - *SpriteIDEX\DA  * Cos((Angle+*SpriteIDEX\AA)*#PI/180)
      *VertexSprite\Vertice[0]\sy = y - *SpriteIDEX\DA  * Sin((Angle+*SpriteIDEX\AA)*#PI/180)
                                                               
      *VertexSprite\Vertice[1]\sx = x - *SpriteIDEX\DB  * Cos((Angle+*SpriteIDEX\AB)*#PI/180)
      *VertexSprite\Vertice[1]\sy = y - *SpriteIDEX\DB  * Sin((Angle+*SpriteIDEX\AB)*#PI/180)
                                                                  
      *VertexSprite\Vertice[3]\sx = x - *SpriteIDEX\DD  * Cos((Angle+*SpriteIDEX\AD)*#PI/180)
      *VertexSprite\Vertice[3]\sy = y - *SpriteIDEX\DD  * Sin((Angle+*SpriteIDEX\AD)*#PI/180)
                                                                    
      *VertexSprite\Vertice[2]\sx = x - *SpriteIDEX\DC  * Cos((Angle+*SpriteIDEX\AC)*#PI/180)     
      *VertexSprite\Vertice[2]\sy = y - *SpriteIDEX\DC  * Sin((Angle+*SpriteIDEX\AC)*#PI/180)  
                                     
EndProcedure




InitSprite() : InitSprite3D() : InitKeyboard()
OpenScreen(800,600,32,"")


LoadSprite(0,"spr.bmp",#PB_Sprite_Texture)
CreateSprite3D(0,0)
A = CreateSprite3DEX(0)
; 
 LoadSprite(1,"spr.bmp",#PB_Sprite_Texture)
 CreateSprite3D(1,1)
;b = CreateSprite3DEX(1)


 

Repeat
r.f+0.05
 ExamineKeyboard()
 ClearScreen(0)
 Start3D()
 
 RotateSprite3DEX(A,r,48,32)
  DisplaySprite3D(0,100,100)
    DisplaySprite3D(1,200,200)
 Stop3D()
 
 
 StartDrawing(ScreenOutput())
 Line(100,100,96,0,RGB(255,0,0))
 Line(100,100,0,64,RGB(255,0,0))
 Line(196,100,0,64,RGB(255,0,0))
 Line(196,164,-96,0,RGB(255,0,0))
 
 StopDrawing()
 
 FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)



Répondre