PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Помогите с 3D


Помогите с 3D

Сообщений 1 страница 4 из 4

1

Напишите пожалуйста пример с подробными комментами, описывающий создание меша, накладывания текстуры, освещение... короче все что сможете. Очень нужно.

0

2

Или прокомментируйте пожалуйста это:

Код:
;
; ------------------------------------------------------------
;
;   PureBasic - Manual Mesh
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

Define.f x, y, z, nx, ny, nz, u, v
Define.l Co
Define.w t1, t2, t3

If InitEngine3D()
  
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    ; Create a pyramid, manually.. See the DataSection, for more precisions
    ;
    
    Restore Pyramid
    
    CreateMesh(0)
    
    ;Base
    AddSubMesh()
    For i = 0 To 3
      Read.f x : Read.f y : Read.f z
      Read.l Co
      Read.f u : Read.f v
      AddMeshVertex(x, y, z)
      MeshVertexNormal(0, 0, 0)
      MeshVertexColor(Co)
      MeshVertexTextureCoordinate(u, v)
    Next
    
    For i = 0 To 1
      Read.w t1 : Read.w t2 : Read.w t3
      AddMeshFace(t1, t2, t3)
    Next
    
    ;Side
    For k=0 To 3
      
      AddSubMesh()
      For i = 0 To 2
        Read.f x : Read.f y : Read.f z
        Read.l Co
        Read.f u : Read.f v
        AddMeshVertex(x, y, z)
        MeshVertexNormal(0, 0, 0) 
        MeshVertexColor(Co)
        MeshVertexTextureCoordinate(u, v)
      Next i
      Read.w t1 : Read.w t2 : Read.w t3
      AddMeshFace(t1, t2, t3)
      
    Next
    
    FinishMesh()
    NormalizeMesh(0) 
    
    UpdateMeshBoundingBox(0)
    
    CreateMaterial(0, LoadTexture(0, "Geebee2.bmp"))
    MaterialAmbientColor(0, #PB_Material_AmbientColors)
    
    CreateEntity(0, MeshID(0), MaterialID(0))
    ScaleEntity(0, 400, 200, 400)
    
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, 0, 0, 1000)
    
    CreateLight(0, RGB(255,255,255), 300, 600, -100)
    AmbientColor(RGB(80, 80, 80))
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
      
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        
      EndIf
         
      RotateEntity(0, 1, 1, 1, #PB_Relative)
      
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)
      
      RenderWorld()
      Screen3DStats()      
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End

DataSection
  Pyramid:
  ;Base
  Data.f -0.5,-0.5,0.5  ; position
  Data.l $FF            ; color
  Data.f 0,0            ; UVCoordinate
  
  Data.f 0.5,-0.5,0.5   ; position
  Data.l $FF            ; color 
  Data.f 0,1            ; UVCoordinate
  
  Data.f 0.5,-0.5,-0.5  ; position
  Data.l $FF            ; color
  Data.f 1,1            ; UVCoordinate
  
  Data.f -0.5,-0.5,-0.5 ; position
  Data.l $FF            ; color
  Data.f 1,0            ; UVCoordinate
  
  Data.w 2,1,0          ; Face 
  Data.w 0,3,2          ; Face 
  
  ;-Front
  Data.f 0.5,-0.5,0.5   ; position
  Data.l $FFFFFF        ; color
  Data.f 1,0            ; UVCoordinate
  
  Data.f 0.0,0.5,0.0
  Data.l $FFFFFF
  Data.f 0.5,0.5
  
  Data.f -0.5,-0.5,0.5
  Data.l $FFFFFF
  Data.f 0,0
  
  Data.w 0,1,2         ; Face
  
  ;-Back
  Data.f -0.5,-0.5,-0.5
  Data.l $FFFFFF
  Data.f 0,1
  
  Data.f 0.0,0.5,0.0
  Data.l $FFFFFF
  Data.f 0.5,0.5
  
  Data.f 0.5,-0.5,-0.5
  Data.l $FFFFFF
  Data.f 1,1
  
  Data.w 0,1,2
  
  ;-Left
  Data.f -0.5,-0.5,0.5
  Data.l $FFFFFF
  Data.f 0,0
  
  Data.f 0.0,0.5,0.0
  Data.l $FFFFFF
  Data.f 0.5,0.5
  
  Data.f -0.5,-0.5,-0.5
  Data.l $FFFFFF
  Data.f 0,1
  
  Data.w 0,1,2
  
  ;-Right
  Data.f 0.5,-0.5,-0.5
  Data.l $FFFFFF
  Data.f 1,1
  
  Data.f 0.0,0.5,0.0
  Data.l $FFFFFF
  Data.f 0.5,0.5
  
  Data.f 0.5,-0.5,0.5
  Data.l $FFFFFF
  Data.f 1,0
  
  Data.w 0,1,2
  
