Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 07:15

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Jun 18, 2010 18:04 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Hallo,

Ich habe mein System aufgrund einiger Fehler komplett neu machen müssen, doch beim installieren aller Programme ist mir etwas aufgefallen was mich bis jetzt schon viele Stunden suchen und noch mehr nerfen gekostet hat. Ich habe mein Milkshape mit meinem cmp importer vergessen zu saven.

Nun ist es aber fast unmöglich ein altes Milkshape bzw ein neueren cmp importer zu finden, darum dachte ich eventuell könnte man soetwas selber schreiben? gibt es da möglichkeiten?

es haben schon viele Leute zu den unterschiedlichsten zwecken das Format aufgeschlüsselt, es ist meines wissens nach statisch und verwendete Texturen werden in .mat dateien gespeichert
(sie müssen nicht mehr einzeln vorliegen).

es gibt nun 2 Möglichkeiten wie ich weiterkommen könnte

1. es geht das ich einen Loader schreibe für die cmp und mat dateien
2. ich kann einen importer für milkshape oder Blender schreiben

beides hab ich noch nicht gemacht aber das hat mich noch nie davon abgehalten euch zu fragen, alles zu lesen was ich irgendwoher bekomme und es dann zu versuchen :)

hat jemand eine ahnung wie man sowas anfängt bzw wie das gehen könnte?

lg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 18, 2010 19:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
With glmodel you can read and write milksape ascii files. (also .obj and read .3ds and. x files). It can also read .obj and write milkshape ascii. It is also possible to extend it with other formats e.g. binarie mikshape files, but you have to write code to do so extending base classes.

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 18, 2010 19:19 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
das bringt mich aber nicht wirklich weiter, da ich ja keine .obj dateien habe sondern nur *.cmp, *.sur, *.mat und *.3db dateien
ich habe diese immer in *.obj dateien umgewandelt, andersherum bringt mir das leider nix,
oder hab ich jetzt einfach was bei der übersetzung deines beitrages verhauen?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 19, 2010 17:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
So those .cmp files are not milksape files? You know how these files are constructed?
glmodel can load and save .obj.
have a look how the sources look for .obj.
Maybe that help you to make a reader for your .cmp files?

http://www.noeska.com/dogl/glModel.aspx

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 19, 2010 20:26 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ernsthaft habe ich nicht wirkocub eine ahnung, andere aufschlüsselungen haben die .cmp dateien immer Baumartig dargestellt,

und zum laden von .obj dateien nutze ich derzeit den WFObjLoader, dieser funktionier sehr gut und vorallem einfach

aber ich habe gerade gesehen, ich hab den sourcecode für den importer bekommen, nun muss ich es nur noch hinbekommen das das auch mit der neuen milkshape version funktioniert


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 20, 2010 14:01 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ok, ich habe mir nun Microsoft Visual Studio 2010 für C++ gezogen,

aber ich musste feststellen das ich keinen plan mehr habe wie das eigentlich funktioniert^^

wie kann ich das ganze nun debuggen?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 20, 2010 21:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
You are not using delphi/freepascal?

Can you tell more about the .cmp format? What application does it belong to?

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 22, 2010 19:17 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
doch schon, meine quelltecte schreibe ich in Delphi aber milkshape plugins sind in c++ geschrieben und dafür brauchte ich Visual studio
weil ich hab den source code für den importer aber leider kann ich es selber nicht debuggen (hab keine ahnung wie das geht^^)

also das cmp format, mal sehen ob ich dir genügend info´s dazu geben kann

-cmp dateien sind modell dateien( wie .obj zb)
-zu jeder cmp datei gehört eine .mat datei in der die Texturen liegen
-cmp dateien sind baumartig aufgebaut ähnlich den windows explorer Datei-Baum
-es werden einfache Animationen unterstützt, wieviele weiß ich nicht aber es sind einige
-genutzt wird es von Microsofts Freelancer

ich hoff die info´s bringen uns bisschen weiter

