Aide pour mes débuts en 3D
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
tu tapes directx9Patrick88 a écrit :euh, je vois "bibliothèque sous système" dans les options de compilation
c'est vide et je ne sais pas quoi y mettre ...
pat
si tu es sous linux , tu tapes opengl
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
@Comtois
Oui ce bug est résolu avec cette option.
Merci pour l'info.
Par contre, j'ai un autre bug que je découvre. Je l'ai recopié dans le code plus bas.
Comment y remédier? CàD quel dépassement de valeur aboutit à ce crash?
Oui ce bug est résolu avec cette option.
Merci pour l'info.
Par contre, j'ai un autre bug que je découvre. Je l'ai recopié dans le code plus bas.
Comment y remédier? CàD quel dépassement de valeur aboutit à ce crash?
Code : Tout sélectionner
CR.S = Chr(10)
QT.S = Chr(34)
Info.S = "Assertion failed!" + CR + CR
Info + "Program: ..." + CR
Info + "File: y:\ogremain\include\OgreAxisAlignedBox.h" + CR
Info + "Line: 246" + CR + CR
Info + "Expression: (min.x <= max.x && min.y <= max.y && min.z <= max.z) && " + QT + "The minimum" + CR
Info + "corner of the box must be less than or equal to maximum corner" + QT + CR + CR
Info + "For information on how your program can cause an assertion" + CR
Info + "failure, see the Visual C++ documentation on asserts" + CR + CR
Info + "(Press Retry to debug the application - JIT must be enabled)"
MessageRequester("Microsoft Visual C++ Runtime Library", Info, 2)
@Comtois
Après recherche, je crois que c'est le FrameRate qui a du mal au démarrage quand on appuie sur le champignon pendant que la mémoire virtuelle se synchronise (sauvegarde ou chargement, j'en sais rien).
Comme tu as basé le calcul de la vitesse sur le FrameRate, ça fausse la gestion de la caméra (qui est magnifique en temps normal).
J'ai rajouté une boucle d'introduction pour laisser le FrameRate donner des valeurs justes.
Après recherche, je crois que c'est le FrameRate qui a du mal au démarrage quand on appuie sur le champignon pendant que la mémoire virtuelle se synchronise (sauvegarde ou chargement, j'en sais rien).
Comme tu as basé le calcul de la vitesse sur le FrameRate, ça fausse la gestion de la caméra (qui est magnifique en temps normal).
J'ai rajouté une boucle d'introduction pour laisser le FrameRate donner des valeurs justes.
Code : Tout sélectionner
;PB 4.30 le 10/01/09
InitEngine3D()
InitSprite()
InitKeyboard()
;Pour enregistrer au format PNG
UsePNGImageEncoder()
ExamineDesktops()
OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0), "Tutoriel 3D")
;Pour charger une texture, mesh, entity , etc, indiquer le chemin où se trouvent ces médias
Add3DArchive("/", #PB_3DArchive_FileSystem)
Enumeration
#VueDessus
#VueArriere
#VueCote
#VueAvant
EndEnumeration
Global Angle.f, Vitesse.f
Define.l Options, ModeCamera, i
ModeCamera = #VueArriere
Macro NEW_X(x, Angle, Distance)
((x) + Cos((Angle) * 0.0174533) * (Distance))
EndMacro
Macro NEW_Z(z, Angle, Distance)
((z) - Sin((Angle) * 0.0174533) * (Distance))
EndMacro
;- Declaration des procédures
Declare.f CurveValue(actuelle.f, Cible.f, P.f)
Declare GestionCamera(Mode.l)
;-Mesh
#Mesh = 0
CreateMesh(#Mesh, 100)
Options = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color | #PB_Mesh_UVCoordinate
SetMeshData(#Mesh, Options , ?Sommets, 24)
SetMeshData(#Mesh, #PB_Mesh_Face, ?Triangles, 12)
;-Textures
#Texture = 0
CreateImage(#Texture, 64, 64)
;Remplissage de la texture en blanc
StartDrawing(ImageOutput(#Texture))
Box(0, 0, ImageWidth(#Texture), ImageHeight(#Texture), $FFFFFF)
DrawingMode(#PB_2DDrawing_Outlined) ; Pour tracer le contour
Box(0, 0, ImageWidth(#Texture), ImageHeight(#Texture), 0)
StopDrawing()
;Enregistre l'image dans le même répertoire que le code source
Fichier$="TextureDVP1.PNG"
SaveImage(#Texture, Fichier$, #PB_ImagePlugin_PNG)
;Maintenant on peut charger notre texture
LoadTexture(#Texture, Fichier$)
#TextureSol = 1
CreateImage(#TextureSol, 128, 128)
;Remplissage de la texture en blanc
StartDrawing(ImageOutput(#TextureSol))
Box(0, 0, ImageWidth(#TextureSol), ImageHeight(#TextureSol), $FFFFFF)
For i = 0 To 127 Step 10
Line(i, 0, 0, ImageHeight(#TextureSol), $0000FF)
Line(0, i, ImageWidth(#TextureSol), 0, $0000FF)
Next i
DrawingMode(#PB_2DDrawing_Outlined) ; Pour tracer le contour
Box(0, 0, ImageWidth(#TextureSol), ImageHeight(#TextureSol), $000088)
StopDrawing()
;Enregistre l'image dans le même répertoire que le code source
Fichier$="TextureDVP2.PNG"
SaveImage(#TextureSol, Fichier$, #PB_ImagePlugin_PNG)
;Maintenant on peut charger notre texture
LoadTexture(#TextureSol, Fichier$)
;-Matière
#Matiere = 0
CreateMaterial(#Matiere, TextureID(#Texture))
#MatiereSol = 1
CreateMaterial(#MatiereSol, TextureID(#TextureSol))
;-Entity
#Entity = 0
CreateEntity(#Entity, MeshID(#Mesh), MaterialID(#Matiere))
ScaleEntity(#Entity, 10, 10, 10) ; Agrandi l'entity
EntityLocate(#Entity, 500, 5, 500)
#EntitySol = 1
CreateEntity(#EntitySol, MeshID(#Mesh), MaterialID(#MatiereSol))
ScaleEntity(#EntitySol, 1000, 2, 1000) ; Agrandi l'entity
EntityLocate(#EntitySol, 500, -5, 500)
;-Camera
#Camera = 0
CreateCamera(#Camera, 0, 0, 100, 100)
;-Light
AmbientColor(RGB(55,55,55)) ; Réduit la lumière ambiante pour mieux voir les lumières
#LightRouge = 0 : CreateLight(#LightRouge,RGB(255, 0, 0), 0, 500, 0)
#LightBleue = 1 : CreateLight(#LightBleue,RGB(0, 0, 255), 0, 500, 1000)
#LightVerte = 2 : CreateLight(#LightVerte,RGB(0, 255, 0), 1000, 500, 1000)
;- Sprite pour afficher l'aide
;- Petit échauffement pour éviter un claquage...
CreateSprite(64000, 256, 24)
StartDrawing(SpriteOutput(64000) )
DrawText(0, 0, "Please wait...", #White, #Black)
StopDrawing()
For i = 0 To 1 << 8
ExamineKeyboard()
FrameRate = Engine3DFrameRate(#PB_Engine3D_Current)
CameraLocate(#Camera, Px, Py, Pz)
CameraLookAt(#Camera, EntityX(#Entity), EntityY(#Entity), EntityZ(#Entity))
RenderWorld()
DisplayTransparentSprite(64000, 0, 0)
FlipBuffers()
Next
FreeSprite(64000)
;- Démarrage
Repeat
FrameRate = Engine3DFrameRate(#PB_Engine3D_Current)
Vitesse = 240 / FrameRate
If Vitesse > 10: Vitesse = 10: EndIf
If ExamineKeyboard()
;Change la vue de la caméra
If KeyboardReleased(#PB_Key_F1)
ModeCamera = #VueDessus
ElseIf KeyboardReleased(#PB_Key_F2)
ModeCamera = #VueArriere
ElseIf KeyboardReleased(#PB_Key_F3)
ModeCamera = #VueCote
ElseIf KeyboardReleased(#PB_Key_F4)
ModeCamera = #VueAvant
EndIf
If KeyboardPushed(#PB_Key_Left)
Angle + Vitesse
RotateEntity(#Entity, 0, Angle, 0, #PB_Absolute)
ElseIf KeyboardPushed(#PB_Key_Right)
Angle - Vitesse
RotateEntity(#Entity, 0, Angle, 0, #PB_Absolute)
EndIf
If KeyboardPushed(#PB_Key_Up)
MoveEntity(#Entity, NEW_X(0, Angle , Vitesse), 0, NEW_Z(0, Angle, Vitesse))
ElseIf KeyboardPushed(#PB_Key_Down)
MoveEntity(#Entity, NEW_X(0, Angle , -Vitesse), 0, NEW_Z(0, Angle, -Vitesse))
EndIf
EndIf
GestionCamera(ModeCamera)
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Procedure.f CurveValue(actuelle.f, Cible.f, P.f)
;Calcule une valeur progressive allant de la valeur actuelle à la valeur cible
Define.f Delta
Delta = Cible - actuelle
If P > 1000.0 : P = 1000.0 : EndIf
ProcedureReturn (actuelle + ( Delta * P / 1000.0))
EndProcedure
Procedure GestionCamera(Mode.l)
Define.f Px, Py, Pz, Pv
Static AngleCamera.f
Pv = 25 * (60 / Engine3DFrameRate(#PB_Engine3D_Current) )
Select Mode
Case #VueDessus
AngleCamera = CurveValue(AngleCamera, Angle + 180, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 40), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 140, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 40), Pv)
Case #VueArriere
AngleCamera = CurveValue(AngleCamera, Angle + 180, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)
Case #VueCote
AngleCamera = CurveValue(AngleCamera, Angle + 120, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)
Case #VueAvant
AngleCamera = CurveValue(AngleCamera, Angle, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)
EndSelect
CameraLocate(#Camera, Px, Py, Pz)
CameraLookAt(#Camera, EntityX(#Entity), EntityY(#Entity), EntityZ(#Entity))
EndProcedure
;{ Définition du cube
DataSection
Sommets:
;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:
;Face en Haut
Data.w 2,1,0
Data.w 0,3,2
;Face en Bas
Data.w 6,5,4
Data.w 4,7,6
;Face Avant
Data.w 10,9,8
Data.w 8,11,10
;Face Arrière
Data.w 14,13,12
Data.w 12,15,14
;Face Gauche
Data.w 18,17,16
Data.w 16,19,18
;Face Droite
Data.w 22,21,20
Data.w 20,23,22
EndDataSection
;}
-
- Messages : 130
- Inscription : dim. 11/janv./2009 15:04
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse