Page 1 sur 2

Besoin d'une petite explication de code

Publié : mar. 08/juin/2004 20:12
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.

Publié : mar. 08/juin/2004 20:46
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

Publié : mar. 08/juin/2004 23:22
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. :?: :?:

Publié : mar. 08/juin/2004 23:27
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 ?

Publié : mer. 09/juin/2004 6:50
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

Publié : mer. 09/juin/2004 8:35
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

Publié : mer. 09/juin/2004 9:04
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.

Publié : mer. 09/juin/2004 9:30
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

Publié : mer. 09/juin/2004 9:42
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 :)

Publié : mer. 09/juin/2004 9:46
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)

Publié : mer. 09/juin/2004 9:51
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.

Publié : mer. 09/juin/2004 10:09
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

Publié : mer. 09/juin/2004 10:28
par Crystal Noir
je t'ai MP juste pour une petite précision

Publié : mer. 09/juin/2004 11:01
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.

Publié : mer. 09/juin/2004 11:06
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 :)