lg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 24, 2010 21:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
I did a bit googling and found this:http://discoverygc.com/forums/index.php?s=a5656436882e420837214b1490be4819&showtopic=30770&pid=514368&st=0&#entry514368

But with cmp being a game specific fileformat from microsoft it will be hard to find info on how it is build.

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 25, 2010 01:02 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ich hab mir jetzt mal das plugin angesehen un herausgefunden welche procedure dafür zuständig ist die cmp daten zu öffnen und auszulesen aber ich versteh den code nicht ganz

ich setz ihn mal hier rein,

wie gesagt ich habe einen funktionsfähigen code, nur das plugin an sich ist nicht mehr kompatibel

Zitat:
//---------------------------------------------------------------------------
// TCMPImporter::OpenCMPFile()
//
// Try to open the CMP model. Will load and store the UTF file and then
// go one to parse the LODs it contains.
//---------------------------------------------------------------------------
void __fastcall TCMPImporter::OpenCMPFile(AnsiString FileName)
{
__ENTERFUNCTION__;
try {
if (FileExists(FileName)) {
if (!CMPFile->LoadFromFile(FileName))
throw EFOpenError("File does not appear to be a Freelancer CMP model in UTF format.");

ModelFileName = FileName;

TCanvas *FileNameCanvas = new TCanvas;
HWND notUsed;
FileNameCanvas->Handle = GetDeviceContext(notUsed);
FileNameCanvas->Font->Assign(edtFileName->Font);
edtFileName->Text = MinimizeName(FileName, FileNameCanvas, edtFileName->Width);
delete FileNameCanvas;

CMPFileName = OpenDialog->FileName;
lbLOD->Items->Clear();
lbLOD->ItemIndex = -1;
for (int n=0; n<CMPFile->Count; n++) {
TUTFTreeNode *node = CMPFile->Items[n];
if (!CompareText(node->Name,"VMeshData"))
lbLOD->Items->AddObject(CMPFile->Items[node->Parent]->Name,(TObject *)n);
} // for (int n=0; n<CMPFile->Count; n++)
if (!lbLOD->Items->Count)
throw Exception("Freelancer UTF file contains no VMeshData nodes - no models present in file");
else if (lbLOD->Items->Count == 1) {
lbLOD->ItemIndex = 0;
lbLODClick(NULL);
}
} // if (OpenDialog->Execute() && FileExists(OpenDialog->FileName))
} // try
catch (Exception &e) {
MessageDlg(String(e.ClassName()) + " - " + String("Could not open model:\n") + e.Message, mtError, TMsgDlgButtons() << mbOK, 0);
LOG(__FILE__, __LINE__, "Exception class " + e.ClassName() + " in function " + __FUNC__);
__LEAVEFUNCTION__;
} // catch
UpdatePanels();
__LEAVEFUNCTION__;
} // void __fastcall TCMPImporter::OpenCMPFile(AnsiString FileName)
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// TCMPImporter::lbLODClick()
//
// lbLOD listbox OnClick event handler
// Load and parse the VMesh LOD selected by the user, and display the
// materials in that VMesh.
//---------------------------------------------------------------------------
void __fastcall TCMPImporter::lbLODClick(TObject *Sender)
{
__ENTERFUNCTION__;
if (lbLOD->ItemIndex != -1) {
int CMPNodeNum = (int)lbLOD->Items->Objects[lbLOD->ItemIndex];
TUTFTreeNode *VMeshNode = CMPFile->Items[CMPNodeNum];
TBufferStream *VMeshStream;
unsigned VMeshID = generate_crc(lbLOD->Items->Strings[lbLOD->ItemIndex].c_str());

VMesh->Clear();
lbMaterials->Clear();

VMeshStream = new TBufferStream(VMeshNode->Data, VMeshNode->AllocatedDataSize);
VMesh->LoadFromStream(VMeshStream);
delete VMeshStream;

for (int n = 0; n < VMesh->Materials->Count; n++) {
TMaterial *Material = VMesh->Materials->Items[n];
lbMaterials->Items->AddObject(Material->Name, (TObject *)n);
} // for (int n = 0; n < VMesh->Materials->Count; n++)

int CmpndIndex = CMPFile->IndexOf("\\Cmpnd");

if (CmpndIndex != -1) {
TUTFTreeNode *Cmpnd = CMPFile->Items[CmpndIndex];
int CmpndSiblingIndex = Cmpnd->Child;
AnsiString VMeshGroupName;

// Check out each VMeshRef node - it tells us what meshes are in each "mesh group".
while (CmpndSiblingIndex) {
int ObjectNameIndex, FileNameIndex;
ObjectNameIndex = CMPFile->Items[CmpndSiblingIndex]->ChildByName("Object name");
FileNameIndex = CMPFile->Items[CmpndSiblingIndex]->ChildByName("File name");
if (ObjectNameIndex != -1 && FileNameIndex != -1) {
AnsiString VMeshRefParentName = String("\\") + String((char *)CMPFile->Items[FileNameIndex]->Data) + String("\\MultiLevel");
AnsiString VMeshRefName;
int VMeshRefParentIndex = CMPFile->IndexOf(VMeshRefParentName);
int VMeshRefIndex;

if (VMeshRefParentIndex == -1) {
CmpndSiblingIndex = CMPFile->Items[CmpndSiblingIndex]->Sibling;
continue;
} // if (VMeshRefParentIndex == -1)
VMeshRefIndex = CMPFile->Items[VMeshRefParentIndex]->Child;
while (VMeshRefIndex) {
int Index = CMPFile->IndexOf(VMeshRefParentName + "\\" + CMPFile->Items[VMeshRefIndex]->Name + "\\VMeshPart\\VMeshRef");
if (Index != -1 && CMPFile->Items[Index]->AllocatedDataSize >= 60) {
TRawVMeshRef *VMeshRef = (TRawVMeshRef *)CMPFile->Items[Index]->Data;
if (VMeshRef->Signature1 == 0x0000003c) {
if (VMeshRef->VMeshID == VMeshID) {
VMesh->MeshGroups->Add((char *)CMPFile->Items[ObjectNameIndex]->Data, VMeshRef->StartMesh, VMeshRef->MeshCount,
VMeshRef->StartVertex, VMeshRef->EndVertex, VMeshRef->StartVertexRef, VMeshRef->EndVertexRef);
break;
} // if (VMeshRef->VMeshID == VMeshID)
} // if (VMeshRef->Signature1 == 0x0000003c)
else
throw Exception("Error: VMeshRef data has wrong signature. The model .cmp file\r\nmay have corrupted data in it.");
} // if (Index != -1 && CMPFile->Items[Index]->AllocatedDataSize >= 60)
VMeshRefIndex = CMPFile->Items[VMeshRefIndex]->Sibling;
} // while (VMeshRefIndex)
} // if (ObjectNameIndex != -1 && FileNameIndex != -1)
CmpndSiblingIndex = CMPFile->Items[CmpndSiblingIndex]->Sibling;
} // while (CmpndSiblingIndex)

// Look in the \Cmpnd\Cons\* nodes - they contain data that links
// each mesh to the "root" mesh - tells us where the origin of
// a mesh group is.
int ConsIndex = Cmpnd->ChildByName("Cons");
if (ConsIndex != -1) {
int ConsChildIndex = CMPFile->Items[ConsIndex]->Child;
while (ConsChildIndex) {
if (!(CMPFile->Items[ConsChildIndex]->DataSize % sizeof(TRawFixedCons))) {
for (unsigned n = 0; n < CMPFile->Items[ConsChildIndex]->DataSize / sizeof(TRawFixedCons); n++) {
TRawFixedCons *Construct = (TRawFixedCons *)CMPFile->Items[ConsChildIndex]->Data + n;
int MeshGroupIndex = VMesh->MeshGroups->IndexOf(Construct->PartName);
if (MeshGroupIndex != -1) {
TMeshGroup *MeshGroup = VMesh->MeshGroups->Items[MeshGroupIndex];
MeshGroup->OriginX = Construct->OriginX;
MeshGroup->OriginY = Construct->OriginY;
MeshGroup->OriginZ = Construct->OriginZ;
} // if (MeshGroupIndex != -1)
} // for (unsigned n = 0; n < CMPFile->Items[Index]->DataSize / sizeof(TRawConstruct); n++)
} // if (!(CMPFile->Items[ConsChildIndex]->DataSize % sizeof(TRawFixedCons)))
else if (!(CMPFile->Items[ConsChildIndex]->DataSize % sizeof(TRawRevoluteCons))) {
for (unsigned n = 0; n < CMPFile->Items[ConsChildIndex]->DataSize / sizeof(TRawRevoluteCons); n++) {
TRawRevoluteCons *Construct = (TRawRevoluteCons *)CMPFile->Items[ConsChildIndex]->Data + n;
int MeshGroupIndex = VMesh->MeshGroups->IndexOf(Construct->PartName);
if (MeshGroupIndex != -1) {
TMeshGroup *MeshGroup = VMesh->MeshGroups->Items[MeshGroupIndex];
MeshGroup->OriginX = Construct->OriginX;
MeshGroup->OriginY = Construct->OriginY;
MeshGroup->OriginZ = Construct->OriginZ;
} // if (MeshGroupIndex != -1)
} // for (unsigned n = 0; n < CMPFile->Items[Index]->DataSize / sizeof(TRawConstruct); n++)
} // else if (!(CMPFile->Items[ConsChildIndex]->DataSize % sizeof(TRawRevoluteCons)))
else {
for (unsigned n = 0; n < CMPFile->Items[ConsChildIndex]->DataSize / sizeof(TRawSphereCons); n++) {
TRawSphereCons *Construct = (TRawSphereCons *)CMPFile->Items[ConsChildIndex]->Data + n;
int MeshGroupIndex = VMesh->MeshGroups->IndexOf(Construct->PartName);
if (MeshGroupIndex != -1) {
TMeshGroup *MeshGroup = VMesh->MeshGroups->Items[MeshGroupIndex];
MeshGroup->OriginX = Construct->OriginX;
MeshGroup->OriginY = Construct->OriginY;
MeshGroup->OriginZ = Construct->OriginZ;
} // if (MeshGroupIndex != -1)
} // for (unsigned n = 0; n < CMPFile->Items[Index]->DataSize / sizeof(TRawConstruct); n++)
} // else
ConsChildIndex = CMPFile->Items[ConsChildIndex]->Sibling;
} // while (ConsChildIndex)
} // if (ConsIndex != -1)
} // if (CmpndIndex != -1)
} // if (lbLOD->ItemIndex != -1)
ScanMaterials(ModelFileName);
UpdatePanels();
__LEAVEFUNCTION__;
} // void __fastcall TCMPImporter::lbLODClick(TObject *Sender)
//---------------------------------------------------------------------------


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 08, 2010 17:44 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Ich habs ich habs^^

