Page 1 sur 1

problème avec RotateSprites3D()

Publié : sam. 20/mars/2010 19:52
par case
sur mon pc lorsque je lance ce code, le sprite 3D de droite qui a subis une rotation de 360° apparait partiellement en dehors de l'écran
je ne suis pas vraiment familier avec la 3D est-ce normal ou est-ce un bug ?

Code : Tout sélectionner

InitSprite()
InitSprite3D()
Global main     =OpenWindow(#PB_Any,80,120,1280,900,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Global scr      =OpenWindowedScreen(WindowID(main),0,0,WindowWidth(main),WindowHeight(main),0,0,0)
; cree un sprite de 32x64 pixels
CreateSprite(0,32,64,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
Box(0,0,32,32,$ff00ff)
Box(0,32,32,32,$ffff00)
StopDrawing()
CreateSprite3D(0,0)
CreateSprite3D(1,0)
CreateSprite3D(2,0)
CreateSprite3D(3,0)
CreateSprite3D(4,0)
CreateSprite3D(5,0)
;
RotateSprite3D(1,90,0)
RotateSprite3D(2,180,0)
RotateSprite3D(3,270,0)
RotateSprite3D(4,360,0)
;
a=1
Repeat 
  ClearScreen(0)
  Start3D()
    DisplaySprite3D(0,0,0)
    DisplaySprite3D(1,64,0)    
    DisplaySprite3D(2,128,0)    
    DisplaySprite3D(3,192,0)    
    DisplaySprite3D(4,256,0)        
    DisplaySprite3D(5,320,64)
    counter+1
    If counter=250
      A=-A
      counter=0
      RotateSprite3D(5,A,1)    
    EndIf
    ;
    DisplaySprite3D(1,0,128)    
    DisplaySprite3D(2,0,192)    
    DisplaySprite3D(3,0,256)    
    DisplaySprite3D(4,0,320)        
  Stop3D()
  StartDrawing(ScreenOutput()) 
      DrawText(0,96,"0°")
      DrawText(64,96,"90°")
      DrawText(128,96,"180°")
      DrawText(192,96,"270°")
      DrawText(256,96,"360°")
      ;                  
      DrawText(128,128,"90°")
      DrawText(128,192,"180°")
      DrawText(128,256,"270°")
      DrawText(128,320,"360°")
      ;      
      DrawText(380,64,"probleme des que le sprite 'tourne' l'affichage se decale ")
      DrawText(380,80,"se produira quand le compteur "+Str(250-counter)+" atteind zero")      
  StopDrawing()
  FlipBuffers()
Until WaitWindowEvent(1)=#PB_Event_CloseWindow

Re: problème avec RotateSprites3D()

Publié : dim. 21/mars/2010 1:12
par beauregard
case a écrit :sur mon pc lorsque je lance ce code, le sprite 3D de droite qui a subis une rotation de 360° apparait partiellement en dehors de l'écran
je ne suis pas vraiment familier avec la 3D est-ce normal ou est-ce un bug ?
pas testé (sans images...), tu as mis RotateSprite3D(5,A,1) après l'affichageDisplaySprite3D(5,320,64), et non avant. Faut faire comme çà:

RotateSprite3D(5,A,1)
DisplaySprite3D(5,320,64)

suivis même d'un:
RotateSprite3D(5, 0,1) ;remise à 0 de la rotation
Dans le cas d'une utilisation future de clipsprite3D, avec planche d'images.

Si tu compte afficher beaucoup de sprites, comme tu le sais tu aura besoin d'une bonne liste chainée.

ps: sur une vieille machine, le 64*64 tu utilisera.

Amitié à tes copines voluptueuses.

Re: problème avec RotateSprites3D()

Publié : dim. 21/mars/2010 2:35
par case
beauregard a écrit : pas testé (sans images...), tu as mis RotateSprite3D(5,A,1) après l'affichageDisplaySprite3D(5,320,64), et non avant. Faut faire comme çà:

RotateSprite3D(5,A,1)
DisplaySprite3D(5,320,64)

suivis même d'un:
RotateSprite3D(5, 0,1) ;remise à 0 de la rotation
Dans le cas d'une utilisation future de clipsprite3D, avec planche d'images.

Si tu compte afficher beaucoup de sprites, comme tu le sais tu aura besoin d'une bonne liste chainée.

ps: sur une vieille machine, le 64*64 tu utilisera.

Amitié à tes copines voluptueuses.
bah en fait pas besoin d'images je génère les images avec des box au début du code, pas de souci donc le code se lance avec un copier coller je vais pas demander de l'aide sur un truc qu'on peux pas vérifier tout de suite ,)

c'est flagrant avec le sprite a droite avec le décompte il bondit vers une autre coordonné sur l'écran. c'est un peu gênant, car du coup si je le place en 0,0 sur l'écran il manque un gros bout du sprite :) meme si pb change la taille du sprite pour laisser de l'espace autour pour sa rotation, il devrait rester a la même place sur l'écran il me semble ;)


merci en tout cas d'avoir regardé :)

Re: problème avec RotateSprites3D()

Publié : dim. 21/mars/2010 11:08
par kernadec
bonjour Case
je connais rien aux Sprites
peut être une solution

Cordialement

Code : Tout sélectionner

