Connexion
Menu Principal
Recherche
Menu secondaire
Image Aléatoire
EXPRESSO.jpg
Publicité
Formation Blender ElephormBlender 3d Elephorm


     




(1) 2 »


OpenGL ou comment afficher un texte en 3D
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1344
Bonjour tout le monde,

J'ai bientôt fini mes modifications pour mon jeu mais je dois terminer un petit détail sur l'un des composants.

Afin de voyager dans le monde que j'ai crée, pour pouvoir identifier les villes, je dois y indiquer un nom juste au dessus d'elle.

Mais je ne comprends pas très bien dans la doc ce que l'on me dit:

 gluPerspective(fovY, aspect, zNear, zFar):

    Set up a perspective projection matrix.

    See also

    U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5577288}

    Parameters:	

        fovY (double) – Specifies the field of view angle, in degrees, in the y direction.
        aspect (double) – Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).
        zNear (double) – Specifies the distance from the viewer to the near clipping plane (always positive).
        zFar (double) – Specifies the distance from the viewer to the far clipping plane (always positive).


1. Que veux dire (double), la valeur que l'on y insère est-elle systématiquement doublée ?

2. Visiblement, je dois indiquer un float dans "ratio", qui contiendrai les deux axes mais je n'en sait pas plus.

Enfin, j'ai tenté de taper au pif, histoire de voir ce qu'il se passe, j'ai pas d'erreurs mais j'ai pas mon texte non plus...

Aussi, est-ce que ma fonction, telle quelle, peut m'afficher quelque chose avec ce nouveau paramètre ?

def write_bis(): # affiche le texte à l'écran
    width = rd.getWindowWidth()
    height = rd.getWindowHeight()
    font_id = blf.load(gl.expandPath('//BLKCHCRY.TTF'))
    # OpenGL setup
    bgl.glMatrixMode(bgl.GL_PROJECTION)
    bgl.glLoadIdentity()
    #bgl.gluOrtho2D(0, width, 0, height)
    bgl.gluPerspective(45, 1.2, 50, 100)
    bgl.glMatrixMode(bgl.GL_MODELVIEW)
    bgl.glLoadIdentity()
    #print(width, height)
    # BLF drawing routine
    for text in gl.text_city:
        blf.position(font_id, (width * text.posx), (height * text.posy), 1)
        blf.size(font_id, 25, 72)
#        if width >= 1260 and height >= 939:
#            blf.size(font_id, 25, 72)
#        else:
#            blf.size(font_id, 16, 72)
        bgl.glColor4f(*text.color)
        blf.draw(font_id, text.texte)

Contribution le : 15/07 17:47:51
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer


Re: OpenGL ou comment afficher un texte en 3D
OverdOzed
Inscrit:
23/02/2006 18:10
De Sideula
Post(s): 1988
Je ne connais pas bien Python, mais GLU est une bibliothèque C. Donc elle utilise la nomenclature C pour les types de données.

Un "double" est un nombre à virgule flottante sur 64 bits.
En C, il existe un type de nombres à virgule flottante sur 32 bits (nommé simplement "float").

D'après mes souvenirs de Python, confirmés ici, les nombres à virgule flottante sont déjà sur 64 bits. Tu n'as donc pas à t'en soucier.

Citation :
Almost all platforms represent Python float values as 64-bit “double-precision” values, according to the IEEE 754 standard.



Pour l'aspect ratio, c'est pour définir par exemple si ton image est en 16/9 ou en 4/3. Tu divises la largeur par la hauteur de ton image, ça te donne l'"aspect ratio".

Ton zNear me paraît élevé. D'habitude il est plus proche de la caméra, ça peut expliquer des choses pour l'absence de texte. En gros, il n'est pas dans la partie rendue par la caméra (ce qu'on appelle le frustum).
Essaie avec un zNear de 0.1 pour tester ?

Je ne connais pas le reste, notamment BLF.