ich habe etwas gefunden mit dem ich die Mesh daten aus einer cmp datei holen kann.

nun hab ich die Mesh als txt vorliegen

das sieht nun so aus

Zitat:
---- HEADER ----

Mesh Type = 1
Surface Type = 4
Number of Meshes = 22
Total referenced vertices = 2898
Flexible Vertex Format = 0x112
Total number of vertices = 2727

Zitat:
---- MESHES ----

Mesh Number MaterialID Start Vertex End Vertex QtyRefVertex Padding
00000000 0xFFA146A6 00000000 00000233 00000234 0xCC
00000001 0xF269BBF9 00000234 00000273 00000060 0xCC
00000002 0xFFA146A6 00000000 00000047 00000048 0xCC
00000003 0xF269BBF9 00000048 00000067 00000030 0xCC


Zitat:
---- Triangles ----

Triangle Vertex 1 Vertex 2 Vertex 3
00000000 00000000 00000001 00000002
00000001 00000003 00000005 00000004
00000002 00000006 00000007 00000008
00000003 00000009 00000011 00000010


Zitat:
---- Vertices ----

Vertex ----X----, ----Y----, ----Z----, Normal X, Normal Y, Normal Z, ----U----, ----V----
00000000 -1,528251, -0,216398, 1,753052, -0,067802, -0,997309, 0,027877, 0,000000, 0,000000
00000001 -1,521249, -0,314911, -1,754252, -0,067802, -0,997309, 0,027877, 0,000000, 0,000000
00000002 1,528252, -0,522229, -1,754197, -0,067802, -0,997309, 0,027877, 0,000000, 0,000000
00000003 1,521249, -0,522229, -0,781494, -0,100383, -0,994949, -0,000723, 0,000000, 0,000000
00000004 1,528252, -0,522229, -1,754197, -0,100383, -0,994949, -0,000723, 0,000000, 0,000000
00000005 -1,528251, -0,216398, 1,753052, -0,100383, -0,994949, -0,000723, 0,000000, 0,000000
00000006 1,521249, -0,317012, -0,780293, 0,638920, -0,004167, 0,769262, 0,000000, 0,000000
00000007 -1,528251, -0,216398, 1,753052, 0,638920, -0,004167, 0,769262, 0,000000, 0,000000
00000008 1,521249, -0,522229, -0,781494, 0,638920, -0,004167, 0,769262, 0,000000, 0,000000