InitSprite()
InitSprite3D()
Global main     =OpenWindow(#PB_Any,80,120,1280,900,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Global scr      =OpenWindowedScreen(WindowID(main),0,0,WindowWidth(main),WindowHeight(main),0,0,0)
; cree un sprite de 32x64 pixels
CreateSprite(0,32,64,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
Box(0,0,32,32,$ff00ff)
Box(0,32,32,32,$ffff00)
StopDrawing()
CreateSprite3D(0,0)
CreateSprite3D(1,0)
CreateSprite3D(2,0)
CreateSprite3D(3,0)
CreateSprite3D(4,0)
CreateSprite3D(5,0)
;
RotateSprite3D(1,90,0)
RotateSprite3D(2,180,0)
RotateSprite3D(3,270,0)
RotateSprite3D(4,360,0)
RotateSprite3D(5,360,0)
;
a=1
Repeat 
	ClearScreen(0)
	Start3D()
		DisplaySprite3D(0,0,0)
		DisplaySprite3D(1,64,0)    
		DisplaySprite3D(2,128,0)    
		DisplaySprite3D(3,192,0)    
		DisplaySprite3D(4,256,0)
		A=320
		DisplaySprite3D(5,A,64)
		counter+1
		If counter=250
			A=-A
			counter=0
			RotateSprite3D(5,A-220,1)    
		EndIf
		;
		; à voir boucle elastique
		; DisplaySprite3D(5,320,64)
    ; counter+1
    ;If counter=4
    ;  A=A+1
    ;  counter=0
    ;  RotateSprite3D(5,A,1)   
    ;EndIf
		DisplaySprite3D(1,0,128)    
		DisplaySprite3D(2,0,192)    
		DisplaySprite3D(3,0,256)    
		DisplaySprite3D(4,0,320)        
	Stop3D()
	StartDrawing(ScreenOutput()) 
			DrawText(0,96,"0°")
			DrawText(64,96,"90°")
			DrawText(128,96,"180°")
			DrawText(192,96,"270°")
			DrawText(256,96,"360°")
			;                  
			DrawText(128,128,"90°")
			DrawText(128,192,"180°")
			DrawText(128,256,"270°")
			DrawText(128,320,"360°")
			;      
			DrawText(380,64,"probleme des que le sprite 'tourne' l'affichage se decale ")
			DrawText(380,80,"se produira quand le compteur "+Str(250-counter)+" atteind zero")      
	StopDrawing()
	FlipBuffers()
Until WaitWindowEvent(1)=#PB_Event_CloseWindow


Re: problème avec RotateSprites3D()

Publié : dim. 21/mars/2010 12:28
par djes
Confirmé. Ça le fait aussi en DirectX7, et en OpenGL c'est pire, mais ça ne le fait pas si le sprite est carré. T'aurais pu mettre ton compteur à 25 quand même ;)

Re: problème avec RotateSprites3D()

Publié : dim. 21/mars/2010 12:48
par G-Rom
en 64x64 , ca marche sans problème , le point clé avec les sprites 3D c'est la taille n² !

@+

Re: problème avec RotateSprites3D()

Publié : dim. 21/mars/2010 13:03
par kernadec
bonjour
comprend pas, J'avais mis une rotation de 180
RotateSprite3D(5,A-220,1)
mais si on met A simplement ça tourne bien sans décalage dans le code que précédent.

cordialement

Re: problème avec RotateSprites3D()

Publié : dim. 21/mars/2010 13:14
par case
malheureusement ca ne résous rien au problème kernadec ,)

le sprite n'est pas affiché a l'endroit ou il devrait etre, trace un rectangle a l'emplacement ou il devrait etre tu verra :)

je pense que pb corrige la position de l'origine du sprite pour compenser l'agrandissement de la surface de celui ci . mais il le fait sur des coordonées carrée
en calculant l'abscisse et l'ordonnée que par rapport a la largeur du sprite mais pas les deux...

si le sprite fait 32x64 a la base , lors de la rotation la taille de la surface du sprite est modifiée de n pixels

donc maintenant elle fait 64x64 ,16 pixel de plus de chaque coté a droite et a gauche (je simplifie car en fait ce doit même un peu plus a cause des angles qui dépassent) pour que l'affichage ne soit pas décalé, pb corrige la coordonnée d'origine du sprite pour que le centre de l'objet en rotation soit affiché toujours au même endroit. en ajoutant la moitié de la taille ajoutée a la coordonnée dans le cas d'un sprite carré ou x=y pas de souci, la nouvelle taille est la même des deux cotes, dans le cas d'un sprite rectangulaire par contre...

pb peut être dans un souci de préserver de la vitesse semble n'utiliser que la largeur comme référence donc dans mon exemple x=x+16 ; y=y+16 alors qu'en fait mon sprite d'origine faisant deja 64 pixel de haut le décalage vertical devrait être de zéro et donc comme l'origine est incrémentée de 16 pixel, le sprite se décale d'autant vers le haut...

en fait j'ai pour habitude de faire des sprites carres a la base ,) cependant j'ai eu besoin de faire des rotations sur des objets rectangulaires pour un éditeur de
carte pour un jeu de plateau ...

cependant en effet la doc précise bien que les sprites 3D doivent êtres carres. donc on ne peux pas parler d'un bug ,) puisque c'est clairement precisé.

Re: problème avec RotateSprites3D()

Publié : dim. 21/mars/2010 13:45
par kernadec
merci Case pour l'explication.


cordialement

Re: problème avec RotateSprites3D()

Publié : dim. 21/mars/2010 20:12
par Le Soldat Inconnu
D'accord avec l'explication de case, si le sprite n'est pas carré, PB agrandit le sprite pour ensuite faire la rotation.

Donc après, tu peux garder un sprite non-carré mais a toi de corriger la position de ton sprite en fonction de sa dimension quand tu fais une rotation