Напишите пожалуйста пример с подробными комментами, описывающий создание меша, накладывания текстуры, освещение... короче все что сможете. Очень нужно.
Помогите с 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
Endscreen3drequester.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