Page 1 sur 3

[REGLE] Sprite3D & Rotation

Publié : mer. 27/sept./2006 9:42
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 ?

Publié : mer. 27/sept./2006 12:42
par Anonyme
cela me fait la même chose, utilise des sprites multiple de 2 uniquement est fait le rotate avant le display.

@++

Publié : mer. 27/sept./2006 13:04
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 ?

Publié : mer. 27/sept./2006 13:08
par Anonyme
Bah, tu les fait carré puis tu les recentres suivant leurs tailles.

@++

Publié : mer. 27/sept./2006 17:58
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

Publié : mer. 11/oct./2006 22:55
par Anonyme
Alors , tu as trouvé ?

@++

Publié : lun. 20/nov./2006 11:52
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 !

Publié : lun. 20/nov./2006 12:36
par Anonyme
Fait voir a quoi ressemble ton sprite rectangulaire.

Publié : lun. 20/nov./2006 14:10
par Progi1984
C'est un sprite quelconque de 64 * 96 !

Publié : lun. 20/nov./2006 14:14
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!

Publié : lun. 20/nov./2006 14:18
par Progi1984
Je sais que c'est parce qu'il est rectangulaire ! Mais je cherche une solution sans modifier les sprites !

Publié : lun. 20/nov./2006 15:03
par Anonyme
une solution consisterais à modifier directement les vertices de chaque sprite3D, je fais des essais, et je te tiens au courant.

Publié : lun. 20/nov./2006 15:31
par Progi1984
oki Merci beaucoup !

Publié : lun. 20/nov./2006 15:35
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)


Publié : lun. 20/nov./2006 15:55
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)