Seite 1 von 3

Echtzeitmanipulation von OGRE Meshes

Verfasst: 16.03.2009 22:05
von Fluid Byte
Ich will mit SetMeshData() eine Dreieck basteln aber mein Schirm bleibt leider schwarz. Ich hab' bei AddTriangle() schon mit den Indizes rumgespielt und teilweise die auch untere Kante gesehen, mehr aber auch nicht. Außerdem ist die SetMeshData() Funktion immer noch grottenschlecht dokumentiert. Auch das lange Rumsuchen im Forum bringt mich nicht auf Spur.

Ich bin mir noch nicht mal sicher ob der Parameter 'DataLength' nun die Anzahl der Element oder die tatsächlich Größe in Bytes meint ... :freak:

Code: Alles auswählen

InitEngine3D() : InitSprite() : InitKeyboard()
OpenWindow(0,0,0,640,480,"untitled",#WS_CAPTION | #WS_SYSMENU | #WS_MINIMIZEBOX | 1)	
OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
CreateCamera(0,0,0,100,100)
CameraRenderMode(0,#PB_Camera_Wireframe)

CreateMesh(0,100)

Structure Vertex
	X.f
	Y.f
	Z.f
EndStructure

Structure Triangle
	V1.w
	V2.w
	V3.w
EndStructure

Procedure AddVertex(Mesh,X.f,Y.f,Z.f)
	If IsMesh(Mesh)
		Protected vtx.Vertex				
		vtx\X = X : vtx\Y = Y : vtx\Z = Z		
		SetMeshData(Mesh,#PB_Mesh_Vertex,vtx,1)			
		ProcedureReturn #True
	EndIf
EndProcedure

Procedure AddTriangle(Mesh,V1,V2,V3)
	If IsMesh(Mesh)
		Protected tig.Triangle		
		tig\V1 = V1 : tig\V2 = V2 : tig\V3 = V3
		SetMeshData(Mesh,#PB_Mesh_Face,tig,1)		
		ProcedureReturn #True
	EndIf
EndProcedure

AddVertex(0,-1,0,0)
AddVertex(0,0,2,0)
AddVertex(0,1,0,0)

AddTriangle(0,0,1,2)

CreateEntity(0,MeshID(0),0,0,0,-5)

Repeat
	EventID = WindowEvent()
	ExamineKeyboard()
	ClearScreen(RGB(0,0,100))		
	RenderWorld()
	FlipBuffers()	
Until EventID = #WM_CLOSE Or KeyboardPushed(1)

Verfasst: 16.03.2009 23:08
von STARGÅTE
habe zwar keine Ahnung woran es bei dir liegt, aber da mein Würfel auch aus 12 Dreiecken besteht, kannst du sicher was damit anfangen:

Code: Alles auswählen

InitEngine3D()
InitSprite()
InitKeyboard()

xP = 800
yP = 600

OpenWindow(0, 0, 0, xP, yP+MenuHeight(), "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, xP, yP, 0, 0, 0)


 CreateMesh(0, 100)
  SetMeshData(0, #PB_Mesh_Vertex, ?CubePunkte,   14)
  SetMeshData(0, #PB_Mesh_Face,   ?CubeDreiecke, 12)
  
 CreateEntity(0, MeshID(0), 0)
 ScaleEntity(0, 100, 100, 100)
 
 CreateCamera(0, 0, 0, 100, 100)
 CameraRenderMode(0,#PB_Camera_Wireframe)
 CameraLocate(0, 0, 0, 1000)
 CameraLookAt(0,0,0,0) 
 
 
    
Repeat
 
 WindowEvent()
      
 ClearScreen(0)

 Kreis+1 : RotateEntity(0, Kreis, Kreis/2, Kreis/3)
 
 RenderWorld()
 
 FlipBuffers()

 ExamineKeyboard()
 If KeyboardPushed(#PB_Key_Escape) : End : EndIf

ForEver



DataSection

CubePunkte:
 Data.f  -1, -1,  1
 Data.f   1, -1,  1
 Data.f   1,  1,  1
 Data.f  -1,  1,  1
 Data.f   1, -1, -1
 Data.f   1,  1, -1
 Data.f  -1, -1, -1
 Data.f  -1,  1, -1
 Data.f  -1, -1,  1
 Data.f  -1,  1,  1
 Data.f  -1, -1, -1
 Data.f   1, -1, -1
 Data.f   1,  1, -1
 Data.f  -1,  1, -1
 
CubeDreiecke:
 Data.w  0, 1, 2
 Data.w  0, 2, 3
 Data.w  1, 4, 5
 Data.w  1, 5, 2
 Data.w  4, 6, 7
 Data.w  4, 7, 5
 Data.w  6, 8, 9
 Data.w  6, 9, 7
 Data.w 10,11, 1
 Data.w 10, 1, 0
 Data.w  3, 2,12
 Data.w  3,12,13
   
EndDataSection

ich vermute mal das bei dir irgendwas fehlt (Camera-sachen, oder so, zB wo sie steht und wohin sie guckt, oder wie groß das Mesh ist)

in der Hilfe steht übrigens eindeutig das
'Datenlänge' die Anzahl der Elemente
ist

Verfasst: 16.03.2009 23:23
von Fluid Byte
Och nöööööööhh .... :freak:

Es liegt daran das SetMeshData() das Mesh jedes mal neu initialisiert. Also alle vorherigen Aufrufe von SetMeshData() sind wirkungslos und überschreiben die vorhandenen Daten. Somit muss man alle nötigen Informationen mit einem Aufruf übergeben. Das bedeutet auch man kann im Nachhinein nicht mal eben ein einzelnes Vertex modifizieren sondern muss alles nochmal reinkloppen.

Schade eigentlich, Blitz3D kann das ohne Probleme. Ich weiß PB ist in Sachen 3D-Daddelei eher Mittelmaß aber alles was wir haben ist SetMeshData() mit einer grauenhaften Dokumention.

Trotzdem Danke für die Mühen! :mrgreen:

Verfasst: 16.03.2009 23:30
von STARGÅTE
naja dann kannst du es ja so machen das deine AddVertex() Procedure einen eigene Speicher vorbereitet, in dem du weitere Vertex hinzufügst.

danach kannst du noch n eigene CreateMesh Procedre machen, wo du dann die Quelle der Vertex angibst ...

Verfasst: 16.03.2009 23:38
von Fluid Byte
Genau so werde ich es machen. <)

Verfasst: 16.03.2009 23:51
von STARGÅTE
Weil ich gerade so drüber nachdenke ...

wenn du versuchst über SetMeshData die Meshs zu "animieren" indem du in Laufzeit halt einen vertex änderst, dann ist das wohl ungeeignet...

weil du ja jetzt immer wieder n Mesh erstellen musst ... kA in wie weit das Zeit kostet ...

ich inds auch schade das man nicht mehr "alleine" machen kann, sondern immer nur diese festen .mesh-Dateien verwenden kann.

EDIT: ich habe zB schon mal selber n Mesh Editor geschrieben, der dann mit SetMeshData arbeitet, aber wieder fallen lassen ...

Verfasst: 17.03.2009 00:21
von Fluid Byte
STARGÅTE hat geschrieben:wenn du versuchst über SetMeshData die Meshs zu "animieren" indem du in Laufzeit halt einen vertex änderst, dann ist das wohl ungeeignet...

weil du ja jetzt immer wieder n Mesh erstellen musst ... kA in wie weit das Zeit kostet ...
"Ungeeignet" ist wohl ein wenig untertrieben. :mrgreen:

Im Ernst, ohne direkten Zugriff auf ein Vertex ist die Idee zum Scheitern verurteilt. Der Geschwindigkeitsverlust ist einfach zu groß. Allerdings habe ich die Hoffnung das einige entsprechende Strukturen im englischen Forum zu finden sind die dies eventuell ermöglichen.

Verfasst: 17.03.2009 00:52
von Kaeru Gaman
öh... warum beschäftigt ihr euch nicht direkt mir OGRE?

eigentlich müßte man doch an etliche zusätzlichen Funktionen direkt drankommen können, so wie bei jeder lib...

Verfasst: 17.03.2009 08:31
von DarkDragon
Naja, Blitz3D mit OGRE zu vergleichen ist wie Windows 95 mit OpenSuSe 11.0. :freak: Ich glaube in der Zeit von DirectX 7 gab es erstmal keine großartigen Engines, die ihre Daten direkt an die GPU schickten (Animation usw. fand immer auf der CPU statt). Desshalb wurde ohnehin immer alles neu übertragen.

SetMeshData ist die billigste Methode ein Mesh zu erstellen. Normalerweise nimmt man dafür Modelldateien und damit geht das spitze, auch in PureBasic.

Verfasst: 17.03.2009 14:15
von Fluid Byte
Kaeru Gaman hat geschrieben:eigentlich müßte man doch an etliche zusätzlichen Funktionen direkt drankommen können, so wie bei jeder lib...
Aber wie genau?
Normalerweise nimmt man dafür Modelldateien und damit geht das spitze, auch in PureBasic.
Meinst du fertige Meshes wie Würfel, Zylinder und Kegel?