Page 1 sur 2

Soucis de texture de dès

Publié : sam. 23/janv./2016 0:07
par Ar-S
Salut,

Etant un gros noob en codage 3D, j'ai repris le code de falsam concernant les cubes car j'aimerai créer des dés en 3D
J'ai donc créé une texture qui me parait logique.

Image

J'ai repris le code en insérant la texture.
Mon soucis est qu'elle se plaque en entier sur chaque face du dés. Comment l'appliquer à l'ensemble de l'objet ?

Note: j'ai compilé en 5.31 car en 5.41 EntityPhysicBody est obsolète.. Je suppose que ça a été remplacé par CreateEntityBody à la place de CreateEntity mais dans le doute...

Code : Tout sélectionner

;Naissance d'un cube : Premiere chute
UsePNGImageDecoder()
; Coordonnées x,y,z de la caméra
Define.f CamX, CamY, CamZ

InitEngine3D()
Parse3DScripts()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Naissance d'un cube

; Une forme : C'est notre MESH qui ici sera un cube
Cube_Mesh = CreateCube(#PB_Any, 1)
Ground_Mesh = CreatePlane(#PB_Any, 10, 10, 3, 3, 3, 3)

Add3DArchive("C:\Users\LDVM\OneDrive\Documents\PB\3D\des", #PB_3DArchive_FileSystem)
Texture = LoadTexture(#PB_Any,"text1.png")

; StartDrawing(TextureOutput(Texture))
; Box(0,0,512,512,RGB(0, 0, 0))
; Box(1,1,510,510,RGB(255, 216, 0))
; StopDrawing()

; Un MATERIEL c'est la partie visible de notre cube qui sera constitué de notre texture
Material = CreateMaterial(#PB_Any,TextureID(texture))

; Création d'un cube en hauteur
; CreateEntity() permet de définir les coordonnées x,y,z lors de la création d'une entité
Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material), 0, 1, 0)
EntityPhysicBody(Cube_Entity, #PB_Entity_BoxBody,2,0,1)

; Création du sol
Ground_Entity = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, -2, 0)
EntityPhysicBody(Ground_Entity, #PB_Entity_StaticBody, 0, 0, 1)

;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CamX=2.0
CamY=1.0
CamZ=15

; La caméra regarde en direction du point au coordonnées x=0, y=0, z=0
CameraLookAt(camera,0,0,0)


While #True
 
  Event = WindowEvent()
   
  ExamineKeyboard() 
 
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf 
 
  If KeyboardPushed(#PB_Key_Left)
    CamX-0.2 
  ElseIf KeyboardPushed(#PB_Key_Right)
    CamX+0.2
  EndIf
 
  If KeyboardPushed(#PB_Key_Up)
    CamY+0.2 
  ElseIf KeyboardPushed(#PB_Key_Down)
    CamY-0.2
  EndIf
   
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
 
  ; Affiche le rendu de la scène
  RenderWorld()
  FlipBuffers()
Wend 

Re: Soucis de texture de dès

Publié : sam. 23/janv./2016 12:42
par comtois
il faut adapter les coordonnées uv de la texture, plusieurs façons de faire, en voici une :

Code : Tout sélectionner

;Naissance d'un cube : Premiere chute
UsePNGImageDecoder()
; Coordonnées x,y,z de la caméra
Define.f CamX, CamY, CamZ

InitEngine3D()
Parse3DScripts()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Naissance d'un cube
; Une forme : C'est notre MESH qui ici sera un cube
Cube_Mesh = CreateMesh(#PB_Any)
;Haut
MeshVertexPosition(-0.5, 0.5,0.5)
MeshVertexNormal(0, 1, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.33, 0.25)
MeshVertexPosition(-0.5, 0.5,-0.5)
MeshVertexNormal(0, 1, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.33, 0.50)
MeshVertexPosition(0.5, 0.5,-0.5)
MeshVertexNormal(0, 1, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.66, 0.50)
MeshVertexPosition(0.5, 0.5,0.5)
MeshVertexNormal(0, 1, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.66, 0.25)
MeshFace(2, 1, 0)
MeshFace(3, 2, 0)
;dessous
AddSubMesh()
MeshVertexPosition(-0.5, -0.5,0.5)
MeshVertexNormal(0, -1, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.33, 0.75)
MeshVertexPosition(-0.5, -0.5,-0.5)
MeshVertexNormal(0, -1, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.33, 1.00)
MeshVertexPosition(0.5, -0.5,-0.5)
MeshVertexNormal(0, -1, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.66, 1.00)
MeshVertexPosition(0.5, -0.5,0.5)
MeshVertexNormal(0, -1, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.66, 0.75)
MeshFace(0, 1, 2)
MeshFace(0, 2, 3)
;arriere
AddSubMesh()
MeshVertexPosition(-0.5, -0.5,-0.5)
MeshVertexNormal(0, 0, -1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.33, 0.5)
MeshVertexPosition(-0.5, 0.5,-0.5)
MeshVertexNormal(0, 0, -1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.33, 0.75)
MeshVertexPosition(0.5, 0.5,-0.5)
MeshVertexNormal(0, 0, -1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.66, 0.75)
MeshVertexPosition(0.5, -0.5,-0.5)
MeshVertexNormal(0, 0, -1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.66, 0.5)
MeshFace(0, 1, 2)
MeshFace(0, 2, 3)
;avant
AddSubMesh()
MeshVertexPosition(-0.5, -0.5,0.5)
MeshVertexNormal(0, 0, 1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.33, 0.0)
MeshVertexPosition(-0.5, 0.5,0.5)
MeshVertexNormal(0, 0, 1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.33, 0.25)
MeshVertexPosition(0.5, 0.5,0.5)
MeshVertexNormal(0, 0, 1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.66, 0.25)
MeshVertexPosition(0.5, -0.5,0.5)
MeshVertexNormal(0, 0, 1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.66, 0.0)
MeshFace(2, 1, 0)
MeshFace(3, 2, 0)
;gauche
AddSubMesh()
MeshVertexPosition(-0.5, -0.5,-0.5)
MeshVertexNormal(-1, 0, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.00, 0.25)
MeshVertexPosition(-0.5, 0.5,-0.5)
MeshVertexNormal(-1, 0, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.00, 0.50)
MeshVertexPosition(-0.5, 0.5,0.5)
MeshVertexNormal(-1, 0, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.33, 0.50)
MeshVertexPosition(-0.5, -0.5,0.5)
MeshVertexNormal(-1, 0, 0)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.33, 0.25)
MeshFace(2, 1, 0)
MeshFace(3, 2, 0)
;droit
AddSubMesh()
MeshVertexPosition(0.5, -0.5,-0.5)
MeshVertexNormal(0, 0, 1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.66, 0.25)
MeshVertexPosition(0.5, 0.5,-0.5)
MeshVertexNormal(0, 0, 1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(0.66, 0.50)
MeshVertexPosition(0.5, 0.5,0.5)
MeshVertexNormal(0, 0, 1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(1.00, 0.50)
MeshVertexPosition(0.5, -0.5,0.5)
MeshVertexNormal(0, 0, 1)
MeshVertexColor(RGB(255,255,255))
MeshVertexTextureCoordinate(1.00, 0.25)
MeshFace(0, 1, 2)
MeshFace(0, 2, 3)
FinishMesh(1)


Ground_Mesh = CreatePlane(#PB_Any, 10, 10, 3, 3, 3, 3)

      
 Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Texture = LoadTexture(#PB_Any,"de.png")

; StartDrawing(TextureOutput(Texture))
; Box(0,0,512,512,RGB(0, 0, 0))
; Box(1,1,510,510,RGB(255, 216, 0))
; StopDrawing()

; Un MATERIEL c'est la partie visible de notre cube qui sera constitué de notre texture
Material = CreateMaterial(#PB_Any,TextureID(texture))

; Création d'un cube en hauteur
; CreateEntity() permet de définir les coordonnées x,y,z lors de la création d'une entité
Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material), 0, 6, 0)
CreateEntityBody(Cube_Entity, #PB_Entity_BoxBody,0.1,0.1,0.1)
RotateEntity(Cube_Entity, Random(180), Random(180), Random(180), #PB_Absolute)

; Création du sol
Ground_Entity = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, -2, 0)
CreateEntityBody(Ground_Entity, #PB_Entity_StaticBody, 0, 0.1, 0.1)


;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CamX=2.0
CamY=1.0
CamZ=15

; La caméra regarde en direction du point au coordonnées x=0, y=0, z=0
CameraLookAt(camera,0,0,0)


While #True

  Event = WindowEvent()
   
  ExamineKeyboard()

  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf

  If KeyboardPushed(#PB_Key_Left)
    CamX-0.2
  ElseIf KeyboardPushed(#PB_Key_Right)
    CamX+0.2
  EndIf

  If KeyboardPushed(#PB_Key_Up)
    CamY+0.2
  ElseIf KeyboardPushed(#PB_Key_Down)
    CamY-0.2
  EndIf
  
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)

  ; Affiche le rendu de la scène
  RenderWorld()
  FlipBuffers()
Wend 

Re: Soucis de texture de dès

Publié : sam. 23/janv./2016 13:53
par Ar-S
Merci Comtois,

ça colle parfaitement, par contre j'hallucine qu'il faille indiquer toutes les coords de la texture !
Comment as tu trouvé les coord des MeshVertex ?
J'ai une certaine experience avec 3DS Max. Avec lui on applique une texture et à un objet et elle se plaque, même s'il faut parfois la remanier.
Je trouve aussi étrange l'objet et l'entité. Je trouve que ça fait double emploi.
Je vais gratter encore parce que là je ne trouve pas ça évident du tout

--- edit ---
@Dobro, par habitude justement des soft 3D que j'ai déjà utilisé, mais vu la misère, je pense faire comme ça pour d'autres objets 3D. En revanche je ne sais pas si le raccord sera propre alors qu'avec 1 seule texture, ça englobe tout.

Re: Soucis de texture de dès

Publié : sam. 23/janv./2016 16:13
par comtois
Ar-S a écrit :Comment as tu trouvé les coord des MeshVertex ?
J'avais fait un petit tuto ici
En gros u et v sont comprises entre 0 et 1.
Pour le calcul :
u = position en x /taille de l'image en x
v = position en y /taille de l'image en y
si je reprends ton image 768x1024 les coordonnées du chiffre '1' se trouvent entre :
0.33 et 0.66 pour u (256/768=0.33 et 512/768=0.66)
0.25 et 0.50 pour v (256/1024=0.25 et 512/1024=0.5)
Ou dans le cas de ton image c'est encore plus simple, elle est composée de 3 carrés sur la largeur et 4 sur la hauteur, tu peux raisonner ainsi pour calculer le chiffre 1 :
u se trouve entre 1/3 et 2/3
v se trouve entre 1/4 et 2/4
J'ai une certaine experience avec 3DS Max. Avec lui on applique une texture et à un objet et elle se plaque, même s'il faut parfois la remanier.
3DS fait le calcul pour toi.

J'ai bien précisé que je montrais une façon de faire. La solution de Spock est plus simple, en utilisant une image par face tu auras les mêmes coordonnées uv pour toutes les faces.

Re: Soucis de texture de dès

Publié : sam. 23/janv./2016 16:44
par falsam
Ar-S a écrit :J'ai une certaine experience avec 3DS Max.
Il existe un plugin d'exportation vers Ogre3D.

:arrow: http://www.ogre3d.org/tikiwiki/Easy+Ogre+Exporter

N'ayant pas 3DS Max je n'ai pas pu tester.

Re: Soucis de texture de dès

Publié : lun. 25/janv./2016 14:35
par Mesa
J'ai un bug bizarre.
Toujours le même bug sous xp avec Parse3DScripts():
[14 :19 :15] [ERREUR] Accès mémoire invalide. (erreur de lecture à l'adresse 0)
En général, il suffit de le déplacer pour résoudre le bug, je l'ai mis après "Add3DArchive...("
Et là j'ai une autre erreur:
[14 :20 :30] [ERREUR] InitEngine3D() doit être appelée avec succès avant d'utiliser le jeu de commandes 3D.
Évidemment, je n'ai pas touché à InitEngine3D().

M.

Re: Soucis de texture de dès

Publié : lun. 25/janv./2016 19:54
par comtois
Exact le parseScript() est mal placé, mais je n'avais pas d'erreur. Et si je le déplace comme tu l'indiques je n'ai pas d'erreur.
Testé avec la 5.41 x86 sous windows 10, j'ai aussi testé avec le sous système opengl, toujours pas d'erreur.

Les exemples 3D fonctionnent tous chez toi ou tu as aussi des erreurs ?

Re: Soucis de texture de dès

Publié : mar. 26/janv./2016 10:13
par Mesa
J'ai testé tous les exemples datés de 2015 et quelques uns de 2014.


Tout fonctionne sauf:
1) Il faut déplacer Parse3DScript après if screen3drequester() pour tous les exemples.
2) Terrainshadow, terrainphysic et worddebug fonctionnent mais plantent après appui sur la touche ESC
3) Raycollide, le curseur de cegui s'affiche mais ne sert à rien, il ne se déplace pas.

Il semble que le screen3drequester() arrange bien les choses car dès que je veux "trafiquer" un peu le code et me passer de ce "requester", apparaissent alors plein de problèmes.

M.

Re: Soucis de texture de dès

Publié : mar. 26/janv./2016 19:11
par comtois
Mesa a écrit : 1) Il faut déplacer Parse3DScript après if screen3drequester() pour tous les exemples.
2) Terrainshadow, terrainphysic et worddebug fonctionnent mais plantent après appui sur la touche ESC
3) Raycollide, le curseur de cegui s'affiche mais ne sert à rien, il ne se déplace pas.

Il semble que le screen3drequester() arrange bien les choses car dès que je veux "trafiquer" un peu le code et me passer de ce "requester", apparaissent alors plein de problèmes.
M.
1) J'en prends note
2) C'est un bug connu apparu avec la 5.41 et qui touche toutes les libs dès que tu utilises #PB_any pour définir un objet.
3) En effet, il manque cette ligne dans la boucle

Code : Tout sélectionner

 InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
Mais la souris ne sert à rien dans cet exemple, je la supprimerai.

Alors c'est rassurant , avec ton pc en carton tu arrives à faire fonctionner les exemples mais ça ne m'explique pas pourquoi le code plus haut merdouille chez toi.
Tu as quelle erreur dans ton fichier log ?

Re: Soucis de texture de dès

Publié : mer. 27/janv./2016 9:28
par djes
Ar-S a écrit :Merci Comtois,

ça colle parfaitement, par contre j'hallucine qu'il faille indiquer toutes les coords de la texture !
Comment as tu trouvé les coord des MeshVertex ?
J'ai une certaine experience avec 3DS Max. Avec lui on applique une texture et à un objet et elle se plaque, même s'il faut parfois la remanier.
Je trouve aussi étrange l'objet et l'entité. Je trouve que ça fait double emploi.
Je vais gratter encore parce que là je ne trouve pas ça évident du tout
C'est parce que tu n'as pas l'habitude de faire de la 3D. Avant, on utilisait des textures positionnées selon des modèles mathématiques (plan, sphère, cube, cylindre...). Il fallait aussi déformer l'image en fonction du modèle. Par exemple, le mapping de la terre (voir ici https://www.google.fr/search?q=earth+ma ... 20&bih=965), implique de faire une image où les pôles sont très allongés en largeur, et l'équateur écrasé. Sans compter qu'au final, la plupart des logiciels 3D (et des cartes 3D) fonctionnent avec de simples triangles...

Avec l'UV-mapping, on a résolu pas mal de problèmes, mais cela implique de faire un travail d'association d'un point 3D à une position dans la texture 2D. On peut aussi associer plusieurs triangles à la même texture, ce qui est très pratique pour éviter de manipuler plein de fichiers images. Très souvent, le modeleur (le logiciel 3D) peut le faire automatiquement, surtout quand les formes sont simples. Mais au delà d'une certaine complexité, le designer doit faire des petites retouches lui-même.

Prenons l'exemple d'une tête : tu as une forme simple, plus ou moins sphéroïde. On pourrait se dire que cela ira avec un modèle mathématique sphère, mais malheureusement il y aussi le derrière des oreilles, l'intérieur du nez, etc. Donc on va devoir bricoler un peu... Voici quelques exemples où l'on voit le mesh (la grille de points) aplatie pour coller à l'image 2D : https://www.google.fr/search?q=head+uv- ... UQ_AUIBygB , et on voit aussi quelques textures crées pour coller à ça.

Les logiciels de dessin 3D (comme z-brush), permettent de peindre directement sur le modèle et de manipuler les positions 2D/3D quand celles-ci sont défaillantes. L'un des problèmes les plus courants est la superposition de positions (quand deux triangles sont positionnés au même endroit sur la texture 2D). Un autre (moins grave) est l'inversion (le triangle montre la face inverse, comme une pièce de monnaie côté pile au lieu d'être côté face).

Voilà, voilà. :)

Re: Soucis de texture de dès

Publié : mer. 27/janv./2016 9:51
par Mesa
Avec le compilo 5.41LTSx86: le log n'apparait pas ni la console de débogage. En fait, je vois un "flash", la console apparait et disparait aussitôt.

Avec le compilo 5.40b4, pas de log mais la console s'affiche, sauf qu'elle est vide.
Avec toujours les mêmes messages d’erreur.

Avec le compilo 5.31, tout va bien jusqu'à CreateEntityBody() qu'il ne connait pas. Il ne peut donc pas créer de log.


M.

Re: Soucis de texture de dès

Publié : mer. 27/janv./2016 13:51
par falsam
Dommage que la création du cube avec la fonction CreateCube() ne crée pas un cube dont chacune des faces est un submesh.

On aurait pu utiliser dans ce cas la fonction SetMeshMaterial(#Mesh, MaterialID [, SubMesh]) afin d'affecter un matériel à une face.

Re: Soucis de texture de dès

Publié : mer. 27/janv./2016 14:08
par comtois
Mesa a écrit :Avec le compilo 5.41LTSx86: le log n'apparait pas ni la console de débogage. En fait, je vois un "flash", la console apparait et disparait aussitôt.

Avec le compilo 5.40b4, pas de log mais la console s'affiche, sauf qu'elle est vide.
Avec toujours les mêmes messages d’erreur.

Avec le compilo 5.31, tout va bien jusqu'à CreateEntityBody() qu'il ne connait pas. Il ne peut donc pas créer de log.

M.
Ajoute #PB_Engine3D_DebugLog en paramètre de initEngine3D() pour créer le fichier log.

Re: Soucis de texture de dès

Publié : mer. 27/janv./2016 14:09
par comtois
falsam a écrit :Dommage que la création du cube avec la fonction CreateCube() ne crée pas un cube dont chacune des faces est un submesh.

On aurait pu utiliser dans ce cas la fonction SetMeshMaterial(#Mesh, MaterialID [, SubMesh]) afin d'affecter un matériel à une face.
Effectivement ça pourrait simplifier les choses, je vais regarder.

Re: Soucis de texture de dès

Publié : mer. 27/janv./2016 14:24
par falsam
comtois a écrit :Effectivement ça pourrait simplifier les choses, je vais regarder.
Hoooo YeaHHhh :)