nun ist eigentlich fast alles klar ich muss die ganze sache punkt für punkt einlesen und dann immer schön in dreiergrüppchen als dreieck rendern lassen

nur was mache ich mit den Normalen? und U und V?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 08, 2010 19:46 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die Normale ist ein Vector den du für die korrekte Lichtberechnung benötigst. Du setzt die Normale mit glNormal, vergleichbar mit glColor.

U und V sind die Texturkoordinaten. Siehe glTexCoord.
Irgendwie sollte aber auch abgespeichert sein ob und welche Textur benutzt wird.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 08, 2010 21:11 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ja ich denke mal das ist in diesem part geregelt
Code:
---- MESHES ----

Mesh Number   MaterialID   Start Vertex   End Vertex   QtyRefVertex   Padding
00000000   0xFFA146A6   00000000   00000233   00000234   0xCC
00000001   0xF269BBF9   00000234   00000273   00000060   0xCC
00000002   0xFFA146A6   00000000   00000047   00000048   0xCC
00000003   0xF269BBF9   00000048   00000067   00000030   0xCC
00000004   0xF96C7CA0   00000000   00000031   00000054   0xCC
00000005   0xF2270CC6   00000000   00000026   00000027   0xCC
00000006   0xF2270CC6   00000000   00000026   00000027   0xCC
00000007   0xFFA146A6   00000000   00000233   00000234   0xCC
00000008   0xF269BBF9   00000234   00000273   00000060   0xCC
00000009   0xFFA146A6   00000000   00000047   00000048   0xCC
00000010   0xF269BBF9   00000048   00000067   00000030   0xCC
00000011   0xE0A60AF7   00000000   00000095   00000096   0xCC
00000012   0xF197ED57   00000096   00000143   00000048   0xCC
00000013   0x0F2A36FB   00000144   00000161   00000018   0xCC
00000014   0xE0A60AF7   00000000   00000095   00000096   0xCC
00000015   0xF197ED57   00000096   00000143   00000048   0xCC
00000016   0x0F2A36FB   00000144   00000161   00000018   0xCC
00000017   0xFFA146A6   00000000   00000983   00000984   0xCC
00000018   0xF197ED57   00000984   00001247   00000264   0xCC
00000019   0xFC280A45   00001248   00001409   00000162   0xCC
00000020   0x034C891F   00001410   00001451   00000042   0xCC
00000021   0xF269BBF9   00001452   00001632   00000270   0xCC


hier ist die materialID der start und endvertex angegeben, aber ob das so funktioniert müsste man natürlich erst testen

komisch ist aber das über alle 2000+ u und v koords sind 0,00000 das kommt mir auch komisch vor


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 08, 2010 21:43 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Dann hast du vermutlich nur ein Material mit standard OpenGL Farben ohne Texturen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]