Напишите пожалуйста пример с подробными комментами, описывающий создание меша, накладывания текстуры, освещение... короче все что сможете. Очень нужно.
Помогите с 3D
Страница: 1
Сообщений 1 страница 4 из 4
Поделиться221.01.2013 18:18:30
Или прокомментируйте пожалуйста это:
Код:
; ; ------------------------------------------------------------ ; ; 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
Поделиться321.01.2013 21:35:03
Ставь текстовый курсор на имя функции, описание которой нужно.
Нажимай F1.
Поделиться422.01.2013 15:10:52
спс, это может помочь
Страница: 1