Contribution le : 17/07 09:36:43
_________________
Développement en cours du hARMful Engine
Créer un fichier PDF de la contribution Imprimer


Re: OpenGL ou comment afficher un texte en 3D
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1344
D'accord pour le "double" et ratio.

J'ai toujours pas mon texte malgré tes recommandations.

BLF, c'est le module qui permet "d'afficher" le texte, BGL.GLU... permet de l'initialiser. Étant donné que l'on est dans un espace 3D, soit 3 axes, je dois configurer aussi l'axe Z mais toujours rien.

edit: j'ai créer un blend test et j'ai placer un cube aux points 0, 0, 0: si j'utilise ortho2D, ça s'affiche, mais si je déplace le cube avant de lancer le jeu, ça ne s'affiche plus ou hors camera (car il se base sur les deux axes, on est d'accord).

GLUperspective, lui, rien ne change.

edit2: d'après une recherche sur internet, on dit d'utiliser gluProject, qui me semble être cohérent, mais je suis bloqué à partir de "modelMatrix", je ne sait pas quoi faire.

Contribution le : 17/07 10:15:49
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer


Re: OpenGL ou comment afficher un texte en 3D
OverdOzed
Inscrit:
23/02/2006 18:10
De Sideula
Post(s): 1988
Je n'utilise pas GLU qui est dépréciée avec les versions récentes d'OpenGL (en fait ça se base sur de vieilles choses qui ne sont plus utilisées). Donc je sais pas si je pourrai t'aider énormément, on va essayer quand même.

Si tu bloques pour les paramètres de gluProject, je te les explique.

Pour les matrices d'OpenGL, tu peux les avoir via la fonction glGetDoublev. Reste à voir où cette fonction se trouve dans BGL... Je pars sur du bgl.glGetDoublev() dans les exemples. Il faudra corriger si c'est pas ça.

Apparemment, les matrices sont récupérées sous forme de donnée de type bgl.Buffer. J'imagine qu'il faut créer un bgl.Buffer de flottants et les donner en paramètres.

Un truc au pif dans ce style (je ne code pas en Python, donc il faudra ajuster pour que ça passe ! ).
model_view = bgl.Buffer(bgl.GL_FLOAT, 16)
bgl.glGetDoublev(bgl.GL_MODELVIEW_MATRIX, model_view)


Maintenant, ton "model_view" contiendrait les valeurs nécessaires au paramètre "model" de gluProject().

Pour les suivants, c'est pareil sauf que tu utilises bgl.GL_PROJECTION_MATRIX (16 floats aussi) et bgl.GL_VIEWPORT (4 floats seulement).

projection = bgl.Buffer(bgl.GL_FLOAT, 16)
bgl.glGetDoublev(bgl.GL_PROJECTION_MATRIX, projection)

viewport = bgl.Buffer(bgl.GL_FLOAT, 4)
bgl.glGetDoublev(bgl.GL_VIEWPORT , viewport )



Une fois que tu as ces matrices, tu peux utiliser gluProject() pour récupérer la position à l'écran de l'objet dans les paramètres winX, winY et winZ.

Contribution le : 17/07 11:47:10
_________________
Développement en cours du hARMful Engine
Créer un fichier PDF de la contribution Imprimer


Re: OpenGL ou comment afficher un texte en 3D
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1344
Je comprends.

Je ne rencontre pas d'erreurs python, mais blender plante quand je démarre le jeu, après avoir rajouter tes lignes.

Je ne trouve pas plus d'info dans l'api à ce sujet moi non plus. Peut-être que je devrai me contenter de plans texturés, après tout, pour ce coup là.

Contribution le : 17/07 13:49:55
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer


Re: OpenGL ou comment afficher un texte en 3D
OverdOzed
Inscrit:
23/02/2006 18:10
De Sideula
Post(s): 1988
Oui en effet, ça plante. J'ai Blender sous la main pour tester.

En fait, la doc que j'ai consultée était celle d'une vieille version... Quelle patate, j'ai pas vérifié !

