1

Yop !

hier, j'ai voulu faire de la 3D en PHP pour le fun, mais je n'ai rien trouvé qui marche sans librairie pear ou autre que GD2...

du coup, j'ai essayé de faire mon propre "moteur" 3D, et ca donne ca :
3d_cube.jpg

pour ceux que ca intéresse, les sources sont là :

http://prgm.spipu.net/php_moteur_3d

bon, c'est clair que ca rame, surtout via internet avec la limitation du reseau, mais en local, ca marche plutot pas mal happy mais ca serait plus pour faire des images fixes que des animations temps réel à terme...

Ancien pseudo : lolo

2

3

sympa et pas si lent que ça smile

par contre tu risques de devoir faire rapidement une croix sur les animations temps réel quand tu vas vouloir tracer des figures un peu moins simples qu'un cube, à cause de la lenteur du php :/

(peut-être que pour le coup passer à un langage plus performant genre perl, python, Java, ASP.net ou autre serait une possibilité ?)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4

Je trouve ça totalement inutile, mais ça devait être fait love
avatar

5

Zephyr (./3) :
sympa et pas si lent que ça smile.gif


c'est vrai que sur mon serveur 1&1 la génération ne prend "que" 80ms par image en moyenne, mais sur mon pc en local, ca prenait 300ms happy
Zephyr (./3) :
par contre tu risques de devoir faire rapidement une croix sur les animations temps réel quand tu vas vouloir tracer des figures un peu moins simples qu'un cube, à cause de la lenteur du php :/

c'est clair, et puis en plus là, l'image générée est petite ! j'ai fait des tests en 800x600, c'était pas glop!
Zephyr (./3) :
(peut-être que pour le coup passer à un langage plus performant genre perl, python, Java, ASP.net ou autre serait une possibilité ?)

en même temps, y a rien de propre à php, la lib est tres facile à réecrire dans un autre langage. C'est juste que je comptais m'amuse avec PHP

Nil (./4) :
Je trouve ça totalement inutile

tout à fait d'accord cheeky le PHP n'est absolument pas fait pour faire des trucs comme ca à la base

Ancien pseudo : lolo

6

ce que j'ai paas dit, c'est que meme si là il n'affiche qu'un simple cube, le moteur permet d'afficher des scenes beaucoup plus complète. Le fonctionnement est tres proche d'openGL

 	$cube = new Objet();
	
	$cube
		->ptAdd(-10, 10, -10)
		->ptAdd( 10, 10, -10)
		->ptAdd( 10,-10, -10)
		->ptAdd(-10,-10, -10)
		->ptAdd(-10, 10,  10)
		->ptAdd( 10, 10,  10)
		->ptAdd( 10,-10,  10)
		->ptAdd(-10,-10,  10)

		->textureAdd(dirname(__FILE__).'/../texture/tux.gif')

		->fcAdd(1, 2, 3, array(250, 200, 200), 1, array(array(0, 0), array(1, 0), array(1, 1)))
		->fcAdd(1, 3, 4, array(250, 200, 200), 1, array(array(0, 0), array(1, 1), array(0, 1)))
		->fcAdd(2, 6, 7, array(200, 250, 200), 1, array(array(0, 0), array(1, 0), array(1, 1)))
		->fcAdd(2, 7, 3, array(200, 250, 200), 1, array(array(0, 0), array(1, 1), array(0, 1)))
		->fcAdd(6, 5, 8, array(250, 200, 200), 1, array(array(0, 0), array(1, 0), array(1, 1)))
		->fcAdd(6, 8, 7, array(250, 200, 200), 1, array(array(0, 0), array(1, 1), array(0, 1)))
		->fcAdd(5, 1, 4, array(200, 250, 200), 1, array(array(0, 0), array(1, 0), array(1, 1)))
		->fcAdd(5, 4, 8, array(200, 250, 200), 1, array(array(0, 0), array(1, 1), array(0, 1)))
		->fcAdd(5, 6, 2, array(200, 200, 250), 1, array(array(0, 0), array(1, 0), array(1, 1)))
		->fcAdd(5, 2, 1, array(200, 200, 250), 1, array(array(0, 0), array(1, 1), array(0, 1)))
		->fcAdd(4, 3, 7, array(200, 200, 250), 1, array(array(0, 0), array(1, 0), array(1, 1)))
		->fcAdd(4, 7, 8, array(200, 200, 250), 1, array(array(0, 0), array(1, 1), array(0, 1)));

	$image = new moteur_3D();
	$image->setScreen(320, 240);
	$image->setBackground(20, 20, 20);
	$image->drawInit();
	$image->setOuverture(45.0);
	$image->setView(-32, 32, -24, 24);
	$image->matrixIdentity();
	$image->matrixTranslate(0, 0,40);
	$image->matrixRotateX(30);
	$image->matrixRotateY(40);
	$image->drawObject($cube);
	$image->drawFinish();
Ancien pseudo : lolo

7

(complètement HS mais c'est très pratique ton truc pour les vélib sur téléphone; il y a une API de la ville de Paris ou c'est du bidouillage ?)

8

ya une API, mais il me semble qu'elle n'est pa publique normalement sorry
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

9

c'est de la bidouille, je n'utilise aucune API...

j'utilise google maps pour convertir des adresses en coordonnée GPS, les XML de la ville de paris pour les infos sur les velibs, et a nouveau google maps pour récuperer les plans
Ancien pseudo : lolo

10

j'ai encore amélioré mon "moteur" 3D smile ca donne ca maintenant :

x1PP

il peut gérer les sources de lumière multiple, charger des objets externes au format ASE, ..
Ancien pseudo : lolo

11

Impressionnant ... top
Je pensais pas qu'on pouvait faire ça en php... chinois