EndDataSection
Код:
;
; ------------------------------------------------------------
;
;   PureBasic - Manul Mesh
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 0.5
#SQRT13 = 0.57735026

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    ; Create a cube manually
    ; 
    
    ; Define all the vertices and their attributes
    CreateMesh(0)
    AddMeshVertex(-150, 150, -150)
    MeshVertexNormal(-#SQRT13,#SQRT13,-#SQRT13)
    MeshVertexNormal(-#SQRT13,#SQRT13,-#SQRT13)
    MeshVertexNormal(-#SQRT13,#SQRT13,-#SQRT13)
      MeshVertexColor(RGB(255, 0, 0))
      
    AddMeshVertex(100, 100, -100)
      MeshVertexNormal(#SQRT13,#SQRT13,-#SQRT13)
      MeshVertexColor(RGB(255, 0, 0))
      
    AddMeshVertex(100, -100, -100)
      ;MeshVertexNormal(#SQRT13,-#SQRT13,-#SQRT13)
      MeshVertexColor(RGB(255, 0, 0))
      
      AddMeshVertex(-100, -100, -100)
      ;MeshVertexNormal(-#SQRT13,-#SQRT13,-#SQRT13)
      MeshVertexColor(RGB(255, 0, 255))
      
    AddMeshVertex(-100, 100, 100)
      ;MeshVertexNormal(-#SQRT13,#SQRT13,#SQRT13)
      MeshVertexColor(RGB(255, 0, 0))
      
    AddMeshVertex(100, 100, 100)
      ;MeshVertexNormal(#SQRT13,#SQRT13,#SQRT13)
      MeshVertexColor(RGB(255, 0, 255))
      
    AddMeshVertex(100, -100, 100)
      ;MeshVertexNormal(#SQRT13,-#SQRT13,#SQRT13)
      MeshVertexColor(RGB(255, 0, 0))
      
    AddMeshVertex(-100, -100, 100)
      ;MeshVertexNormal(-#SQRT13,-#SQRT13,#SQRT13)
      MeshVertexColor(RGB(255, 0, 0))
      
    ; Define all the faces, based on the vertex index
    ;
    AddMeshFace(0, 2, 3)
    AddMeshFace(0, 1, 2)
    AddMeshFace(1, 6, 2)
    AddMeshFace(1, 5, 6)
    AddMeshFace(4, 6, 5)
    AddMeshFace(4, 7, 6)
    AddMeshFace(0, 7, 4)
    AddMeshFace(0, 3, 7)
    AddMeshFace(0, 5, 1)
    AddMeshFace(0, 4, 5)
    AddMeshFace(2, 7, 3)
    AddMeshFace(2, 6, 7)
    
    FinishMesh()
    
    CreateMaterial(0, LoadTexture(0, "clouds.jpg"))
    MaterialAmbientColor(0, #PB_Material_AmbientColors)
    
    CreateEntity(0, MeshID(0), MaterialID(0))
    
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, 0, 0, 1000)
    
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
      
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
                  
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf

      EndIf
      
      RotateEntity(0, 1, 1, 1, #PB_Relative)
      
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)
      
      RenderWorld()
      Screen3DStats()      
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf
  
End

screen3drequester.pb

Код:
;
; ------------------------------------------------------------
;
;   PureBasic - Common 3D functions
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#WINDOW_Screen3DRequester = 0

#GADGET_FullScreen        = 1
#GADGET_Windowed          = 2
#GADGET_ScreenModesLabel  = 3
#GADGET_WindowedModes     = 4
#GADGET_Launch            = 5
#GADGET_Cancel            = 6
#GADGET_Logo              = 7
#GADGET_Frame             = 8
#GADGET_ScreenModes       = 9
#GADGET_Antialiasing      = 10
#GADGET_AntialiasingModes = 11


Global Screen3DRequester_FullScreen, Screen3DRequester_ShowStats

UsePNGImageDecoder()

Procedure Screen3DRequester()

  OpenPreferences(GetHomeDirectory()+"PureBasicDemos3D.prefs")
    FullScreen          = ReadPreferenceLong  ("FullScreen"        , 0)
    FullScreenMode$     = ReadPreferenceString("FullScreenMode"    , "800x600")
    WindowedScreenMode$ = ReadPreferenceString("WindowedScreenMode", "800x600")
    AAMode              = ReadPreferenceLong  ("Antialiasing"      , 0)
    
  If ExamineDesktops()
    ScreenX = DesktopWidth(0)
    ScreenY = DesktopHeight(0)
    ScreenD = DesktopDepth(0)
    ScreenF = DesktopFrequency(0)
  EndIf
  
  If OpenWindow(#WINDOW_Screen3DRequester, 0, 0, 396, 230, "PureBasic - 3D Demos", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_Invisible)
    
    Top = 6
    
    ImageGadget  (#GADGET_Logo, 6, Top, 0, 0, LoadImage(0,"Data/PureBasic3DLogo.png"), #PB_Image_Border) : Top+76
    
    Frame3DGadget(#GADGET_Frame, 6, Top, 384, 105, "", 0) : Top+20
    
    OptionGadget(#GADGET_FullScreen, 70, Top, 100, 20, "Fullscreen")        : Top+25
    OptionGadget(#GADGET_Windowed  , 70, Top, 100, 20, "Windowed")          : Top+25
    TextGadget(#GADGET_Antialiasing, 70, Top+5, 100, 20, "Antialiasing mode") : Top - 50 
    
    ComboBoxGadget (#GADGET_ScreenModes  , 190, Top, 150, 21)     : Top+25
    ComboBoxGadget (#GADGET_WindowedModes, 190, Top, 150, 21)     : Top+25
    ComboBoxGadget (#GADGET_AntialiasingModes, 190, Top, 150, 21) : Top+45
   
    ButtonGadget (#GADGET_Launch,   6, Top, 180, 25, "Launch", #PB_Button_Default)
    ButtonGadget (#GADGET_Cancel, 200, Top, 190, 25, "Cancel")
      
    AddGadgetItem(#GADGET_AntialiasingModes,-1,"None")
    AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x2")
    AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x4")
    AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x6")
  
    SetGadgetState(#GADGET_AntialiasingModes,AAMode)
    
    If ExamineScreenModes()
      
      Position = 0
      While NextScreenMode()
        
        Position + 1
        Width       = ScreenModeWidth()
        Height      = ScreenModeHeight()
        Depth       = ScreenModeDepth()
        RefreshRate = ScreenModeRefreshRate()
        
        If Depth > 8
          AddGadgetItem(#GADGET_ScreenModes, -1, Str(Width)+"x"+Str(Height)+"x"+Str(Depth)+"@"+Str(RefreshRate))
          If ScreenX = Width And ScreenY = Height And ScreenD = Depth And ScreenF = RefreshRate
            SetGadgetState(#GADGET_ScreenModes, Position)
            FullScreenMode$ = Str(Width)+"x"+Str(Height)+"x"+Str(Depth)+"@"+Str(RefreshRate)
          EndIf  
        EndIf
       
      Wend        
      
    EndIf
    
    ExamineDesktops()
    NbScreenModes = 7
    
    Restore WindowedScreenDimensions

    Repeat      
      Read.l CurrentWidth
      Read.l CurrentHeight
      
      If CurrentWidth < DesktopWidth(0) And CurrentHeight < DesktopHeight(0)
        AddGadgetItem(#GADGET_WindowedModes, -1, Str(CurrentWidth)+ "x"+Str(CurrentHeight))
        NbScreenModes - 1
      Else
        NbScreenModes = 0
      EndIf
      
    Until NbScreenModes = 0
    
    SetGadgetState(#GADGET_FullScreen, FullScreen)
    SetGadgetState(#GADGET_Windowed  , 1-FullScreen)

    SetGadgetText (#GADGET_ScreenModes  , FullScreenMode$)
    SetGadgetText (#GADGET_WindowedModes, WindowedScreenMode$)
    
    DisableGadget (#GADGET_ScreenModes  , 1-FullScreen)
    DisableGadget (#GADGET_WindowedModes, FullScreen)
    
    HideWindow(#WINDOW_Screen3DRequester, 0)
    
    Repeat
      
      Event = WaitWindowEvent()
      
      Select Event
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
          
        Case #GADGET_Launch
          Quit = 2
          
        Case #GADGET_Cancel
          Quit = 1
          
        Case #GADGET_FullScreen
          DisableGadget(#GADGET_ScreenModes  , 0)
          DisableGadget(#GADGET_WindowedModes, 1)
        
        Case #GADGET_Windowed
          DisableGadget(#GADGET_ScreenModes  , 1)
          DisableGadget(#GADGET_WindowedModes, 0)
                 
        EndSelect
        
      Case #PB_Event_CloseWindow
        Quit = 1
        
      EndSelect
      
    Until Quit > 0
    
    FullScreen          = GetGadgetState(#GADGET_FullScreen)
    FullScreenMode$     = GetGadgetText (#GADGET_ScreenModes)
    WindowedScreenMode$ = GetGadgetText (#GADGET_WindowedModes)
    AAMode              = GetGadgetState(#GADGET_AntialiasingModes)
    
    CloseWindow(#WINDOW_Screen3DRequester)
      
  EndIf
  
  If Quit = 2 ; Launch button has been pressed
  
    CreatePreferences(GetHomeDirectory()+"PureBasicDemos3D.prefs")
      WritePreferenceLong  ("FullScreen"        , FullScreen)          
      WritePreferenceString("FullScreenMode"    , FullScreenMode$)     
      WritePreferenceString("WindowedScreenMode", WindowedScreenMode$) 
      WritePreferenceLong  ("Antialiasing"      , AAMode)  
      
    If FullScreen
      ScreenMode$ = FullScreenMode$
    Else
      ScreenMode$ = WindowedScreenMode$
    EndIf
    
    RefreshRate = Val(StringField(ScreenMode$, 2, "@"))
    
    ScreenMode$ = StringField(ScreenMode$, 1, "@") ; Remove the refresh rate info, so we can parse it easily
    
    ScreenWidth  = Val(StringField(ScreenMode$, 1, "x"))
    ScreenHeight = Val(StringField(ScreenMode$, 2, "x"))
    ScreenDepth  = Val(StringField(ScreenMode$, 3, "x"))
    
    Screen3DRequester_FullScreen = FullScreen ; Global variable, for the Screen3DEvents
    
    Select AAMode
      Case 0:
        AntialiasingMode(#PB_AntialiasingMode_None)
      Case 1:
        AntialiasingMode(#PB_AntialiasingMode_x2)
      Case 2:
        AntialiasingMode(#PB_AntialiasingMode_x4)
      Case 3:
        AntialiasingMode(#PB_AntialiasingMode_x6)
    EndSelect
    
    If FullScreen
      Result = OpenScreen(ScreenWidth, ScreenHeight, ScreenDepth, "3D Demos", #PB_Screen_WaitSynchronization, RefreshRate)
    Else
      If OpenWindow(0, 0, 0, ScreenWidth, ScreenHeight+MenuHeight(), "PureBasic - 3D Demos", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
      
        CreateMenu(0, WindowID(#WINDOW_Screen3DRequester))
          MenuTitle("Project")
          MenuItem(0, "Quit")
    
          MenuTitle("About")
          MenuItem(1, "About...")
              
        Result = OpenWindowedScreen(WindowID(#WINDOW_Screen3DRequester), 0, 0, ScreenWidth, ScreenHeight, 0, 0, 0)
      EndIf
    EndIf
    

    
    
  EndIf
     
  ProcedureReturn Result
EndProcedure


Procedure Screen3DEvents()

  If Screen3DRequester_FullScreen = 0 ; Handle all the events relatives to the window..
  
    Repeat
      Event = WindowEvent()
      
      Select Event
      
        Case #PB_Event_Menu
          Select EventMenu()
          
            Case 0
              Quit = 1
          
            Case 2
              MessageRequester("Info", "Windowed 3D in PureBasic !", 0)
              
          EndSelect
             
        Case #PB_Event_CloseWindow
          Quit = 1
        
      EndSelect
      
      If Quit = 1 : End : EndIf  ; Quit the app immediately
    Until Event = 0
    
  EndIf
  
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_F1)
      Screen3DRequester_ShowStats = 1-Screen3DRequester_ShowStats ; Switch the ShowStats on/off
    EndIf
  EndIf
          
EndProcedure


Procedure Screen3DStats()
  If Screen3DRequester_ShowStats
    ; Nothing printed for now
  EndIf
EndProcedure

        


DataSection
  WindowedScreenDimensions:
    Data.l  320, 240
    Data.l  512, 384      
    Data.l  640, 480
    Data.l  800, 600     
    Data.l 1024, 768
    Data.l 1280, 1024
    Data.l 1600, 1200
EndDataSection

0

3

Ставь текстовый курсор на имя функции, описание которой нужно.
Нажимай F1.

0

4

спс, это может помочь

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Помогите с 3D