Post by scalion on Jun 24, 2019 21:23:55 GMT 1
Mes chers amis programmeurs je vous présente un petit ray-tracer en vue isométrique.
A la base je l'ai développé dans le but de créer des graphismes pour un jeu de colonisation (prochain post dans X temps...).Je ne vais pas vous mentir je n'ai pas refait POV, ca rame un max, rien que 3 h de calcul pour la petite image d'illustration (la faute au texte en 3d sinon ca prend 2 mn), il faudrait encore créer des bounding-box, et faire un peu de code "naked" pour accélérer tout ça.
Ceci étant, le résultat est pas mal, à mon goût et c'est suffisant si on est pas pressé.
La plupart des fonctions ne gèrent pas les erreurs de paramétrage du style valeur trop grande pour une équation de plan, ou paramètre manquant dans un appel de fonction avec un parramarray() donc il faut bien tout respecter au niveau des paramètres attendus. Cependant ce ne devrait pas être un gros problème pour vous.
Donc voici les commandes et leur mode d'emploi :
- ShapeAdd : Permet d'ajouter un forme primaire. Peut s'écrire comme une fonction retournant un numéro de forme Var% = ShapeADd(...) ou bien comme une simple procédure si on a pas besoin de faire des modifications
Ajouter une sphère :
ShapeAdd ST_SPHERE, x , y , z, radius [ , couleur , opacité , réflection ]
Ajouter une boite :
ShapeAdd ST_BOX, x1 , y1 , z1 , x2 , y2 , z2 [ , couleur , opacité , réflection ]
Ajouter un cylindre vertical :
ShapeAdd ST_CYLINDER, x , y , z , radius , height [ , couleur , opacité , réflection ]
Ajouter un cylindre allant d'un point à un autre :
ShapeAdd ST_CYLINDER_P2P, x1 , y1 , z1 , x2 , y2 , z2 , radius [, couleur , opacité , réflection ]
Ajouter un tétraèdre (4 faces triangles) :
ShapeAdd ST_TETRAEDRE, x , y , z , height [, couleur , opacité , réflection ]
Ajouter un plan (un sol par exemple
ShapeAdd ST_PLANE , a , b , c , d [, couleur , opacité , réflection ]
a b c d sont les valeurs de l'équation Ax + By + Cz + D = 0 du plan.
C'est à dire un vecteur a,b,c partant de 0,0,0 et un déplacement le long de ce vecteur
Ajouter un triangle :
ShapeAdd ST_TRIANGLE , x1 , y1 , z1 , x2 , y2 , z2 , x3 , y3 , z3 [, couleur , opacité , réflection ]
- ShapeSetting : Permet de modifier les attributs d'une forme
ShapeSetting FormeIndex , Paramètre_à_modifier , Valeur_à_attribuer
FormeIndex est le numéro retourné par la fonction ShapeAdd()
Paramètre_à_modifier est l'une des constantes ci-dessous.
La valeur est comprise engtre 0 et 1 sauf pour les cas indiqués.
SHAPESET_AMBIANT = 0
SHAPESET_REFRACTION = 1 0.001 à infini (0 déclenche une erreur)
SHAPESET_ALGOTEX_NX = 2
SHAPESET_ALGOTEX_NY = 3
SHAPESET_ALGOTEX_NZ = 4
SHAPESET_ALGOTEX_R = 5
SHAPESET_ALGOTEX_G = 6
SHAPESET_ALGOTEX_B = 7
SHAPESET_ALGOTEX_OPACITY = 8
SHAPESET_ALGOTEX_REFLECTION = 9
SHAPESET_ALGOTEX_REFRACTION = 10
SHAPESET_OPACITY = 11
SHAPESET_REFLECTION = 12
SHAPESET_SECONDPROCESS = 13 SP_SIN ou SP_AVERAGE
SHAPESET_ALGOTEX_RGB = 14
- ShapeTexture : Paramétrage de la texture
ShapeTexture ShapeIndex , Algorythme , ScaleX , ScaleY , ScaleZ , SpecialParameter
ShapeIndex : numéro de la forme retourné par la fonction ShapeAdd()
Algorythme :
ALGOTEX_NONE = 0 Pas de texture
ALGOTEX_DAMIER = 1 Damier tridimensionnel
ALGOTEX_RADIAL = 2 Rayons alternant 0/1 , nombre de rayons = SpecialParameter * 2
ALGOTEX_DAMIER_RADIAL = 3 Rayons alternant 0/1 * radius, nombre de rayons = SpecialParameter * 2
ALGOTEX_MATRIX = 4 Matrice 2D , itérations = SpecialParameter
ALGOTEX_MATRIX3D = 5 Matrice 3D , itérations = SpecialParameter
ALGOTEX_NORMAL = 6 - non implémenté -
ALGOTEX_SIN = 7 - non implémenté -
ALGOTEX_COS = 8 - non implémenté -
ALGOTEX_SQUARE = 9 - non implémenté -
ALGOTEX_TRIANGLE = 10 - non implémenté -
ALGOTEX_RANDOM = 11 Bruit aléatoire
ScaleX,ScaleY,ScaleZ : multiplicateur
SpecialParameter : Sa valeur est utilisée différemment selon l'algorythme
- ShapeRotate : Effectue une rotation simple. Attention il s'agit d'une rotation absolue et non d'une matrice de rotation.
ShapeRotate ShapeIndex , xAxis , yAxis , zAxis , Angle
ShapeIndex : numéro de la forme retourné par la fonction ShapeAdd()
xAxis , yAxis , zAxis : un vecteur partant du point de référence de la forme
pour une sphère : le centre x,y,z de la sphère
pour un tétraèdre ou un cylindre : le milieu de la base.
pour une boite : le premier point de définition x1 , y1 , z1
pour un plan : le point le plus proche de 0,0,0
- GenerateTexteShape : Crée un ensembles de cylindre et de sphères pour représenter un texte.
WARNING ! : Très très lent.
On ne peut pas modifier l'ensemble créé mais ce n'est pas très compliqué à programmer.
Il suffit de prendre la valeur de ShapesCount avant et après l'appel à GenerateTexteShape,
puis de créer une petite boucle à sa mémère en appelant les ShapeSetting, ShapeRotate ou ShapeTexture désirés.
GenerateTexteShape x , y , z , fontsize , texte [ color , opacity , transparency , refraction , reflection ]
- LightAdd : Pour ajouter de la lumière.
LightType,x,y,z,Color
LightType : uniquement directionnel dans ce cas x,y,z est la direction de la lumière
j'ai fait au plus simple pour un jeu en 3d isométrique, ceci dit j'ai quand même prévu qu'on puisse ajouter
des lumières de type spot, je programmerais ca plus tard (peut-être).
Si le coeur vous en dit allez voir dans la fonction IsoTracing() dans la boucle avec LightsCount.
Accessoirement, histoire de meubler un peu, le code source est ici :
Ray tracing GFA-Basic.G32 (83.92 KB)