you can get the 3D intersection point with MousePick() , or i do not understand again ?
Code: Select all
;- Initialisation
IncludeFile "Screen3DRequester.pb"
If InitEngine3D() = 0
MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
End
EndIf
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
End
ElseIf Screen3DRequester() = 0
MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
End
EndIf
Add3DArchive("Data\" , #PB_3DArchive_FileSystem)
Add3DArchive("GUI\", #PB_3DArchive_FileSystem)
Add3DArchive("GUI\schemes", #PB_3DArchive_FileSystem)
Add3DArchive("GUI\imagesets", #PB_3DArchive_FileSystem)
Add3DArchive("GUI\fonts", #PB_3DArchive_FileSystem)
Add3DArchive("GUI\looknfeel", #PB_3DArchive_FileSystem)
Add3DArchive("GUI\layouts", #PB_3DArchive_FileSystem)
#PB_Node_Node = 1
#PB_Node_Entity = 2
Enumeration
#Haut
#Bas
#Devant
#Derriere
#Gauche
#Droit
#CentreX
#CentreY
#CentreZ
EndEnumeration
Structure Vertex
px.f
py.f
pz.f
nx.f
ny.f
nz.f
co.l
tu.f
tv.f
EndStructure
Structure Face
p1.w
p2.w
p3.w
p4.w
p5.w
p6.w
EndStructure
Structure s_Cube
No.l
EndStructure
Structure s_Angle
AngleX.f
AngleY.f
AngleZ.f
EndStructure
Macro MaCouleur(Rouge,Vert,Bleu)
Rouge << 16 + Vert << 8 + Bleu
EndMacro
;-Texture
UsePNGImageEncoder()
CreateImage(0,64,64)
StartDrawing(ImageOutput(0))
Box(0,0,64,64,$111111)
Box(1,1,62,62,$FFFFFF)
StopDrawing()
;-Material
Fichier$="Texture"+Str(0)+".png"
SaveImage(0,"Data\"+Fichier$,#PB_ImagePlugin_PNG)
LoadTexture(0,Fichier$)
CreateMaterial(0,TextureID(0))
MaterialAmbientColor(0,-1)
;-Entity
Global Taille=50
;Global AngleX.f,AngleY.f,AngleZ.f
Global Dim Rubik.s_Cube(2,2,2)
Global Dim Entity.s_Angle(26)
Global Dim Node(8)
;-Nodes
For i = 0 To 8
Node(i) = CreateNode(#PB_Any)
Next i
Angle = 90
No=0
For z = 0 To 2
For y = 0 To 2
For x = 0 To 2
*Ptr.Vertex=AllocateMemory(SizeOf(Vertex)*24)
CopyMemory(?Vertices,*Ptr,SizeOf(Vertex)*24)
;Couleur dessus
*Mem.Vertex = *Ptr
If y = 2
For i = 0 To 3
*Mem\co=MaCouleur(0,0,255)
*Mem + SizeOf(Vertex)
Next i
EndIf
;Couleur dessous
*Mem.Vertex = *Ptr + 4 * SizeOf(Vertex)
If y = 0
For i = 0 To 3
*Mem\co=MaCouleur(255,255,255)
*Mem + SizeOf(Vertex)
Next i
EndIf
;Couleur devant
*Mem.Vertex = *Ptr + 8 * SizeOf(Vertex)
If z = 2
For i = 0 To 3
*Mem\co=MaCouleur(255,255,0)
*Mem + SizeOf(Vertex)
Next i
EndIf
;Couleur derriere
*Mem.Vertex = *Ptr + 12 * SizeOf(Vertex)
If z = 0
For i = 0 To 3
*Mem\co=MaCouleur(255,128,0)
*Mem + SizeOf(Vertex)
Next i
EndIf
;Couleur gauche
*Mem.Vertex = *Ptr + 16 * SizeOf(Vertex)
If x = 0
For i = 0 To 3
*Mem\co=MaCouleur(0,255,0)
*Mem + SizeOf(Vertex)
Next i
EndIf
;Couleur droit
*Mem.Vertex = *Ptr + 20 * SizeOf(Vertex)
If x = 2
For i = 0 To 3
*Mem\co=MaCouleur(255,0,0)
*Mem + SizeOf(Vertex)
Next i
EndIf
CreateMesh(No,0.5)
SetMeshData(No, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color | #PB_Mesh_UVCoordinate , *Ptr,24)
SetMeshData(No,#PB_Mesh_Face,?Triangles,12)
CreateEntity(No,MeshID(No),MaterialID(0))
ScaleEntity(No,Taille - 1,Taille - 1,Taille - 1)
EntityLocate(No, (x-1) * Taille, (y-1) * Taille, (z-1) * Taille)
Rubik(x,y,z)\No=No
No+1
Next x
Next y
Next z
;C'est le cube témoin
CreateMesh(30,0.5)
SetMeshData(30, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color | #PB_Mesh_UVCoordinate , *Ptr,24)
SetMeshData(30,#PB_Mesh_Face,?Triangles,12)
CreateEntity(30,MeshID(30),MaterialID(0))
ScaleEntity(30,4,4,4)
;-Camera
CreateCamera(0,0,0,100,100)
CameraBackColor(0,RGB(0,0,255))
AmbientColor(RGB(200,200,200))
CameraLocate(0,EntityX(Centre) + 250 ,EntityY(Centre)+ 250,EntityZ(Centre))
MoveCamera(0,0,0,350)
CameraLookAt(0,EntityX(Centre),EntityY(Centre),EntityZ(Centre))
ShowGUI(128, #True)
;-Main loop
Repeat
If ExamineKeyboard()
EndIf
If ExamineMouse()
InputEvent3D(MouseX(), MouseY(), 0, "")
If MouseButton(#PB_MouseButton_Left)
Entity=MousePick(0, MouseX(), MouseY())
If Entity<>30
EntityLocate(30,PickX(),PickY(),PickZ())
EndIf
SetWindowTitle(0,"Entité sélectionnée " + Str(CameraProjectionX(0,PickX(),PickY(),PickZ())) + " - " + Str(CameraProjectionY(0,PickX(),PickY(),PickZ())))
EndIf
EndIf
Repeat
Event = WindowEvent3D()
Until Event = 0
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or event = #PB_Event_CloseWindow
End
DataSection
Vertices:
;Dessus 0 à 3
Data.f -0.5,0.5,-0.5
Data.f 0,1,0
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 0,1,0
Data.l 0
Data.f 0,1
Data.f 0.5,0.5,0.5
Data.f 0,1,0
Data.l 0
Data.f 1,1
Data.f -0.5,0.5,0.5
Data.f 0,1,0
Data.l 0
Data.f 1,0
;Dessous 4 à 7
Data.f -0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,0
Data.f 0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,-0.5
Data.f 0,-1,0
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,-0.5
Data.f 0,-1,0
Data.l 0
Data.f 1,0
;Devant 8 à 11
Data.f -0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,0
;Derrière 12 à 15
Data.f 0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,0
Data.f -0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,1
Data.f -0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,1
Data.f 0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,0
;Cote gauche 16 à 19
Data.f -0.5,0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 0,0
Data.f -0.5,0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 0,1
Data.f -0.5,-0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 1,0
;Cote droit 20 à 23
Data.f 0.5,0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 1,1
Data.f 0.5,-0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 1,0
Triangles:
;0 à 3
Data.w 2,1,0
Data.w 0,3,2
;4 à 7
Data.w 6,5,4
Data.w 4,7,6
;8 à 11
Data.w 10,9,8
Data.w 8,11,10
;12 à 15
Data.w 14,13,12
Data.w 12,15,14
;16 à 19
Data.w 18,17,16
Data.w 16,19,18
;20 à 23
Data.w 22,21,20
Data.w 20,23,22
EndDataSection