Echtzeitmanipulation von OGRE Meshes

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Echtzeitmanipulation von OGRE Meshes

Beitrag 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)
Zuletzt geändert von Fluid Byte am 17.03.2009 14:12, insgesamt 1-mal geändert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
Zuletzt geändert von STARGÅTE am 16.03.2009 23:27, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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:
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Genau so werde ich es machen. <)
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Antworten