Seite 1 von 2
GUI-Anwendung mit 3D-Canvas oder -Fenster
Verfasst: 05.12.2007 15:26
von slick
Hallo Forumsmitglieder,
ist es mit PB möglich, eine Anwendung mit den GUI-Befehlen zu coden, die ein 3D-Fenster enthält? Also ein Gadget, das zur Anzeige von 3D-Grafik verwendet werden kann? Um beispielsweise ein kleines Utility zur Mesh-Manipulation zu programmieren, wo einem das veränderte Mesh in Echtzeit angezeigt wird. = kann man 3D-Befehle und GUI-Befehle in ein und derselben Anwendung verbraten?
Wenn ja, welches Gadget kann man dafür nehmen?
Greetz, slick
Verfasst: 05.12.2007 17:53
von edel
Code: Alles auswählen
InitSprite()
hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,400,400,"Test")
CreateGadgetList(hwnd)
imgg = ImageGadget(0,20,20,200,200,0,#PB_Image_Border)
OpenWindowedScreen(imgg,0,0,200,200,0,0,0)
Repeat
e = WaitWindowEvent(1)
If e = #PB_Event_CloseWindow
End
EndIf
ClearScreen(0)
StartDrawing(ScreenOutput())
Box(10,10,20,20,Random($FFFFFF))
StopDrawing()
FlipBuffers()
ForEver
Verfasst: 05.12.2007 17:59
von slick
Soweit, so gut... aber mit InitSprite() ist es ja nicht wirklich 3D. Ich meinte so richtig mit InitEngine3D().
Verfasst: 05.12.2007 18:26
von edel
oups, da muss ich passen, ich kann mich nicht erinnern,
den Befehl ueberhaupt einmal benutzt zu haben.
Verfasst: 05.12.2007 19:22
von Fluid Byte
Sowas in der Richtung?
Code: Alles auswählen
InitEngine3D() : InitSprite()
OpenWindow(0,0,0,150,100,"Controls",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
ButtonGadget(0,5,5,140,25,"START")
ButtonGadget(1,5,40,140,25,"STOP")
CheckBoxGadget(2,5,70,120,25,"WIREFRAME")
ResizeWindow(0,WindowX(0) - 300,#PB_Ignore,#PB_Ignore,#PB_Ignore)
OpenWindow(1,WindowX(0) + WindowWidth(0) + 10,WindowY(0),420,320,"Preview",#PB_Window_SystemMenu,WindowID(0))
OpenWindowedScreen(WindowID(1),0,0,420,320,0,0,0)
CreateCamera(0,0,0,100,100)
CameraBackColor(0,#White)
CameraLocate(0,0,40,110)
Add3DArchive(#PB_Compiler_Home + "Examples\Sources\Data\",#PB_3DArchive_FileSystem)
LoadMesh(0,"robot.mesh")
LoadTexture(0,"r2skin.jpg")
CreateMaterial(0,TextureID(0))
CreateEntity(0,MeshID(0),0,0,0,0)
EntityMaterial(0,MaterialID(0))
AnimateEntity(0,"Walk")
Repeat
Repeat
EventID = WindowEvent()
If EventID = #PB_Event_Gadget
Select EventGadget()
Case 0 : AnimateEntity(0,"Walk")
Case 1 : AnimateEntity(0,"Idle")
Case 2 : CameraRenderMode(0,#PB_Camera_Textured + GetGadgetState(2))
EndSelect
EndIf
If EventID = #PB_Event_CloseWindow : End : EndIf
Until EventID = 0
FlipBuffers()
RenderWorld()
Delay(1)
ForEver
Das ist das erstmal das Grundgerüst der Anwendung. Was die direkte Mesh-Manipulation angeht muss ich erstmal 'nen bischen suchen bzw. in Erfahrung bringen ob dies überhaupt möglich ist.
Verfasst: 05.12.2007 19:41
von slick
Das zielt schon eher in die Richtung, an die ich dachte

. Ich hatte bloß gehofft, dass man dafür keine 2 separaten Fenster aufmachen müsste

aber grundsätzlich ist das schonmal ein gehbarer Weg so. Danke erst einmal für diesen brauchbaren Ansatz.
Da mit der Mesh-Manipulation ist dann nochmal so´n Ding für sich. Muss ich auch nochmall drüber nachdenken. Immerhin, wo Animate geht, geht ja schonmal auch Resize, Rotate etc.
Greetz, slick
Verfasst: 05.12.2007 19:58
von Fluid Byte
Ich hatte bloß gehofft, dass man dafür keine 2 separaten Fenster aufmachen müsste
Das musst du auch nicht. Ich fand es nur logischer das voneinander zu trennen.
Muss ich auch nochmall drüber nachdenken. Immerhin, wo Animate geht, geht ja schonmal auch Resize, Rotate etc.
Das bezieht sicht nicht auf die Meshdaten selbst. Du änderst nur das Erscheinungsbild für die Kamera. Um die eigentlichen Daten zu manipulieren musst du SetMeshData() benutzen. Allerdings ist das recht kompliziert und absolut unzureichend dokumentiert.
Ein weiteres Problem ist direkte Selektion von Faces oder Vertices. Dies ist in Blitz3D recht einfach zu bewerkstelligen, mit ORGE bzw. PB ist das nicht möglich. Falls du sowas wie einen Mesh Editor basteln willst würde ich bspw. auf OpenGL umsteigen.
Verfasst: 05.12.2007 20:06
von slick
Aha. Okay, das leuchtet mir ein. Thanks!
Dann würde mich ja doch noch interessieren, wo du welche Änderung ansetzen würdest, um das in 1 und demselben Fenster unterzubringen. Weil mir halt nicht einleuchtet, in was für einem Gadget du die Renderscreen unterbringen würdest.
Verfasst: 05.12.2007 20:44
von Fluid Byte
Weil mir halt nicht einleuchtet, in was für einem Gadget du die Renderscreen unterbringen würdest.
Der Begriff "Gadget" ist nur eine schwammige Beschreibung. Alles kann ein Gadget sein. Der Screen selbst ist eine eigene Einheit. Du kannst ihn frei positionieren wie skalieren (wie bspw. ein ButtonGadget).
Code: Alles auswählen
InitSprite()
OpenWindow(0,0,0,360,215,"Controls",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
ButtonGadget(0,5,5,140,25,"START")
ButtonGadget(1,5,40,140,25,"STOP")
CheckBoxGadget(2,5,70,120,25,"WIREFRAME")
OpenWindowedScreen(WindowID(0),150,5,200,200,0,0,0)
Repeat
Repeat
EventID = WindowEvent()
If EventID = #PB_Event_CloseWindow : End : EndIf
Until EventID = 0
ClearScreen(0)
StartDrawing(ScreenOutput())
Angle.f + 0.015
For i=0 To 10
CX = 100 + Cos(Angle + (i * 8)) * 70
CY = 100 + Sin(Angle + (i * 8)) * 70
Circle(CX,CY,15,RGB(255,150,0))
Circle(CX,CY,8,RGB(255,200,0))
Next
StopDrawing()
FlipBuffers()
Delay(1)
ForEver
Verfasst: 05.12.2007 20:49
von Thalius
Schau mal Irrlicht an da ist ein Beispiel für GUI und 3D dabei ( funktioniert mit quasi jedem gadget ( idealerweise nimmst n imagegadget ).
Auch set / get vertice / indice kommandos sind dabei - 20 mesh formate. Und mit 1.06 kommt nun noch das mesh speichern hinzu. Wollte selbst schon nen kleinen edit schreiben - aber imo mit krankheit und allem uss ich mich aufswesentliche fokussiern) =/
Irrlicht
http://www.purebasic.fr/german/viewtopic.php?t=10332
Thalius