Voilà, avec ça, ça ne crashe pas.

model_view = bgl.Buffer(bgl.GL_DOUBLE, 16)
bgl.glGetDoublev(bgl.GL_MODELVIEW_MATRIX, model_view)

projection = bgl.Buffer(bgl.GL_DOUBLE, 16)
bgl.glGetDoublev(bgl.GL_PROJECTION_MATRIX, projection)

viewport = bgl.Buffer(bgl.GL_DOUBLE, 4)
bgl.glGetDoublev(bgl.GL_VIEWPORT, viewport)


Edit: la différence réside dans le bgl.GL_DOUBLE pour allouer le Buffer. Avec GL_FLOAT (deux fois plus petit), il écrivait en dehors du tableau...

Si c'est plus lisible pour toi, tu peux aussi utiliser la notation :
model_view = bgl.Buffer(bgl.GL_DOUBLE,  [4,4])


La sortie dans la console en faisant un 'print(model_view)' est un peu plus facile à lire, si jamais tu en as besoin.

Contribution le : 17/07 15:25:25
_________________
Développement en cours du hARMful Engine
Créer un fichier PDF de la contribution Imprimer


Re: OpenGL ou comment afficher un texte en 3D
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1344
Je suis désolé, mais je n'arrive à rien, je comprends pas ce que je dois faire avec les 3 derniers arguments et les 3 premiers, je ne suis pas sûr de savoir si c'est "l'objet" côté blender ou "l'objet" côté python...

Contribution le : 17/07 16:41:08
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer


Re: OpenGL ou comment afficher un texte en 3D
OverdOzed
Inscrit:
23/02/2006 18:10
De Sideula
Post(s): 1988
Je n'ai jamais eu besoin d'utiliser cette fonction, mais ce que j'en comprends : tu donnes la position de l'objet 3D qui est dans la scène. La fonctionne calcule ce qu'il faut pour te donner sa position à l'écran, comme si c'était un élément 2D.
Une chose qui s'en approche, ce sont les billboards : un plan de la scène mais toujours orienté vers la caméra.

Les trois premiers paramètres sont donc la position (world position) de l'objet dont tu veux avoir la position à l'écran.
Viennent ensuite les trois matrices dont nous avons discuté.
Les trois derniers sont ceux que tu récupères : cette fameuse position à l'écran.

C'est à cette position que tu peux afficher le texte. En particulier, je pense qu'il te faudrait passer en vue orthographique (gluOrtho) pour pouvoir l'afficher en 2D.

Instinctivement, je dirais que tu peux utiliser ces trois derniers paramètres dans ton appel :
blf.position(font_id, (width * text.posx), (height * text.posy), 1)


Je sais pas si c'est plus clair.
Je vais essayer d'utiliser BLF pour voir un peu tout ça et revenir avec plus d'informations si je parviens à quelque chose !

Contribution le : 17/07 18:53:05
_________________
Développement en cours du hARMful Engine
Créer un fichier PDF de la contribution Imprimer


Re: OpenGL ou comment afficher un texte en 3D
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1344
Oui, ça fonctionne bien, le billboard, quand on sait comment orienter le plan avant de lancer le moteur.

Là, ça me parle, du coup:

bgl.gluProject(scene.objects['Cube'].worldPosition[0], scene.objects['Cube'].worldPosition[1], scene.objects['Cube'].worldPosition[2], model_view, projection, viewport, test.posx, test.posy, test.posz)


Mais là, j'ai cette erreur:

"TypeError: must be bgl.Buffer, not float".

Apparemment, c'est l'axe Z qui pose problème aux 3 derniers arguments.

Contribution le : 17/07 20:02:03
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer


Re: OpenGL ou comment afficher un texte en 3D
OverdOzed
Inscrit:
23/02/2006 18:10
De Sideula
Post(s): 1988
Oui, j'ai eu cette erreur aussi.
En fait, comme la fonction écrit dedans mais qu'en Python c'est pas possible, il faut lui passer un Buffer de 1 flottant.

