Besoin d'une petite explication de code

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Besoin d'une petite explication de code

Message par Crystal Noir »

voilà, j'ai trouvé ca et j'y trouve super bien. Alors bien sur je compte faire quelques scènes démomaking, en m'inspirant de code que je trouve. Seulement je n'aime pas utiliser des codes que je pige pas, ca sert à rien et ca n'a aucun mérite.

Sur le code suivant, je comprend tout, mise à part quelques détails, voilà, copiez coller ce code déjà pour voir ce que ca donne :

Code : Tout sélectionner

If InitSprite()=0 
  MessageRequester("Fatal Error!","Could not initalize directX",0) 
  End 
EndIf 
#screen_width.w=1024 
#screen_height.w=768 
If OpenScreen(#screen_width,#screen_height,16,"")=0 
  MessageRequester("Fatal Error!","Could not initalize the screen",0) 
  End 
EndIf 
If InitKeyboard()=0 
  MessageRequester("Fatal Error!","Could not initalize the keyboard",0) 
  End 
EndIf 
SetFrameRate(60) ;i put this in to keep the frame rate constant 
xmax.w=10000 
ymax.w=10000 
zmax.w=2000 
sspeed.w=-10 
zmin.w=10 
num.w=5000 ;get slow around 2500-3000 and i have 2.66 cpu 
centerx.w=#screen_width/2 
centery.w=#screen_height/2 
zoom.w=60 
shade.w=0 
Dim sx(num) 
Dim sy(num) 
Dim sz(num) 
For i=0 To num 
    sx(i)=Random(xmax)-xmax/2 
    sy(i)=Random(ymax)-ymax/2 
    sz(i)=Random(zmax) 
Next i 
Repeat 
StartDrawing(ScreenOutput()) 
  For i=0 To num 
    sz(i)=sz(i)+sspeed 
    If sz(i)<=zmin 
      sz(i)=zmax 
      sx(i)=Random(xmax)-xmax/2 
      sy(i)=Random(ymax)-ymax/2 
    EndIf 
    screenx.w=(sx(i)*zoom)/sz(i)+centerx 
    screeny.w=(-sy(i)*zoom)/sz(i)+centery 
    shade=Int(255/zmax* -sz(i)) 
    If screenx < #screen_width 
      If screeny < #screen_height 
        If screenx > 0 
          If screeny > 0 
           Plot(screenx,screeny,RGB(shade,shade,shade)) 
          EndIf 
        EndIf 
      EndIf 
    EndIf 
  Next i 
  StopDrawing() 
  FlipBuffers() 
  ClearScreen(0,0,0) 
  ExamineKeyboard() 
Until KeyboardReleased(#PB_Key_Escape) 
CloseScreen() 
End 
Ce que je pige pas c les formules utilisés à commencer par ceci :

Code : Tout sélectionner

sx(i)=Random(xmax)-xmax/2 


je vois quelle valeur ils utilisent mais comprend pas en quoi c indispensable (même en modifiant je vois bien que ca marche plus, mais pourquoi est ce ainsi ?)

idem pour ceci :

Code : Tout sélectionner

screenx.w=(sx(i)*zoom)/sz(i)+centerx 
Merci de votre aide.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

sx(i)=Random(xmax)-xmax/2
Tu fais ça à chaque fois que tu as besoin d'une valeur aléatoire qui varie de -x à x

pour ça il faut faire
Resultat=Random(x*2)-x

Exemple tu veux une valeur aléatoire qui varie entre -4 et 4
Resultat=Random(4*2)-4
Random va prendre une valeur entre 0 et 8
Si Random vaut 0 , Resultat = -4
Si Random vaut 8 , Resultat = 4
tu as bien une valeur comprise entre -4 et 4.

Pour revenir au code ,la formule permet d'obtenir une valeur aléatoire comprise entre -5000 et 5000 ( Xmax=10000)

Et ça , c'est encore une projection 3D>2D

Code : Tout sélectionner

    screenx.w=(sx(i)*zoom)/sz(i)+centerx 
    screeny.w=(-sy(i)*zoom)/sz(i)+centery 
Je te renvoie à des sites qui en parlent beaucoup mieux que je ne saurais le faire

http://raphaello.univ-fcomte.fr/ig/Visu ... sation.htm

http://www.mandragor.org/tutoriels/tuto ... d=5&chap=5
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

ouais sauf que la formule n'est pas random(xmax * 2) - xmax mais random(xmax) - xmax / 2 ? et si tu regardes les deux ne donnent pas du tout le même résultat. :?: :?:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'étais sûr que ça allait te troubler ,je pensais pourtant que ça te mettrait sur la voie .
tout à l'heure quand je parlais de
-x à x
random(x * 2) - x


Considère que dans le programme x=xmax/2

remplace x par xmax/2 dans random(x * 2) - x

et tu obtiens quoi ?
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

enfait la il prend un valeur entre -1/2Xmax et 1/2Xmax, c'est pour sa qu'il ne multipli pas par 2 dans le random mais qu'il divise par 2 apres..

imagine que xmax = 200
random(xmax) te pont un nombre entre 0 et 200 ensuite tu lui soustrait la moitier de xmax, ainsi si x > 100 : x > 0 et si x < 100 : x < 0
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

effectivement comtois, ca fait random(xmax) -xmax / 2

cédéravic : j'ai vu qu'on pouvait avoir ou des nbs positifs ou négatifs, oui,
effectivement.

cependant concrètement par rapport à nos étoiles ?

Merci en tout cas lol
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

tu es tenace :)


Ben par rapport à tes étoiles , l'auteur a décidé de faire un univers 3D qui varie de -5000 à 5000 , il répartit les étoiles dans cet espace .
Et ensuite c'est la projection 3D>2D qui se charge de transformer les coordonnées de l'univers 3D en coordonnées compatibles avec l'affichage sur un écran 2D.
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

oui c ce que j'ai cru comprendre, j'ai toujours du mal avec cette theorie de transformation des coordonnées. Et je vais dire pourquoi.

Ca va vous paraitre débile mais bon logiquement, dans un espace 3D tu as trois axes : x, y, z

Ca c pas dur.

Tu me dis qu'il a décidé de faire varier la position dans un univers -5000 et 5000 j'ai l'impression qu'on a que la moitié des choses lol

Car moi je veux bien transformer des coord 3D en 2D mais pour moi cette echelle -5000 5000 c pas des coordonnées. enfin tu vois ce que je veux dire ?

Je vous vois d'ici "pffff, mais il est débile ou quoi" loool
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Le troisième axe c'est z , il va de 0 à 2000

Pour bien comprendre regarde cette image ( tu peux en savoir plus en allant sur le site que je t'ai indiqué plus haut)

Image

dans cette image AB pourrait très bien représenter la dimension de ton univers 3D ( de - 5000 à 5000 , et 2000 pour z) , et tu auras à l'écran A'B' après projection.

Le plan de projection c'est ton écran :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

screenx.w=(sx(i)*zoom)/sz(i)+centerx
en fait, c'est simple, ici la transfo 3D/2D est une grosse astuce

on va d'abord simplié la formule précédente :
EcranX = EtoileX/EtoileZ
j'ai supprimé le zoom et la position du centre de l'écran

donc si on regarde ce code, plus l'étoile est loin et plus la valeur de EcranX tant vers 0
si qui signifie que si l'étoile se rapproche de toi (z diminue), ses coodonnée x et y vont grandir, l'étoile va donc s'écarté du centre de l'écran

c'est le principe du point de fuite et donc de la perpective
plus le point est éloigné de l'oeil et plus les distances sont petites :wink:

c'est une joli astuce, tu combines ça avec le système de rotation entre les axe 3D et 2D et tu obtients une vue 3D en rotation et en perspective.
(donc d'abord, on gère la rotation et ensuite la perspective avec ce code)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

vi j'ai été voir les sites. Le second explique mieux que le premier.

Mais bon je crois que si on veut pas trop s'emmerder avec la grosse theorie autant retenir les formules maths lol

Mais je comprend ce que signifie projection, le plus dur à comprendre c pourquoi c cette formule à appliquer....mais bon c'est celle là et voilà.

Je pense qu'il faudrait que je tente un programme tout con pour voir un peu comment ca marche. mais je sais pas quoi lol t'as pas une idée, un truc tout bête pour voir les projections.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ben tu fais un truc tout simple sans la troisième dimension

par exemple A(-7000,-7000) , B(7000,-7000) et C(7000,7000)

voila maintenant tu projettes A,B C et tu relies AB , BC et CA et tu nous montres ça :)

Ax= -7000 => correspond au bord gauche de l'écran
Ay= -7000 => correspond au bord bas de l'écran

Bx= 7000 => correspond au bord droit de l'écran
By= -7000 => correspond au bord bas de l'écran

Cx= 7000 => correspond au bord droit de l'écran
Cy= 7000 => correspond au bord haut de l'écran

Voila débrouille toi pour afficher ça correctement
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

je t'ai MP juste pour une petite précision
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

Je pige grace au MP.

Bon soyons donc logique.

Si je prend ma résolution d'écran en 640 X 480, imaginons mon repère XY qui part de - 7000 à 7000 aussi bien en X que en Y, cela signifie que mon point O de coordonnée (0,0) se trouve sur mon écran aux coordonnées 320,240 soit le milieu de l'écran.

A partir de là, si je prend mon point A(-7000,7000) si je retranscrit ce que je viens de dire à l'écran il aura les coordonnées 0,0

Pour le point B(7000,-7000) j'aurais à l'écran les coordonnées 640,480

Et pour mon point C(7000,7000) j'aurais à l'écran les coordonnées 640,0

est ce que je me trompe ?

Car logiquement si mon repère XY part de -7000 à 7000 en x et -7000 à 7000 en Y et que je veux afficher ca sur un écran de 640 X 480 faut que j'adapte et donc mon point O(0,0) se trouve bien au centre de mon repère qui doit se trouver au centre de l'écran soit au point 320,240.
Dernière modification par Crystal Noir le mer. 09/juin/2004 11:44, modifié 1 fois.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

[quote="Crystal Noir"]
A partir de là, si je prend mon point A(-7000,7000) si je retranscrit ce que je viens de dire à l'écran il aura les coordonnées 0,0[quote]

Voila , sauf que A c'est (-7000,-7000) donc coordonnées 0,480 ( 479 pour être plus juste )

ben maintenant on attend le programme qui trace les segments à l'écran :)
Répondre