[3D] Quelques suggestions

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[3D] Quelques suggestions

Message par blendman »

salut

Comme vous le savez (ou pas), j'utilise essentiellement pour concevoir des jeux Vidéos commerciaux en 2D et j'espère prochainement en 3D.

J'ai aussi commencé l'élaboration d'un level Editor pour faciliter la création de level de jeu 3D.

Suite à cela, j'ai noté une liste d'ajout qui je pense pourraient être intéressant au niveau 3D.
Je les ai classé par "Groupe", et j'ai essayé d'expliquer la raison de la fonction à ajouter, si possible.

En espérant que cela vous sera utile. Si c'est déjà possible n'hésitez pas à poster un petit exemple :).

A) Light et shadow

A mon avis, les 2 ajouts sur les lights (intensité et range) sont essentiels pour la création de jeux professionnels et commerciaux.

1) Light intensité : pouvoir modifier l'intensité de la lumière (diffuse et spéculaire) d'une light (point, directionnal, spot) au delà de 1
Par exemple une light ayant une intensité à 15 ferait qu'une light éclaire 15 fois plus qu'une lampe blanche normale. Bon c'est surtout intéressant pour la couleur diffuse, mais modifier les 2, ce serait encore mieux.
Pourquoi ? Et bien simplement car certaines lumières peuvent très fortes dans certains cas.

2) Light Range : avoir l'atténuation pour chaque type de light, pas uniquement les spots.
Pour le moment, je rapproche la light du sol pour que son éclairage diminue en fonction de la distance, mais ce serait mieux de pouvoir le gérer directement
exemple : LightPower(#light, intensity,[range[, flag]])
rang : la distance à partir de la laquelle la limière est de moins en forte
flag : #PB_Light_DiffuseColor|#PB_Light_SpecularColor

C'est très important, car la plupart des jeux vidéos utilisent les lights pour créer des ambiances très différentes d'un jeu à un autre.
De plus, avec les materials, on peut gérer le lighting via les vertex_color (comme dans Torchlight), et ça permet d'avoir un lighting vraiment intéressant si on a l'atténuation et l'intensité des light.

3) Avoir du shadow mapping ou des ombres douces : j'imagine que ça peut sans doute se faire avec un shader.
Si c'est le cas, ce serait intéressant d'avoir un exemple ;).

4) Avoir un retour d'information sur la position et les rotations de la light : lightX(), lightY(), LightZ(), lightRoll(), lightPitch(), lightYaw().

ça peut être utile, notamment pour créer un éditeur de level pour purebasic et Ogre

pour le moment, pour faire ça, "j'attache" une entity à une light et la light est modifiée en fonction de cet entity.
Donc, ce n'est pas très important comme fonction, mais ça peut être utile.


B) Material et Shaders

6) Avoir des exemples 3D de shaders dans le répertoire d'exemples fournis avec purebasic : réflexion, réfraction, cubemapping, normal_map/bump, speculaires, parallax mapping, ombres douces, Fresnel.

Je sais que certains essaient de créer une sorte de librairie (Kelebrindae, G-rom, moi), ce serait pas mal de mettre ça en commun et de vérifier que ça fonctionne pour la plupart des scènes ;).

On pourrait poster cette proposition sur le forum Anglais.

7) pouvoir recharger un material script ou le modifier en temps réel. Ca permettrait de créer un éditeur de shaders.
Kelebrindae est en train de travailler sur un éditeur permettant de recharger le material, donc, à voir si son système suffirait ou non.
Si cela fonctionne et suffit, on n'aurait pas besoin forcément de pouvoir recharger/modifier un material en temps réel.

C) Post Filters

Les compositors devraient permettre d'ajouter des post-filters, mais ce serait intéressant d'avoir quelques exemples dans le répertoire d'exemples (ou sur le forum).
Je ne sais pas ce qu'il est possible de faire à ce niveau-là, c'est peut être déjà faisable :

8 ) Avoir des exemples fonctionnels avec les compositors : bloom, distortion (par exemple du feu émet de la chaleur et déforme ce qui est derrière), depth of field, couleur, saturation, lightscattering (je ne sais pas si c'est faisable mais je l'ai vu dans pas mal de moteur en shader post-filters : horde3D, dbpro..)


D) Mesh

9) Connaitre les dimensions d'un mesh (hauteur, largeur, profondeur).

10) connaitre la position du pivot MeshPivotX(), MeshPivotY(),MeshPivotZ(), éventuellement pouvoir le modifier (get/set ?). Peut être serait-il intéressant d'avoir la position du "centre" du mesh (GetMeshCenterX(),GetMeshCenterZ(),GetMeshCenterY()) histoire de pouvoir comparer avec le pivot ou quelque chose comme ça : ça permettrait de bien replacer les bounding box si besoin.