12

Joli proof of concept smile
Bon boulot wink
Tout ce qui passe pas par le port 80, c'est de la triche.

13

Spipu: tu n'est qu'un grand malade !
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

14

Il semble y avoir un problème vers l'avant gauche de la voiture. Une face qui devrait être cachée est dessinée devant les autres...

Sinon, c'est vrai que c'est pas mal grin

Il prend combien de temps à faire le rendu du ./10 ?
avatar

15

quelques ms
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

16

Oui, je viens de voir ça, le site de Spipu a été mis à jour smile
avatar

17

Thepro (./14) :
Il semble y avoir un problème vers l'avant gauche de la voiture. Une face qui devrait être cachée est dessinée devant les autres...

en fait, dès que les objets sont un peu trop complexe, avec pleins de concaves/convexes dans tous les sens, il y a ce genre de pb qui apparait, car l'affichage se fait juste par un tri des faces suivant la profondeur moyenne, et non via un zbuffer ou un arbre BSP... du coup c'est inévitable sad mais bcp plus facile à programmer dans l'absolue happy
Godzil (./13) :
Spipu: tu n'est qu'un grand malade !

ca, je suis tout à fait d'accord avec toi cheeky

bon, par contre, il reste un petit souci : quand une image est générée, ca prend bcp de temps machine... ce n'est absolument pas exploitable sur un site à fort trafique ! déjà là, j'ai peur de me faire engueuler par 1and1 car je ne suis pas seul sur le serveur...
Ancien pseudo : lolo

18

Spipu (./17) :
Thepro (./14) :
Il semble y avoir un problème vers l'avant gauche de la voiture. Une face qui devrait être cachée est dessinée devant les autres...

en fait, dès que les objets sont un peu trop complexe, avec pleins de concaves/convexes dans tous les sens, il y a ce genre de pb qui apparait, car l'affichage se fait juste par un tri des faces suivant la profondeur moyenne, et non via un zbuffer ou un arbre BSP... du coup c'est inévitable frown.gif mais bcp plus facile à programmer dans l'absolue smile2.gif
Donc tu dessines toutes les faces, pas seulement celles qu'on voit ?
Sinon, avec ce système, c'est sûr qu'on ne peut pas y faire grand-chose... C'est d'ailleurs pour cette raison que PrettyPrint ne permet pas d'afficher plusieurs graphiques 3D simultanément sad (j'ai prévu de régler ça dès que j'aurai un peu de temps)
avatar

19

sisi, je n'affiche que les faces qui sont dans le bon sens. mais ca ne corrige pas tous les pbs. L'exemple classique est une grande face plane, et une petite sphère situé à 1/3 en profondeur. mais au dessus de cette face plane. Avec la technique du tri des faces par profondeur moyenne, la petite sphere sera tracée d'abord, puis la grande surface plane, effaçant du coup la petite sphère...


----- loin
|   |
| O |
|   |
|   |
|   |
|   |
----- proche
Ancien pseudo : lolo

20

J'ai bien compris smile
Par toutes les faces, je voulais dire toutes les faces qui seraient visibles si elles étaient toutes seules grin (c'est à dire toutes sauf celles qui sont hors champs et celles que ne sont pas dans le bon sens).

Il te reste encore à produire des animations gif grin
4461.gif
avatar

21

Thepro (./20) :
Par toutes les faces, je voulais dire toutes les faces qui seraient visibles si elles étaient toutes seules


ok, donc tu voulais comparer à une technique comme celle des arbres BSP je suppose, qui permet d'afficher les faces dans un ordre bcp plus logique... C'est juste que c'était plus simple pour moi dans un premier temps de faire juste en fonction de la profondeur
Ancien pseudo : lolo

22

Thepro (./20) :
Il te reste encore à produire des animations gif biggrin.gif
4461.gif


pas mal happy j'avais jamais fais attention à ta lib happy beau boulot !
Ancien pseudo : lolo

23

Bon, ben pour ceux que ca intéresse, j'ai continué à améliorer ma lib. Elle est maintenant téléchargeable (licence GPL) ici :

http://prgm.spipu.net/?id=39&page

il y a maintenant un z-buffer, l'éclairage est mieux géré, et un légé anti-aliasing est présent.

par contre, depuis toutes ces améliorations, le temps de génération a énormément grimpé (facteur 8-10), et j'ai donc préféré supprimer de mon hebergeur le site de test wink

voici quelques images :

3d_cube.jpg

3d_light.jpg

3d_lotus.jpg
Ancien pseudo : lolo

24

trisotfl (c'est pas une insulte hein, juste que je te trouve VRAIMENT fou ^^)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

25

#crayove#

26

pareil grin

faut le faire quand même de coder toussa en quelques jours love

27

Godzil (./24) :
trisotfl.gif (c'est pas une insulte hein, juste que je te trouve VRAIMENT fou ^^)

=> perso je prends plus ca pour un compliment cheeky
squalyl (./26) :
faut le faire quand même de coder toussa en quelques jours love.gif

ben en fait, quand on connait déjà les différents principes, c'est pas si compliqué et long que ca en a l'air... ma lib fait moins de 800 lignes ! c'est juste des maths happy
Ancien pseudo : lolo

28

oui, c'est sûr, mais comme on dit l'enfer c'est les détails smile

tu codes bien, quoi smile

29

squalyl (./28) :
mais comme on dit l'enfer c'est les détails smile.gif


ca c'est bien vrai sad
squalyl (./28) :
tu codes bien, quoi smile.gif

na, mais ca, je le savais déjà tongue

dehors
Ancien pseudo : lolo

30

rooh l'autre eh ...

(bon sinon chapeau, même si ça ne sert à rien, je serais incapable de perdre mon temps à ce niveau la grin )