[REGLE] Sprite3D & Rotation
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
[REGLE] Sprite3D & Rotation
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 ?
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.
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Je fais toujours le rotate avant le display quoiqu'il en soit ! Mais je suis ibligé d'utiliser des tiles rectangulaires ... comment faire ?
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
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 !
Je m'y rattaque en ce moment !
@Dri : Je ne comprends pas pourquoi tu me demandes d'utiliser ClipSprite3D !
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
C'est un sprite quelconque de 64 * 96 !
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Je sais que c'est parce qu'il est rectangulaire ! Mais je cherche une solution sans modifier les sprites !
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
oki Merci beaucoup !
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
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.
@++

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)
c'est corrigé 
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)

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)