eigenes Dateiformat per 3D studio max sdk
-
Hallo Leuz,
für meine Engine will ich einen Konverter für ein eigenes Dateiformat schreiben, damit ich in 3d studio max meine eigenen Models schreiben kann und diese dann laden kann. Dazu soll es per SDK die Möglichkeit geben, ein Plugin zu schreiben der das Model dann exportiert.
Wenn sich jemand damit auskennt möge er sich melden. Weitere Informationen gibt es auch über http://www.zfx.info/DisplayThread.php?TID=8340 .
ich danke euch für eure Hilfe.
Cu Para
-
Da Du ja 3ds max sicherlich auf legalem Wege erworben hast, hast Du auch das Max SDK Mit diesem lassen sich eigene Plug-Ins schreiben. Ich arbeite auch gerade daran, aber es ist unglaublich frustrierend... sowas komplexes wie die 3ds max - Architektur habe ich noch nie zuvor gesehen.
-
ja richtig die SDK habe ich und damit will ich das auch machen aber ich komme mit der SDK nicht klar. Magst mir da ein paar Tips geben ich brauche die Grundlagen wo krige ich die her?
-
Also bei mir war da so ein Application Wizard für Visual C++ dabei. Der hilft Dir beim Erstellen eines neuen Plug-Ins und fragt Dich, welche Art von Plug-In Du gerne machen würdest. Es werden auch ein paar grundlegende Code-Dateien erstellt.
Es gibt außerdem im Examples-Ordner ein Export-Plug-In, welches allerdings kaum zu verstehen ist. Wie gesagt: Momentan arbeite ich selbst noch daran, da durchzublicken. Wenn ich es geschafft habe, melde ich mich
-
hmmm was hällst davon wenn du mich mal anschreibst, eventuell können wir uns zusammentun, ein paar erfahrungen austauschen. Ich habe ein Tutorial gelesen, wo empfohlen wird, als Basisklasse das Interface INode zu verwenden. Ich weiss noch nicht was das zu bedeuten hat.
Sprech mich doch mal an, meine Messangerdaten:ICQ: 157413201
AIM: PaRaDoXoNtWeNtY
Yahoo: Parapiler
MSN: sebastianschabbach@gmx.de (nicht immer online)würde mich freuen, also bis dann.
-
Also ich fände es besser, es hier im Forum zu besprechen, dann haben andere auch was davon
Ich bin mittlerweile soweit, dass ich an die Bones kommen kann. Ich kann auch herausfinden, von welchen Bones jeder Vertex beeinflusst wird.const TCHAR* pcFilename; FILE* pFile; TriObject* GetTriObjectFromNode(INode *node, int &deleteIt) { deleteIt = FALSE; Object *obj = node->EvalWorldState(0).obj; if(obj->CanConvertToType(Class_ID(TRIOBJ_CLASS_ID, 0))) { TriObject *tri = (TriObject *) obj->ConvertToType(0, Class_ID(TRIOBJ_CLASS_ID, 0)); // Note that the TriObject should only be deleted // if the pointer to it is not equal to the object // pointer that called ConvertToType() if(obj != tri) deleteIt = TRUE; return tri; } else return NULL; } Modifier* FindSkinModifier(INode *pINode) { // get the object reference of the node Object *pObject; pObject = pINode->GetObjectRef(); if(pObject == 0) return 0; // loop through all derived objects while(pObject->SuperClassID() == GEN_DERIVOB_CLASS_ID) { IDerivedObject *pDerivedObject; pDerivedObject = static_cast<IDerivedObject *>(pObject); // loop through all modifiers int stackId; for(stackId = 0; stackId < pDerivedObject->NumModifiers(); stackId++) { // get the modifier Modifier *pModifier; pModifier = pDerivedObject->GetModifier(stackId); // check if we found the skin modifier if(pModifier->ClassID() == SKIN_CLASSID) return pModifier; } // continue with next derived object pObject = pDerivedObject->GetObjRef(); } return 0; } void ExportObject(INode* pNode) { Modifier* pSkinModifier = FindSkinModifier(pNode); if(pSkinModifier == NULL) return; ISkin* pSkin = (ISkin*)(pSkinModifier->GetInterface(I_SKIN)); ISkinContextData* pSkinData = pSkin->GetContextInterface(pNode); BOOL bDelete; TriObject* pTriObject = GetTriObjectFromNode(pNode, bDelete); if(pTriObject == NULL) return; int iNumVertices = pTriObject->mesh.getNumVerts(); fprintf(pFile, "Object \"%s\"...\n", pNode->GetName()); // Alle Vertizes des Objekts durchgehen for(int v = 0; v < iNumVertices; v++) { fprintf(pFile, "Vertex %d...\n", v + 1); // Alle Bones durchgehen, die diesen Vertex beeinflussen int iNumBones = pSkinData->GetNumAssignedBones(v); for(int b = 0; b < iNumBones; b++) { // Bone-Weight in Datei schreiben int iBone = pSkinData->GetAssignedBone(v, b); fprintf(pFile, "Bone %d (ID: %d) weight: %.4f\n", b + 1, iBone, pSkinData->GetBoneWeight(v, b)); INode* pBone = pSkin->GetBone(iBone); } } if(bDelete) pTriObject->DeleteMe(); pSkinModifier->ReleaseInterface(I_SKIN, pSkin); } class EnumTreeProc : public ITreeEnumProc { virtual int callback(INode* pNode) { ExportObject(pNode); return TREE_CONTINUE; } }; int SkinExport::DoExport(const TCHAR* name,ExpInterface *ei,Interface *i, BOOL suppressPrompts, DWORD options) { //TODO: Implement the actual file Export here and // return TRUE If the file is exported properly if(!suppressPrompts) DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_PANEL), GetActiveWindow(), SkinExportOptionsDlgProc, (LPARAM)this); pFile = fopen(name, "wc"); IScene* pScene = ei->theScene; pcFilename = name; EnumTreeProc Enum; pScene->EnumTree(&Enum); fclose(pFile); return TRUE; }
Wie Du siehst, habe ich mit dem Plug-In-Wizard angefangen, der mir dann schon alle grundlegenden Dinge in die Quellcodedateien reingeschrieben hat (das Projekt heißt "SkinExport").
Mit der der Klasse TriObject kannst Du auch auf die Vertizes, Faces usw. zugreifen. Sie besitzt ein Element namens mesh vom Typ Mesh. Schau mal in der SDK-Dokumentation nach, dort steht es alles.
Mesh besitzt dann so Methoden wie getNumVerts usw..Zusätzliche Includes:
#include "ModStack.h" #include "BaseInterface.h" #include "ISkin.h" #include <StdIO.h>
[ Dieser Beitrag wurde am 24.05.2003 um 10:06 Uhr von TomasRiker editiert. ]
-
verstehst du denn was der da gemacht hat? ich habe mir mal die hl sdk runtergeladen, die machen ja dadrin auch ein Plugin. Die rufen da eine Methode DoExport auf. Jedoch hat das Interface INode eine ziemlich große rolle in dem code vielleicht wisst ihr ja darüber was. Übrigens ich habe keine Assistenten...
-
Hallo?
Kann mir einer vielleicht mal erklären was das mit dem INode auf sich hat?!