E) Collisions

11) la possibilité de modifier manuellement des points pour la/les boîte(s) de collisions (cube) d'un mesh ou de modifier les dimensions de cette boite.

F) World

12) Pouvoir supprimer un skydom, une skybox, ou un fog : pour un fog, on met intensity à zéro et on ne le voit plus, mais pour les autres ?

13) pouvoir modifier la texture d'un skydom ou d'une skybox une fois créé : le fait de refaire skydom() modifie la texture ou ajoute un deuxième skydom ?

14) pouvoir modifier la courbure d'un skydom une fois créé : idem ?

15) pourvoir modifier la vitesse de la texture (skydom, skybox) avant et après création

G) particule

16 ) avoir les particules scripts

H) animations

17) pouvoir définir une animation sur une entity particulière et peut être même connaitre les animations disponibles d'un fichier skeleton..
Exemple : si robert et michel (2 mesh de personnages semblables) ont le même squelette, ils pourraient utiliser le même skeleton et on pourrait choisir l'animation qu'on veut jouer.

voiloutch .
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [3D] Quelques suggestions

Message par comtois »

Merci pour la liste.
10) connaitre la position du pivot MeshPivotX(), MeshPivotY(),MeshPivotZ(), éventuellement pouvoir le modifier (get/set ?). Peut être serait-il intéressant d'avoir la position du "centre" du mesh (GetMeshCenterX(),GetMeshCenterZ(),GetMeshCenterY()) histoire de pouvoir comparer avec le pivot ou quelque chose comme ça : ça permettrait de bien replacer les bounding box si besoin.
C'est quoi le pivot ? c'est le repère utilisé pour définir ton mesh ? Pour le centre je pense que tu pourras le déduire en connaissant les dimensions de la Boundingbox.
Tu peux déjà déplacer l'ensemble des vertices avec la fonction TransformMesh()
17) pouvoir définir une animation sur une entity particulière et peut être même connaitre les animations disponibles d'un fichier skeleton..
Exemple : si robert et michel (2 mesh de personnages semblables) ont le même squelette, ils pourraient utiliser le même skeleton et on pourrait choisir l'animation qu'on veut jouer.
Si tu peux mettre en ligne robert et michel avec le skeleton je peux jeter un oeil là dessus. Justement j"étais curieux de voir ce que ça donnerait.
Pas besoin qu'ils soient jolis , un truc tout moche mais fonctionnel ira très bien.

Je regarde aussi les autres points, je ne dirai rien sur ce qui sera possible d'ajouter ou sur ce qui est déjà fait, Fred préfère qu'on évite de faire des promesses qu'il ne pourra pas tenir :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [3D] Quelques suggestions

Message par blendman »

comtois a écrit :C'est quoi le pivot ? c'est le repère utilisé pour définir ton mesh ?
dans blender ou 3dsmax, le pivot est une sorte de repère qui sert pour les transformations. C'est en quelque sorte le centre de l'objet, sauf qu'il n'est pas centré.

En purebasic, lorsqu'on fait une rotation d'une entity, celle-ci s'effectue par rapport au pivot (en relatif), j'ai l'impression.

Si le pivot est au pied d'un personnage, il apparaitra en (0,0,0) sur le sol.
Alors que si le pivot est en (0,50,0), il apparaitra le corps au niveau du sol, et les pieds sous le sol par exemple.

Comment est définie la bounding box ?
Pour le centre je pense que tu pourras le déduire en connaissant les dimensions de la Boundingbox.
oui, si elle est centrée , mais il m'a semblé lire quelque part que la bouding box était centrée sur le pivot justement. Mais peut-être ai-je mal lu.

Si tu peux mettre en ligne robert et michel avec le skeleton je peux jeter un oeil là dessus. Justement j"étais curieux de voir ce que ça donnerait.
Pas besoin qu'ils soient jolis , un truc tout moche mais fonctionnel ira très bien.
donc 2 persos ayant utilisant normalement le même squelette (et donc potentiellement la même animation) c'est ça ?

j'essayerai de te faire ça ce week end ;).
Je regarde aussi les autres points, je ne dirai rien sur ce qui sera possible d'ajouter ou sur ce qui est déjà fait, Fred préfère qu'on évite de faire des promesses qu'il ne pourra pas tenir :)
et vous avez bien raison :mrgreen:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [3D] Quelques suggestions

Message par comtois »

En fait, pas besoin de robert et michel, tu peux déjà le vérifier avec le robot dans l'exemple Entity.pb, en ajoutant ça dans le code :

Code : Tout sélectionner

    AnimateEntity(0, "Walk")
    AnimateEntity(1, "Idle")
    AnimateEntity(2, "Walk")
