PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → Off-topic → Champ cube (avec GDImage)
Champ cube (avec GDImage)
Started by Patrice Terrier, Jun., 24 2009 1:01 PM - No answer
Posted on June, 24 2009 - 1:01 PM
T h e C u b e

Ce projet montre comment réaliser un contrôle de type "champ cube" avec GDImage 5.07+

Caractéristiques principales :

1 - Nul besoin d'installer le framework DotNET (il n'y a donc pas d'attente lors du lancement initial).
2 - Vous pouvez afficher une image différente sur chaque face du cube.
3 - Vous pouvez déclancher une action spécifique en cliquant sur une face du cube (exemple : changer l'image de fond).
4 - Le GFI GDImage est compatible avec toutes les animations y compris DirectX, OpenGL, et les contrôles externes.
5 - Vous pouvez déplacer le cube à n'importe quel endroit dans le champ GDImage (avec la souris ou le clavier).
6 - La fonction "clone" (spécifique de GDImage) vous permet d'avoir plusieurs cubes qui fonctionnent en même temps, sans augmenter les ressources utilisées.

Parallèlement ce projet montre comment effectuer une sélection avec la souris sur un objet 3D comportant plusieurs faces.

Dans le monde de la 3D, le moyen usuel d'effectuer une sélection sur un objet en mouvement se nomme : "Picking".
Cependant cette technique, basée sur l'éloignement des différents objets par rapport à la caméra, ne permet pas de connaître avec certitude l'endroit précis correspondant aux coordonnées de la souris.

J'ai donc été obligé d'utiliser une autre méthode appelée "color detection".
Avec cette méthode, lorsqu'on est en mode "HitDetection", on utilise une couleur unique sur chaque face du cube au lieu d'y "mapper" les textures.
Ensuite, il suffit de tester la couleur du point survolé par la souris, pour connaître la face correspondante.

L'affectation des couleurs est effectuée dans la procédure "DrawCube" :
Procedure DrawCube(LOCAL nHitDetection is int)
IF nHitDetection THEN glColor4ub(0,0,1,255)
GL_DrawCubeFrontFace(gaMt[1]:Texture)
IF nHitDetection THEN glColor4ub(0,0,2,255)
GL_DrawCubeBackFace(gaMt[2]:Texture)
IF nHitDetection THEN glColor4ub(0,0,3,255)
GL_DrawCubeTopFace(gaMt[3]:Texture)
IF nHitDetection THEN glColor4ub(0,0,4,255)
GL_DrawCubeBottomFace(gaMt[4]:Texture)
IF nHitDetection THEN glColor4ub(0,0,5,255)
GL_DrawCubeRightFace(gaMt[5]:Texture)
IF nHitDetection THEN glColor4ub(0,0,6,255)
GL_DrawCubeLeftFace(gaMt[6]:Texture)

La détection proprement dite "HitDetection" est effectuée dans la procédure "RenderAnimation" :
IF nHitDetection THEN
SetStaticValue("nHitDetection", nHitDetection)
x, y is int
rw is RECT
lp is POINT
nID is 1byte int
ZD_GetObjectXY(IDS_3DOBJECT, x, y)
mX is int = gnMouseX - x
mY is int = gnMouseY - y
zSplitColorARGB(GetPixel(GLmemDC(), mX, mY), 0, nID, 0, 0)
IF nID < ArrayInfo(gaMt, tiDimension) + 1 THEN
gsUseBackground = gaMt[nID]:FullName; GDImageUpdateBackground()
// What is the next ListBox texture to use?
nItem is int = ListSelect(BackgroundList)
IF nItem < ListCount(BackgroundList) THEN nItem++ ELSE nItem = 1
ListSelectPlus(BackgroundList, nItem)
// Update the selected texture
gaMt[nID]:FullName = BackgroundList[nItem]
ZI_UpdateNamedGLTextureFromFileEx(gaMt[nID]:FullName, gaMt[nID]:ID, gaMt[nID]:Square)
END
SetStaticValue("nHitDetection", 0)
ELSE
// Paint the resulting bitmap to our window
ZD_ReplaceObjectBitmap(ZI_CreateBitmapFromImage(zBitmapToImage( GLmemDC() )), IDS_3DOBJECT, True)
END


Capture d'écran :






Comment utiliser "The Cube" :

1 - Effectuer un simple ou double clic, avec le bouton gauche de la souris, sur l'une des faces du cube (le plus gros). L'image sélectionnée est utilisée comme nouveau fond de la fenêtre, tandis qu'une nouvelle image est affichée sur la face correspondante du cube.
2 - Vous pouvez utiliser la souris (bouton gauche) ou le clavier pour déplacer le cube à un nouvel emplacement.
3 - Un clic avec le bouton droit de la souris permet de choisir un nouveau dossier contenant des images qui seront affichées sur les faces du cube (choisir de préférence un dossier contenant plus de 6 images).
4 - Vous pouvez déplacer tous les cubes, cependant la sélection d'image ne se fera que sur le cube principal, celui qui est agrandi lors du démarrage initial.

Note:
En raison de l'utilisation des fonctions 3D de GDImage, vous devez utiliser une carte graphique qui supporte les spécification OpenGL 2.00+.

Lien direct pour télécharger le projet au format WD12 :
http://www.zapsolution.com/windev/TheCubeWD12.zip