Salut ATHOW
Comme promis, un petit code, en fait deux pour voir si cela peut éclairer ta lanterne.
Le premier reprend l'explication donnée par Cpl.Bator. C'est relativement simple à comprendre
et à mettre en oeuvre.
Code : Tout sélectionner
; Include files
IncludePath "includes" : IncludeFile "n3xtD_PB.pbi"
; Globales
Global anglex.f, angley.f, flagXDown.w
Global mox.f, omx.f, moy.l, omy.l
Global *app.l, Quit.l
;----------------------------------------------------------
; open n3xt-D screen
*app = iCreateGraphics3D(800,600)
; << OR >>
;*app = iCreateGraphics3D(800,600, 32, #False, #True, #EDT_DIRECT3D9)
If *app= #Null
End
EndIf
; change le repertoire courant pour facilité le chargement des media
SetCurrentDirectory("media/")
;---------------------------------------------------------------------
;---------------------------------------------------------------------
; charge un objet 3D, dans notre cas l'objet 'sphereLOD1.3DS"
; j'ai chois cet objet 3DS, car il est dans les medias du pack N3xtD
Global *obj.IObject = iLoad3DObject("sphereLOD1.3DS")
; creation d'un mesh à partir de l'objet chargé précédemment
Global *mesh.IMesh = iCreateMesh(*obj)
;!!!!!!!!!!!!!!!!!!!!!
; >> ou encore , tu peux partir sur les objet pré-programmés<<
;!!!!!!!!!!!!!!!!!!!!!
; creation d'un cylindre bleu, d'un diamètre 1 et d'une hauteur de 5
;Global *mesh.IMesh = iCreateCylinder(1.0, 5.0, $ff0000ff)
;---------------------------------------------------------------------
;---------------------------------------------------------------------
; une petite camera pour voir ce qui se passe
Define *cam.ICamera = iCreateCamera( )
iPositionNode(*cam, 0,2,-30)
;-----------------------------------
; load font png, pour pouvoir écrire
; deux trois trucs
iLoadFont("courriernew.png")
Global *font.IGUIFont = iGetFont()
; ---------------------------------------
; main loop
; ---------------------------------------
Repeat
; par le biais de quelques touches de bases,
; on interfère directement sur la taille
; du mesh, dans ce cas on scale en fonction
; des axes choisis (pour les deux premiers cas)
; ou sur la totalité des axes pour le troisème
; cas.
If iGetKeyDown(#KEY_KEY_D)
iScaleNode( *mesh , 1, 2, 1)
EndIf
If iGetKeyDown(#KEY_KEY_C)
iScaleNode( *mesh , 1, 1, 1)
EndIf
If iGetKeyDown(#KEY_KEY_F)
iScaleNode( *mesh , 2, 1,1)
EndIf
If iGetKeyDown(#KEY_KEY_G)
iScaleNode( *mesh , 1, 1,1)
EndIf
If iGetKeyDown(#KEY_KEY_B)
iScaleNode( *mesh , 2,2,2)
EndIf
If iGetKeyDown(#KEY_KEY_V)
iScaleNode( *mesh , 1,1,1)
EndIf
; move camera with dir key and mouse (left click)
If iGetKeyDown(#KEY_ARROW_UP)
iMoveNode(*cam, 0,0,0.5)
EndIf
If iGetKeyDown(#KEY_ARROW_DOWN)
iMoveNode(*cam, 0,0,-0.5)
EndIf
If iGetMouseEvent(#MOUSE_BUTTON_LEFT)
If flagXDown=0
omx = iGetMouseX()
omy = iGetMouseY()
flagXDown=11
Else
moy = iGetMouseY()-omy
angley=(moy/10.0)
omy= iGetMouseY()
mox = iGetMouseX()-omx
anglex=(mox/10.0)
omx= iGetMouseX()
iTurnNode(*cam, angley, anglex,0)
EndIf
Else
flagXDown=0
EndIf
; just turn our mesh
iTurnNode(*mesh, 0,0,0.5)
; if Escape Key, exit
If iGetKeyDown(#KEY_ESCAPE)
Quit=1
EndIf
; ---------------
; Render
; ---------------
iBeginScene()
iDrawScene()
iDrawText(*font, "DirKey et Souris pour bouger la camera", 10,10,0,0, $ff00ffff)
iDrawText(*font, "touche D et C pour changer la taille sur l'axe Y", 10,25,0,0, $ffffff00)
iDrawText(*font, "touche F et G pour changer la taille sur l'axe X", 10,40,0,0, $ffffff00)
iDrawText(*font, "touche V et B pour changer la taille sur les 3 axes", 10,55,0,0, $ffffff00)
iEndScene()
Until Quit=1
; end
iFreeEngine()
Il existe une seconde solution, qui à la base ne semble pas vraiment coller à ton projet, mais qui
sais, la connaitre peut toujours être interessant.
C'est de directement agir sur les sommets de ton objet. On touche donc directement à la geométrie de ton
élément. Dans certains cas, cette une option qui parfois peut être utile:
Code : Tout sélectionner
; Include files
IncludePath "includes" : IncludeFile "n3xtD_PB.pbi"
; Globales
Global anglex.f, angley.f, flagXDown.w
Global mox.f, omx.f, moy.l, omy.l
Global *app.l, Quit.l
;----------------------------------------------------------
; open n3xt-D screen
*app = iCreateGraphics3D(800,600)
; << OR >>
;*app = iCreateGraphics3D(800,600, 32, #False, #True, #EDT_DIRECT3D9)
If *app= #Null
End
EndIf
; change le repertoire courant pour facilité le chargement des media
SetCurrentDirectory("media/")
;---------------------------------------------------------------------
;---------------------------------------------------------------------
; charge un objet 3D, dans notre cas l'objet 'sphereLOD1.3DS"
Global *obj.IObject = iLoad3DObject("sphereLOD1.3DS")
; creation d'un mesh à partir de l'objet chargé précédement
Global *mesh.IMesh = iCreateMesh(*obj)
;!!!!!!!!!!!!!!!!!!!!!
; >> ou encore , tu peux partir sur les objet pré-programmés<<
;!!!!!!!!!!!!!!!!!!!!!
; creation d'un cylindre bleu, d'un diamètre 1 et d'une hauteur de 5
;Global *mesh.IMesh = iCreateCylinder(1.0, 5.0, $ff0000ff)
;---------------------------------------------------------------------
;---------------------------------------------------------------------
; récupération de la geométrie de notre mesh, en d'autre
; termes, on récupère l'adresse ou sont mémorisé les
; differentes coordonnées formant le mesh, comme par examples
; les coordonnées des vertices.
; Cela va nous servir plus loin
Global *geom.IMeshBuffer = iMeshGeometry(*mesh)
; une petite camera pour voir ce qui se passe
Define *cam.ICamera = iCreateCamera( )
iPositionNode(*cam, 0,2,-30)
;-----------------------------------
; load font png, pour pouvoir écrire
; deux trois trucs
iLoadFont("courriernew.png")
Global *font.IGUIFont = iGetFont()
; ---------------------------------------
; main loop
; ---------------------------------------
Repeat
; par le biais de quelques touches de bases,
; on interfère directement sur la géométrie
; du mesh, dans ce cas on scale en fonction
; des axes choisis (pour les deux premiers cas)
; ou sur la totalité des axes pour le troisème
; cas.
; Pour résumer, on multiplie les coordonnées de
; nos sommets par un facteur donnée. Si la valeur
; de cette multiplication est supérieur à 1, alors
; on augmente la taille du mesh, et évidement, si
; on multiplie par une valeur inférieure à 1 on
; réduit la taille du mesh
If iGetKeyDown(#KEY_KEY_D)
iScaleMeshBuffer( *geom , 1, 1.01, 1)
EndIf
If iGetKeyDown(#KEY_KEY_C)
iScaleMeshBuffer( *geom , 1, 0.99, 1)
EndIf
If iGetKeyDown(#KEY_KEY_F)
iScaleMeshBuffer( *geom , 1.01, 1,1)
EndIf
If iGetKeyDown(#KEY_KEY_G)
iScaleMeshBuffer( *geom , 0.99, 1,1)
EndIf
If iGetKeyDown(#KEY_KEY_B)
iScaleMeshBuffer( *geom , 1.01, 1.01, 1.01)
EndIf
If iGetKeyDown(#KEY_KEY_V)
iScaleMeshBuffer( *geom , 0.99, 0.99, 0.99)
EndIf
; move camera with dir key and mouse (left click)
If iGetKeyDown(#KEY_ARROW_UP)
iMoveNode(*cam, 0,0,0.5)
EndIf
If iGetKeyDown(#KEY_ARROW_DOWN)
iMoveNode(*cam, 0,0,-0.5)
EndIf
If iGetMouseEvent(#MOUSE_BUTTON_LEFT)
If flagXDown=0
omx = iGetMouseX()
omy = iGetMouseY()
flagXDown=11
Else
moy = iGetMouseY()-omy
angley=(moy/10.0)
omy= iGetMouseY()
mox = iGetMouseX()-omx
anglex=(mox/10.0)
omx= iGetMouseX()
iTurnNode(*cam, angley, anglex,0)
EndIf
Else
flagXDown=0
EndIf
; just turn our mesh
iTurnNode(*mesh, 0,0,0.5)
; if Escape Key, exit
If iGetKeyDown(#KEY_ESCAPE)
Quit=1
EndIf
; ---------------
; Render
; ---------------
iBeginScene()
iDrawScene()
iDrawText(*font, "DirKey et Souris pour bouger la camera", 10,10,0,0, $ff00ffff)
iDrawText(*font, "touche D et C pour changer la geometie sur l'axe Y", 10,25,0,0, $ffffff00)
iDrawText(*font, "touche F et G pour changer la geometie sur l'axe X", 10,40,0,0, $ffffff00)
iDrawText(*font, "touche V et B pour changer la geometie sur les 3 axes", 10,55,0,0, $ffffff00)
iEndScene()
Until Quit=1
; end
iFreeEngine()