Il y a un seul fichier skeleton et chaque entity joue une animation
[EDIT2]
Oublie ça ! C'est le même mesh, faudrait faire l'essai avec 2 mesh différents, mais je pense que ça ne changera rien , ça devrait fonctionner pareil, reste quand même à le vérifier !

[EDIT]
Comment est définie la bounding box ?
En prenant les positions x, y et z de chaque vertex et en retenant le plus grand et le plus petit. Donc effectivement tu peux avoir ton pivot au pied du robot et le centre de la boudinBox plus haut, ce qui pose un problème avec Bullet car il travaille avec le centre de la box, et ogre avec le pivot. Je n'ai pas encore regardé s'il pouvait en être autrement.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [3D] Quelques suggestions

Message par G-Rom »

3) Avoir du shadow mapping ou des ombres douces : j'imagine que ça peut sans doute se faire avec un shader.
Si c'est le cas, ce serait intéressant d'avoir un exemple .
C'est déjà sur ma roadmap , mon idée sera de supprimer ce qui existe déjà , les shadow volume sont has-been
mon objectif sera de rendre une depth map à partir de tout les point lumineux dans une cubemap , et au moment du rendu de faire une projection , je voudrais tout codé en dur , de manière à ce que l'user final n'ai pas à user de shader & de matérial.
4) Avoir un retour d'information sur la position et les rotations de la light : lightX(), lightY(), LightZ(), lightRoll(), lightPitch(), lightYaw().
tu peut toujours l'attacher à une node en attendant.
7) pouvoir recharger un material script ou le modifier en temps réel. Ca permettrait de créer un éditeur de shaders.
Kelebrindae est en train de travailler sur un éditeur permettant de recharger le material, donc, à voir si son système suffirait ou non.
Si cela fonctionne et suffit, on n'aurait pas besoin forcément de pouvoir recharger/modifier un material en temps réel.
Je vais regardé ca.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [3D] Quelques suggestions

Message par comtois »

D) Mesh

9) Connaitre les dimensions d'un mesh (hauteur, largeur, profondeur).

10) connaitre la position du pivot MeshPivotX(), MeshPivotY(),MeshPivotZ(), éventuellement pouvoir le modifier (get/set ?). Peut être serait-il intéressant d'avoir la position du "centre" du mesh (GetMeshCenterX(),GetMeshCenterZ(),GetMeshCenterY()) histoire de pouvoir comparer avec le pivot ou quelque chose comme ça : ça permettrait de bien replacer les bounding box si besoin.
Je pense que le pivot pour Ogre est tout simplement la position (0,0,0). Je t'avais suggéré TransformMesh() pour le modifier, l'inconvénient c'est que ça ne fonctionne qu'avec des mesh, et ne prend pas en compte le skeleton , donc c'est bien pour un objet statique.

Sinon je viens d'y penser, le mieux c'est d'utiliser la puissance de MeshMagickdans ton éditeur. Tu auras accès à tout ce que tu demandes et même plus. Un simple exemple en PureBasic (avec la version 1.7.2), le robot est mal orienté, un bon mesh devrait être orienté comme le ninja (en direction de l'axe z-) , pour modifier le robot une simple ligne comme ça suffit (et ça transforme aussi le skeleton que demander de plus ?) :

Code : Tout sélectionner

RunProgram("OgreMeshMagick.exe", "transform -rotate=90/0/1/0 robot.mesh", "") 
Axe X en rouge, Axe Y en vert et Axe Z en bleu
Image

Tu peux aussi récupérer toutes les infos souhaitées (bounding box, les animations disponibles, etc, )

Code : Tout sélectionner

