GUI-Anwendung mit 3D-Canvas oder -Fenster

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
slick
Beiträge: 6
Registriert: 05.12.2007 15:21

GUI-Anwendung mit 3D-Canvas oder -Fenster

Beitrag 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Benutzeravatar
slick
Beiträge: 6
Registriert: 05.12.2007 15:21

Beitrag von slick »

Soweit, so gut... aber mit InitSprite() ist es ja nicht wirklich 3D. Ich meinte so richtig mit InitEngine3D().
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

oups, da muss ich passen, ich kann mich nicht erinnern,
den Befehl ueberhaupt einmal benutzt zu haben.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
slick
Beiträge: 6
Registriert: 05.12.2007 15:21

Beitrag von slick »

Das zielt schon eher in die Richtung, an die ich dachte :D . Ich hatte bloß gehofft, dass man dafür keine 2 separaten Fenster aufmachen müsste :roll: 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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
slick
Beiträge: 6
Registriert: 05.12.2007 15:21

Beitrag 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.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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
Zuletzt geändert von Fluid Byte am 05.12.2007 22:05, insgesamt 1-mal geändert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag 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
"...smoking hash-tables until until you run out of memory." :P
Antworten