Je te passe le blend que j'ai fait.
Le texte s'affiche mais ça me frustre qu'il ne soit pas là où il le faut.
https://sharefiles.app/download/5b0de08df5353d0aab0f4ccc4c5bdf7cb9efa7b8

Je voudrais le positionner à l'endroit où se trouve le Empty. Je ne comprends pas trop d'où vient le problème pour l'instant...

Contribution le : 17/07 20:36:48
_________________
Développement en cours du hARMful Engine
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
(1) 2 »




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
Questions & Réponses Impression 3d 6 41 Aujourd'hui 20:24:48
Gloups 
Questions & Réponses Comment améliorer le rendu d’Eevee ?    [1][2] 12 902 Aujourd'hui 20:00:27
Sphere3d 
Questions & Réponses Relier 2 points de 2 courbe de bézier. Relier2 courbes en une seule. 1 25 Aujourd'hui 13:18:58
debutant 
Hors Sujet !! arc electrique 0 21 Aujourd'hui 13:05:48
david65 
Questions & Réponses [non résolu] Blender game engine fracture    [1][2][3]...[5] 43 770 Aujourd'hui 10:38:10
Redstar 
[WIP] et travaux terminés Entraînement personnage cartoon    [1][2][3]...[6] 56 7260 Hier 20:51:45
Gilead_Maerlyn 
Moteur de jeu GameBlender et alternatives [résolu] Character wrapper - code python 7 229 17/08 22:31:13
Bibi09 
Questions & Réponses Blender Game engime: touche pour ralentir mon jeux 1 52 17/08 21:52:19
theo29270 
The Blender Clan 'tchat Le topic des trucs à voir    [1][2][3]...[303] 3024 716320 17/08 18:54:32
Gilead_Maerlyn 
Questions & Réponses [résolu] Impossible de faire glisser la vue 8 184 17/08 18:28:34
GFC 
Questions & Réponses Export en fbx avec les matériaux 1 45 17/08 15:46:24
stigmamax 
Questions & Réponses Problème fenêtre modification "grisé" 7 82 17/08 13:54:32
Rawak 
[WIP] et travaux terminés [WIP] Portrait réaliste - Zbrush/Blender    [1][2][3]...[9] 84 9622 16/08 21:40:28
Papa_Dragon 
Hors Sujet !! qbit    [1][2][3][4] 33 1372 16/08 13:45:49
david65 
Questions & Réponses problème avec scatter 6 243 16/08 10:10:14
mynos 
[WIP] et travaux terminés [terminé] Ordre et propreté 2 - 1er jour 3 114 15/08 21:35:04
alienator1 
[WIP] et travaux terminés [WIP] Claptrap 1 108 15/08 17:47:01
Keezty 
Questions & Réponses Big soucis dans VSE 1 82 14/08 23:12:24
Rimpotche 
[WIP] et travaux terminés [terminé] Logo superman 1 95 14/08 13:45:08
moonboots 
The Blender Clan 'tchat Juste une impression de la 2.8 5 187 14/08 08:49:10
stigmamax 

Qui est en ligne
57 utilisateur(s) en ligne (dont 31 sur Forums)

Membre(s): 0
Invité(s): 57


plus...
Nouveaux membres
JonathanDb 19/8/2019
ZaneThrelf 19/8/2019
LenardSeal 19/8/2019
ChuL435040 19/8/2019
ChristyMce 19/8/2019
AlmaBobb12 19/8/2019
GusBlancha 19/8/2019
DenisLoewe 19/8/2019
FabianTuda 19/8/2019
KrisBlackl 19/8/2019
Dernier Ajout
Forky-3D-ToyStory BC.png

Evènements à venir
Sep 8
Anniversaire de ang
Nov 18
Anniversaire de RichDeg
Dec 29
Anniversaire d'ebrain
plus 279 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2019 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445