MeshMagick = RunProgram("OgreMeshMagick.exe", "info robot.mesh", "", #PB_Program_Open|#PB_Program_Read) 
  Sortie$ = ""
  If MeshMagick 
    While ProgramRunning(MeshMagick)
      If AvailableProgramOutput(MeshMagick)
        Ligne$ = ReadProgramString(MeshMagick)
        If FindString(Ligne$, "Bounding box")
          BoundingBox$ = Ligne$
        EndIf  
        Sortie$ + Ligne$ + Chr(13)
      EndIf
    Wend
    Sortie$ + Chr(13) + Chr(13)
    Sortie$ + "Code de retour : " + Str(ProgramExitCode(MeshMagick))
    
    CloseProgram(MeshMagick) ; Ferme la connexion vers le programme
  EndIf
  
  MessageRequester("Sortie", Sortie$)
  MessageRequester("BoundingBox", BoundingBox$)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: [3D] Quelques suggestions

Message par kelebrindae »

blendman a écrit : Kelebrindae est en train de travailler sur un éditeur permettant de recharger le material, donc, à voir si son système suffirait ou non.
Non, ça ne remplacera par une modification en temps réel des materials, surtout dans un jeu.
Par contre, ce qui me paraît a priori plus utile que de générer des nouveaux scripts dynamiquement, ce serait de pouvoir passer des paramètres au material ou au shader depuis le code PB; ça ouvrirait pas mal de possibilités.
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: [3D] Quelques suggestions

Message par Cool Dji »

Hello,

En plus des demandes formulées précédement,

J'aimerais pouvoir acceder en lecture aux points (X,Y,Z) d'une entity qui va être affichée.
C'est à dire en tenant compte des déplacements, scales, rotations.

Les fonctions CreateTerrain et CreateWater telles qu'elles étaient ne me conviennent pas complétement :
A moins de ne pas avoir tout compris, il me semble que l'on ne peut créer qu'un seul terrain et 1 seul plan Water.

Je construis les terrain avec des Mesh ou il n'y as pas de déformation du mappage. C'est plus classe et on peut assembler des tuiles de terrains facilement (en revanche, j'appréciais la fonction permettant de récupérer la position X,Y,Z d'un point sur le terrain).

Pour le Water, j'aimerais une fonction qui puisse créer plusieurs surfaces (délimitées ou non dans l'espace) avec des paramétres différents :
Ex, pouvoir avoir un lac, une piscine, une baignoire...idealement, la surface Water se construit à partir d'un polygone (suite de points X,Y) et on fixe la hauteur à laquelle se positionne cette surface.

Sinon, en 3D, je ne comprends pas pourquoi dans les exemples FPs Personn, il y ait la nécessité d'une fonction comme OnGround qui teste s'il n'y a rien en dessous d'un objet.
Je pensais que le moteur physique assurait ça "naturellement" comme il gère les contacts latéraux.

Voilà, voilà

En tous les cas, merci pour l'existant et courage pour la suite à la Team
Only PureBasic makes it possible
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [3D] Quelques suggestions

Message par comtois »

Cool Dji a écrit :Sinon, en 3D, je ne comprends pas pourquoi dans les exemples FPs Personn, il y ait la nécessité d'une fonction comme OnGround qui teste s'il n'y a rien en dessous d'un objet.
Je pensais que le moteur physique assurait ça "naturellement" comme il gère les contacts latéraux.
Tu peux te passer de la fonction OnGround(), je l'avais ajouté pour couper la gravité, ça me permet par exemple d'éviter de glisser sur un terrain en pente.

Bon il fait beau et chaud, activités de plein air aujourd'hui ! Allez Zou ...
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [3D] Quelques suggestions

Message par G-Rom »

ce serait de pouvoir passer des paramètres au material ou au shader depuis le code PB; ça ouvrirait pas mal de possibilités.
C'est déjà fait, l'exemple avec la boule qui rouille avec le temps n'a pas été distribuée ? ( je ne suis pas chez moi pour vérifier )
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: [3D] Quelques suggestions

Message par kelebrindae »

G-Rom a écrit :C'est déjà fait
8O Sérieux?!
Je ne trouve rien dans l'aide, ni rien dans le répertoire examples/3D (pas de fausses joies, s'il te plaît)...
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [3D] Quelques suggestions

Message par comtois »

blendman a écrit :
Si tu peux mettre en ligne robert et michel avec le skeleton je peux jeter un oeil là dessus. Justement j"étais curieux de voir ce que ça donnerait.
Pas besoin qu'ils soient jolis , un truc tout moche mais fonctionnel ira très bien.
donc 2 persos ayant utilisant normalement le même squelette (et donc potentiellement la même animation) c'est ça ?

j'essayerai de te faire ça ce week end ;).
ça tient toujours ? Bien que je pense qu'il n'y a aucune raison pour que ça ne fonctionne pas (si la définition des bones est identique d'un mesh à l'autre), j'aimerais quand même le vérifier :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [3D] Quelques suggestions

Message par blendman »

comtois a écrit :ça tient toujours ? Bien que je pense qu'il n'y a aucune raison pour que ça ne fonctionne pas (si la définition des bones est identique d'un mesh à l'autre), j'aimerais quand même le vérifier :)
oui, ça tient toujours ;)
J'essaye de faire ça le plus vite, mais j'ai eu des trucs à faire et je n'ai pas encore eu le temps de faire ces robert et michel ^^
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [3D] Quelques suggestions

Message par comtois »

Prends ton temps. Rien ne presse :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [3D] Quelques suggestions

Message par comtois »

Cool Dji a écrit :J'aimerais pouvoir acceder en lecture aux points (X,Y,Z) d'une entity qui va être affichée.
C'est à dire en tenant compte des déplacements, scales, rotations.
Ils ne sont pas disponibles directement, il faut les calculer.

Tu as besoin de ces infos pour faire quoi ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Répondre