3ds mini b3d
Übersicht

![]() |
Mathias-KwiatkowskiBetreff: 3ds mini b3d |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi leute ich würde gern wissen wie man 3ds formate (3d objekte) in einem format umwandeln kann so das man es in mini b3d importieren und benutzen kann.
hat wer da ahnung? |
||
Skype: Anarchie1984
http://projektworks.de/maxbase/ Icq - Erneuert am 21.08.2017 Yahoo - Erneuert am 21.08.2017 |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Denke das einfachste ist den Decorator in der Toolbox zu nutzen. Das ist eigentlich ein Textur-Tool. Der kann 3DS-Dateien laden und als B3D abspeichern. Also Quasi einfach nur Laden, nichts anfassen und wieder abspeichern. | ||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
wie in der pm geschrieben gibt es damit probleme.
aber um es abgesehen der privat unterhaltung nochmals für alle zugänglich zu machen. beschreibe ich hier das problem mit diesem programm. 1. manchmal funktioniert das prog nicht, liegt daran das man scheinbar keine rundungen einbauen darf. dann kommen mem acces lags 2. wenn ich etwas speichere habe ich nicht mein objekt sondern ich habe blos ein würfel ![]() hier das bild ( *3ds ) ![]() und so sieht genau das objekt in mini b3d aus , leider ![]() |
||
Skype: Anarchie1984
http://projektworks.de/maxbase/ Icq - Erneuert am 21.08.2017 Yahoo - Erneuert am 21.08.2017 |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also der Decorator ist in Blitz3D geschrieben. Der kann nur Objekte laden die mit LoadMesh geladen werden können. Kann sein, dass es ein Paar Features in 3DS eingebaut wurden, die das in die Tage gekommene Blitz3D nicht versteht und abstürzt.
Der Würfel kommt bei BlitzMax wenn das Modell nicht gefunden wurde. Also so ne richtige Lösung haben wir bei RS auch nicht gefunden. Bei uns klappt das konvertieren auch nur so lala. |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das is sehr mies!... nunja du kannst da rein gar nichts für. mich würde es nur mal interessieren wie der oder die macher von mini b3d sich das ganze vorgestellt haben...
ich mein objekte müsste man schon iwi includen können. habe auch versucht das 3ds laden von objekte script einzubinden aber gexcheitert mini b3d macht es dennoch nicht. leider... wenn also jemand eine mini b3d version hat die 3ds laden kann bitte her damit ( ist ja free glaub das es dann legal ist ... wenn nicht korrigiert mich ) |
||
Skype: Anarchie1984
http://projektworks.de/maxbase/ Icq - Erneuert am 21.08.2017 Yahoo - Erneuert am 21.08.2017 |
![]() |
Cykid |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weiß nicht ob ich dich grade richtig verstehe, aber könntes du das Objekt nicht in Blender laden und dann als b3d exportieren?
Dazu musst du in den User einstellungen ein Addon via Script installieren. 1. Diesen Code code als name.py speichern. 2. Addon via Script installieren 3. Als B3D exportieren CODE: Code: [AUSKLAPPEN] #!BPY
""" Registration info for Blender menus: Name: 'DirectX(.x)...' Blender: 241 Group: 'Export' Tip: 'Export to DirectX text file format format.' """ __author__ = "Arben (Ben) Omari" __url__ = ("blender", "elysiun", "Author's site, http://www.omariben.too.it") __version__ = "3.0" __bpydoc__ = """\ This script exports a Blender mesh with armature to DirectX 8's text file format. Notes:<br> Check author's site or the elYsiun forum for a new beta version of the DX exporter. """ # DirectXExporter.py version 3.0 # Copyright (C) 2006 Arben OMARI -- omariarben@everyday.com # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # This script export meshes created with Blender in DirectX8 file format # it exports meshes,armatures,materials,normals,texturecoords and animations # Grab the latest version here :www.omariben.too.it import Blender from Blender import Types, Object, NMesh, Material,Armature,Mesh from Blender.Mathutils import * from Blender import Draw, BGL from Blender.BGL import * import math global mat_flip,index_list,space,bone_list,mat_dict global anim,flip_norm,swap_zy,flip_z,speed,ticks,no_light,recalc_norm,Bl_norm bone_list =[] index_list = [] mat_dict = {} space = 0;flip_z = 1;anim=0;swap_yz=0;flip_norm=0;speed=0;ticks= 25 Bl_norm = 1;recalc_norm = 0;no_light = 0 toggle_val = 0 toggle1_val = 0 toggle2_val = 0 toggle3_val = 1 toggle4_val = 0 toggle5_val = 1 toggle6_val = 0 toggle7_val = 0 anim_tick = Draw.Create(25) #*********************************************** # MAIN #*********************************************** def my_callback(filename): if filename.find('.x', -2) <= 0: filename += '.x' xexport = xExport(filename) xexport.SelectObjs() def my_callback_sel(filename): if filename.find('.x', -2) <= 0: filename += '.x' xexport = xExport(filename) xexport.exportSelMesh() def event(evt, val): if evt == Draw.ESCKEY: Draw.Exit() return def button_event(evt): global toggle_val,toggle1_val,toggle2_val,toggle3_val,toggle4_val,toggle5_val,toggle6_val,toggle7_val global flip_z,swap_yz,flip_norm,anim,ticks,speed,no_light,Bl_norm,recalc_norm arg = __script__['arg'] if evt == 1: toggle_val = 1 - toggle_val anim = toggle_val Draw.Redraw(1) if evt == 2: toggle1_val = 1 - toggle1_val flip_norm = toggle1_val Draw.Redraw(1) if evt == 3: toggle2_val = 1 - toggle2_val swap_yz = toggle2_val Draw.Redraw(1) if evt == 4: toggle3_val = 1 - toggle3_val flip_z = toggle3_val Draw.Redraw(1) if evt == 5: toggle4_val = 1 - toggle4_val speed = toggle4_val Draw.Redraw(1) if evt == 10: toggle5_val = 1 - toggle5_val if toggle5_val==1: toggle6_val = 0 toggle7_val = 0 else : toggle6_val = 1 toggle7_val = 1 no_light = toggle7_val recalc_norm = toggle6_val Bl_norm = toggle5_val Draw.Redraw(1) if evt == 11: toggle6_val = 1 - toggle6_val if toggle6_val==1: toggle5_val = 0 toggle7_val = 0 else : toggle5_val = 1 toggle7_val = 1 no_light = toggle7_val recalc_norm = toggle6_val Bl_norm = toggle5_val Draw.Redraw(1) if evt == 12: toggle7_val = 1 - toggle7_val if toggle7_val==1: toggle6_val = 0 toggle5_val = 0 else : toggle6_val = 1 toggle5_val = 1 no_light = toggle7_val recalc_norm = toggle6_val Bl_norm = toggle5_val Draw.Redraw(1) if evt == 6: ticks = anim_tick.val if evt == 7: fname = Blender.sys.makename(ext = ".x") Blender.Window.FileSelector(my_callback, "Export DirectX", fname) if evt == 8: fname = Blender.sys.makename(ext = ".x") Blender.Window.FileSelector(my_callback_sel, "Export DirectX", fname) if evt == 9: Draw.Exit() def draw(): global animsg,flipmsg,swapmsg,anim_tick global flip_z,swap_yz,flip_norm,anim,ticks,speed,recalc_norm,Bl_norm,no_light glClearColor(0.55,0.6,0.6,1) glClear(BGL.GL_COLOR_BUFFER_BIT) #external box glColor3f(0.2,0.3,0.3) rect(10,402,300,382) #-- #glColor3f(0.3,0.4,0.4) #rect(11,399,298,398) #-- glColor3f(0.5,0.75,0.65) rect(14,398,292,30) #-- glColor3f(0.5,0.75,0.65) rect(14,366,292,160) #-- glColor3f(0.5,0.75,0.65) rect(14,202,292,60) #-- glColor3f(0.5,0.75,0.65) rect(14,138,292,40) #-- glColor3f(0.5,0.75,0.65) rect(14,94,292,70) glColor3f(0.8,.8,0.6) glRasterPos2i(20, 380) Draw.Text("DirectX Exporter ",'large') Draw.Text("(for Blender 2.41)", 'small') #-------Aniamtion toggle--------------------------------------------- Draw.Toggle("Anim", 1, 20, 330, 55, 20, toggle_val,"export animations") if toggle_val : anim = 1 animsg = "animation will be exported" else: anim = 0 animsg = "animation will be not exported" glRasterPos2i(100,335) Draw.Text(animsg) #---Flip normals toggle----------------------------------------------- Draw.Toggle("Flip norm", 2, 20, 300, 55, 20, toggle1_val,"invert normals") if toggle1_val : flip_norm = 1 flipmsg = "flipped normals" else: flip_norm = 0 flipmsg = "not flipped normals" glRasterPos2i(100,305) Draw.Text(flipmsg) #------Swap yz toggle---------------------------------------------------------------- Draw.Toggle("Swap zy", 3, 20, 270, 55, 20, toggle2_val,"swap z,y axis(y up)") if toggle2_val : swap_yz = 1 swapmsg = "Y-axis up" else: swap_yz = 0 swapmsg = "Z-axis up" glRasterPos2i(100,275) Draw.Text(swapmsg) #------Flip z toggle---------------------------------------------------------------- Draw.Toggle("Flip z", 4, 20, 240, 55, 20, toggle3_val,"flip z axis") if toggle3_val : flip_z = 1 zmsg = "left handed system" else: flip_z = 0 zmsg = "right handed system" glRasterPos2i(100,245) Draw.Text(zmsg) #------Speed toggle---------------------------------------------------------------- Draw.Toggle("Speed", 5, 20, 210, 55, 20, toggle4_val,"Animation speed") if toggle4_val : speed = 1 spedmsg = "set speed" anim_tick = Draw.Number("", 6,200, 210, 85, 20, anim_tick.val,1,100000,"ticks per second") else: speed = 0 spedmsg = "" glRasterPos2i(100,215) Draw.Text(spedmsg) #------Blender Normals toggle---------------------------------------------------------------- Draw.Toggle("Bl.normals", 10, 20, 105, 75, 25, toggle5_val,"export normals as in Blender") if toggle5_val : Bl_norm = 1 #------Recalculute Normals toggle---------------------------------------------------------------- Draw.Toggle("recalc.no", 11, 120, 105, 75, 25, toggle6_val,"export recalculated normals") if toggle6_val : recalc_norm = 1 #------Recalculute Normals toggle---------------------------------------------------------------- Draw.Toggle("no smooth", 12, 220, 105, 75, 25, toggle7_val,"every vertex has the face normal,no smoothing") if toggle7_val : no_light = 1 #------Draw Button export---------------------------------------------------------------- exp_butt = Draw.Button("Export All",7,20, 155, 75, 30, "export all the scene objects") sel_butt = Draw.Button("Export Sel",8,120, 155, 75, 30, "export the selected object(only meshes)") exit_butt = Draw.Button("Exit",9,220, 155, 75, 30, "exit") glRasterPos2i(20,75) Draw.Text("(C) 2006 Arben OMARI ") glRasterPos2i(20,55) Draw.Text("http://www.omariben.too.it") glRasterPos2i(20,35) Draw.Text("aromar@tin.it") def rect(x,y,width,height): glBegin(GL_LINE_LOOP) glVertex2i(x,y) glVertex2i(x+width,y) glVertex2i(x+width,y-height) glVertex2i(x,y-height) glEnd() def rectFill(x,y,width,height): glBegin(GL_POLYGON) glVertex2i(x,y) glVertex2i(x+width,y) glVertex2i(x+width,y-height) glVertex2i(x,y-height) glEnd() Draw.Register(draw, event, button_event) #*********************************************** #*********************************************** # EXPORTER #*********************************************** #*********************************************** class xExport: def __init__(self, filename): self.file = open(filename, "w") #*************************************************** #*********************************************** #Select Scene objects #*********************************************** def analyzeScene(self): parent_list = [] for obj in Object.Get(): mesh = obj.getData() if type(mesh) == Types.ArmatureType or type(mesh) == Types.NMeshType or obj.getType() == "Empty": pare = obj.getParent() if pare == None : parent_list.append(obj) return parent_list def getChildren(self,obj): children_list = [] for object in Object.Get(): pare = object.parent if pare == obj : children_list.append(object) return children_list def getArmChildren(self,obj): for object in Object.Get(): pare = object.parent if pare == obj : return object def getLocMat(self, obj): pare = obj.getParent() mat = obj.matrixWorld mat_id = Matrix([1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]) if pare: mat_p = pare.matrixWorld mat_c = Matrix(mat_p) mat_c.invert() mat_f = mat * mat_c else : mat_id.invert() mat_f = mat * mat_id return mat_f def writeObjFrames(self,obj): global space,chld_obj,ch_list mesh = obj.getData() if obj.getType() == "Empty" : mat = self.getLocMat(obj) mat_c = Matrix(mat) name = obj.name name_f = name.replace(".","") self.writeArmFrames(mat_c, name_f) if type(mesh) == Types.ArmatureType : Child_obj = self.getArmChildren(obj) chld_obj = obj ch_list.append(Child_obj) self.writeRootBone(obj, Child_obj) if type(mesh) == Types.NMeshType and obj not in ch_list: self.exportMesh(obj) def writeChildObj(self,obj): global space,ch_list space += 1 if obj : for ob in obj: if ob not in ch_list: self.writeObjFrames(ob) ch_list.append(ob) ch_ob = self.getChildren(ob) self.writeChildObj(ch_ob) self.closeBrackets() self.file.write(" // End of the Object %s \n" % (ob.name)) def writeRootFrame(self): global flip_z,swap_yz,speed if speed: self.writeAnimTicks() if flip_z: mat_flip = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]) else : mat_flip = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]) if swap_yz : mat_rot = RotationMatrix(-90, 4, 'x') mat_flip = mat_rot * mat_flip self.writeArmFrames(mat_flip, "RootFrame") ##################################### def SelectObjs(self): global space,chld_obj,ch_list,flip_z,swap_yz,speed print "exporting..." self.writeHeader() self.writeRootFrame() obj_list = self.analyzeScene() space += 1 ch_list = [] for obj in obj_list: self.writeObjFrames(obj) ch_l = self.getChildren(obj) for ch in ch_l: if ch and ch.getType() == "Armature": ch_list.append(ch) self.writeObjFrames(ch) else : self.writeChildObj(ch_l) if obj.getType() != "Armature": self.file.write(" } // SI End of the Object %s \n" % (obj.name)) self.file.write("} // End of the Root Frame\n") if anim : self.file.write("AnimationSet {\n") for obj in Object.Get(): mesh = obj.getData() if type(mesh) == Types.NMeshType or obj.getType() == "Empty": ip_list = obj.getIpo() if ip_list != None : self.writeAnimationObj(obj) elif type(mesh) == Types.ArmatureType : act_list = obj.getAction() if act_list != None : self.writeAnimation(obj) #ip_list = obj.getIpo() #if ip_list != None : # self.writeAnimationObj(obj) self.file.write("} // End of Animation Set\n") self.writeEnd() ################################# def writeAnimTicks(self): global ticks self.file.write("AnimTicksPerSecond {\n") self.file.write("%d; \n" % (ticks)) self.file.write("}\n") #*********************************************** #Export Mesh without Armature #*********************************************** def exportMesh(self, obj): tex = [] mesh = obj.getData() self.writeTextures(obj, tex) self.writeMeshcoordArm(obj, arm_ob = None) self.writeMeshMaterialList(obj, mesh, tex) self.writeMeshNormals(obj, mesh) self.writeMeshTextureCoords(obj, mesh) self.file.write(" } // End of the Frame %s \n" % (obj.name)) #*********************************************** #Export the Selected Mesh #*********************************************** def exportSelMesh(self): print "exporting ..." self.writeHeader() self.writeRootFrame() tex = [] obj = Object.GetSelected()[0] mesh = obj.getData() if type(mesh) == Types.NMeshType : self.writeTextures(obj, tex) self.writeMeshcoordArm(obj, arm_ob = None) self.writeMeshMaterialList(obj, mesh, tex) self.writeMeshNormals(obj, mesh) self.writeMeshTextureCoords(obj, mesh) self.file.write(" }\n") self.file.write("}\n") self.file.write("}\n") ip_list = obj.getIpo() if ip_list != None : self.file.write("AnimationSet {\n") self.writeAnimationObj(obj) self.file.write("}\n") print "exporting ..." else : print "The selected object is not a mesh" print "...finished" #*********************************************** #Export Mesh with Armature #*********************************************** def exportMeshArm(self,arm,arm_ob,ch_obj): tex = [] mesh = ch_obj.getData() self.writeTextures(ch_obj, tex) self.writeMeshcoordArm(ch_obj ,arm_ob) self.writeMeshMaterialList(ch_obj, mesh, tex) self.writeMeshNormals(ch_obj, mesh) self.writeMeshTextureCoords(ch_obj, mesh) self.writeSkinWeights(arm,mesh) #self.file.write(" } // End of the Frame %s \n" % (ch_obj.name)) self.file.write(" } // End of the Object %s \n" % (ch_obj.name)) #*********************************************** #Export Root Bone #*********************************************** def writeRootBone(self, chld_obj, child_obj): global space,root_bon arms = chld_obj.getData() mat_arm = self.getLocMat(chld_obj) for bon in arms.bones.values(): if bon.hasParent(): pass else: root_bon = bon space += 1 mat_r = self.writeAnimCombineMatrix(root_bon,1) name_r = root_bon.name name_f = name_r.replace(".","") self.writeArmFrames(mat_r, name_f) bon_c = root_bon.children self.writeChildren(bon_c) self.file.write(" } // End of the Bone %s \n" % (root_bon.name)) self.exportMeshArm(arms, chld_obj ,child_obj) #*********************************************** #Create Children structure #*********************************************** def writeBon(self,bon): global space mat_r = self.writeAnimCombineMatrix(bon,1) name_r = bon.name name_f = name_r.replace(".","") self.writeArmFrames(mat_r, name_f) def writeChildren(self,bon_c): global space,bone_list space += 1 if bon_c: for bo in bon_c: if bo.name not in bone_list: self.writeBon(bo) bone_list.append(bo.name) bo_c = bo.children self.writeChildren(bo_c) self.closeBrackets() def closeBrackets(self): global space space = space-1 tab = " " self.file.write("%s" % (tab * space)) self.file.write("}\n") #*********************************************** #Offset Matrix #*********************************************** def writeMatrixOffset(self,bon): global chld_obj Blender.Set('curframe', 1) pose = chld_obj.getPose() pos_b = pose.bones[bon.name] mat_b = pos_b.poseMatrix mat_c = Matrix(mat_b) mat_c.invert() return mat_c #*********************************************** #Combine Matrix #*********************************************** def writeCombineMatrix(self,bon): global chld_obj Blender.Set('curframe', 1) pose = chld_obj.getPose() pos_b = pose.bones[bon.name] mat_b = pos_b.poseMatrix if bon.hasParent(): pare = bon.parent pos_p = pose.bones[pare.name] mat_p = pos_p.poseMatrix else: mat_p = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]) mat_c = Matrix(mat_p) mat_c.invert() mat_f = mat_b * mat_c return mat_f #*********************************************** #Combine Matrix #*********************************************** def writeAnimCombineMatrix(self,bon,fre): global chld_obj Blender.Set('curframe', fre) pose = chld_obj.getPose() pos_b = pose.bones[bon.name] mat_b = pos_b.poseMatrix if bon.hasParent(): pare = bon.parent pos_p = pose.bones[pare.name] mat_p = pos_p.poseMatrix else: mat_p = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]) mat_c = Matrix(mat_p) mat_c.invert() mat_f = mat_b * mat_c return mat_f #*************************************************** #*********************************************** #Write SkinWeights #*********************************************** def writeSkinWeights(self, arm, mesh): global index_list v_dict = {} Blender.Set('curframe',1) self.file.write(" XSkinMeshHeader {\n") max_infl = 0 for bo in arm.bones.values() : name = bo.name try : vertx_list = mesh.getVertsFromGroup(name,1) for inde in vertx_list : vert_infl = mesh.getVertexInfluences(inde[0]) ln_infl = len(vert_infl) if ln_infl > max_infl : max_infl = ln_infl except: pass self.file.write(" %d; \n" % (max_infl)) self.file.write(" %d; \n" % (max_infl * 3)) self.file.write(" %d; \n" % (len(arm.bones.values()))) self.file.write(" }\n") for bo in arm.bones.values() : bo_list = [] weight_list = [] name = bo.name f_name = name.replace(".","") try : vert_list = mesh.getVertsFromGroup(name,1) le = 0 for indx in vert_list: ver_infl = mesh.getVertexInfluences(indx[0]) infl = 0.0 if len(ver_infl) != 0: sum = 0.0 for bone_n, weight in ver_infl: if bone_n == name: infl = weight sum += weight infl /= sum i = -1 for el in index_list : i += 1 if el == indx[0] : le +=1 bo_list.append(i) weight_list.append(infl) self.file.write(" SkinWeights {\n") self.file.write(' "%s"; \n' % (f_name)) self.file.write(' %d; \n' % (le)) count = 0 for ind in bo_list : count += 1 if count == len(bo_list): self.file.write(" %d; \n" % (ind)) else : self.file.write(" %d, \n" % (ind)) cou = 0 for wegh in weight_list : cou += 1 if cou == len(weight_list): self.file.write(" %f; \n" % (round(wegh,6))) else : self.file.write(" %f, \n" % (round(wegh,6))) matx = self.writeMatrixOffset(bo) self.writeOffsFrames(matx, name) except : pass self.file.write(" } // End of XSkinMeshHeader\n") #*********************************************** # Write Matrices #*********************************************** def writeArmFrames(self, matx, name): global space tab = " " self.file.write("%s" % (tab * space)) self.file.write("Frame ") self.file.write("%s {\n\n" % (name)) self.file.write("%s" % (tab * space)) self.file.write(" FrameTransformMatrix {\n") self.writeFrame(matx) #*********************************************** # Write Frames #*********************************************** def writeOffsFrames(self, matx, name): space = 1 self.writeFrame(matx) #*********************************************** # Write Frames #*********************************************** def writeFrame(self, matx): tab = " " self.file.write("%s" % (tab * space)) self.file.write(" %f,%f,%f,%f,\n" % (round(matx[0][0],4),round(matx[0][1],4),round(matx[0][2],4),round(matx[0][3],4))) self.file.write("%s" % (tab * space)) self.file.write(" %f,%f,%f,%f,\n" % (round(matx[1][0],4),round(matx[1][1],4),round(matx[1][2],4),round(matx[1][3],4))) self.file.write("%s" % (tab * space)) self.file.write(" %f,%f,%f,%f,\n" % (round(matx[2][0],4),round(matx[2][1],4),round(matx[2][2],4),round(matx[2][3],4))) self.file.write("%s" % (tab * space)) self.file.write(" %f,%f,%f,%f;;\n" % (round(matx[3][0],4),round(matx[3][1],4),round(matx[3][2],4),round(matx[3][3],4))) self.file.write("%s" % (tab * space)) self.file.write(" }\n") #*************************************************** #*********************************************** #HEADER #*********************************************** def writeHeader(self): self.file.write("xof 0303txt 0032\n\n\n") self.file.write("template VertexDuplicationIndices { \n\ <b8d65549-d7c9-4995-89cf-53a9a8b031e3>\n\ DWORD nIndices;\n\ DWORD nOriginalVertices;\n\ array DWORD indices[nIndices];\n\ }\n\ template XSkinMeshHeader {\n\ <3cf169ce-ff7c-44ab-93c0-f78f62d172e2>\n\ WORD nMaxSkinWeightsPerVertex;\n\ WORD nMaxSkinWeightsPerFace;\n\ WORD nBones;\n\ }\n\ template SkinWeights {\n\ <6f0d123b-bad2-4167-a0d0-80224f25fabb>\n\ STRING transformNodeName;\n\ DWORD nWeights;\n\ array DWORD vertexIndices[nWeights];\n\ array float weights[nWeights];\n\ Matrix4x4 matrixOffset;\n\ }\n\n") #*********************************************** #CLOSE FILE #*********************************************** def writeEnd(self): self.file.close() print "... finished" #*********************************************** #EXPORT TEXTURES #*********************************************** def writeTextures(self,name, tex): mesh = name.data for face in mesh.faces: if face.image and face.image.name not in tex: tex.append(face.image.name) #*********************************************** #EXPORT MESH DATA with Armature #*********************************************** def writeMeshcoordArm(self, obj ,arm_ob): global index_list,flip_z #TransformMatrix mat = self.getLocMat(obj) name_f = obj.name.replace(".","") self.writeArmFrames(mat, name_f) mesh = NMesh.GetRawFromObject(obj.name) self.file.write("Mesh {\n") numface=len(mesh.faces) #VERTICES NUMBER numvert = 0 for face in mesh.faces: numvert = numvert + len(face.v) self.file.write("%d;\n" % (numvert)) if numvert == 0: print "Mesh named",mesh.name,"has no vertices.Problems may occur using the .x file" #VERTICES COORDINATES counter = 0 for face in mesh.faces: counter += 1 for n in range(len(face.v)): index_list.append(face.v[n].index) vec_vert = Vector([(face.v[n].co[0]), face.v[n].co[1], face.v[n].co[2], 1]) if arm_ob : f_vec_vert = vec_vert * mat else : f_vec_vert = vec_vert self.file.write("%f; %f; %f;" % (round(f_vec_vert[0],4), round(f_vec_vert[1],4), round(f_vec_vert[2],4))) if counter == numface : if n == len(face.v)-1 : self.file.write(";\n") else : self.file.write(",\n") else : self.file.write(",\n") if flip_z: a3 = 0;b3 = 2;c3 = 1 a4 = 0;b4 = 3;c4 = 2;d4 = 1 else: a3 = 0;b3 = 1;c3 = 2 a4 = 0;b4 = 1;c4 = 2;d4 = 3 #FACES NUMBER self.file.write("%s;\n" % (numface)) coun,counter = 0, 0 for face in mesh.faces : coun += 1 if coun == numface: if len(face.v) == 3: self.file.write("3; %d, %d, %d;;\n" % (counter + a3, counter + b3, counter + c3)) counter += 3 elif len(face.v) == 4: self.file.write("4; %d, %d, %d, %d;;\n" % (counter + a4, counter + b4, counter + c4, counter + d4)) counter += 4 elif len(face.v) < 3: print "WARNING:the mesh has faces with less then 3 vertices" print " It my be not exported correctly." else: if len(face.v) == 3: self.file.write("3; %d, %d, %d;,\n" % (counter + a3, counter + b3, counter + c3)) counter += 3 elif len(face.v) == 4: self.file.write("4; %d, %d, %d, %d;,\n" % (counter + a4, counter + b4, counter + c4, counter + d4)) counter += 4 elif len(face.v) < 3: print "WARNING:the mesh has faces with less then 3 vertices" print " It my be not exported correctly." #*********************************************** #MESH MATERIAL LIST #*********************************************** def writeMeshMaterialList(self, obj, mesh, tex): self.file.write(" MeshMaterialList {\n") #HOW MANY MATERIALS ARE USED count = 0 for mat in mesh.getMaterials(): count+=1 self.file.write(" %d;\n" % (len(tex) + count)) #HOW MANY FACES IT HAS numfaces=len(mesh.faces) self.file.write(" %d;\n" % (numfaces)) ##MATERIALS INDEX FOR EVERY FACE counter = 0 for face in mesh.faces : counter += 1 mater = face.materialIndex if counter == numfaces: if face.image and face.image.name in tex : self.file.write(" %d;\n" % (tex.index(face.image.name) + count)) else : self.file.write(" %d;\n" % (mater)) else : if face.image and face.image.name in tex : self.file.write(" %d,\n" % (tex.index(face.image.name) + count)) else : self.file.write(" %d,\n" % (mater)) ##MATERIAL NAME for mat in mesh.getMaterials(): self.file.write(" Material") name_m = mat.name name_f = name_m.replace(".","") self.file.write(" %s "% (name_f)) self.file.write("{\n") self.file.write(" %f; %f; %f;" % (mat.R, mat.G, mat.B)) self.file.write("%s;;\n" % (mat.alpha)) self.file.write(" %f;\n" % (mat.spec)) self.file.write(" %f; %f; %f;;\n" % (mat.specR, mat.specG, mat.specB)) self.file.write(" 0.0; 0.0; 0.0;;\n") self.file.write(" } //End of Material\n") for mat in tex: self.file.write(" Material Mat") self.file.write("%s "% (len(tex))) self.file.write("{\n") self.file.write(" 1.0; 1.0; 1.0; 1.0;;\n") self.file.write(" 1.0;\n") self.file.write(" 1.0; 1.0; 1.0;;\n") self.file.write(" 0.0; 0.0; 0.0;;\n") self.file.write(" TextureFilename {") self.file.write(' "%s";'% (mat)) self.file.write(" }\n") self.file.write(" } // End of Material\n") self.file.write(" } //End of MeshMaterialList\n") #*********************************************** #MESH NORMALS #*********************************************** def writeMeshNormals(self,name,mesh): global flip_norm,flip_z,no_light,recalc_norm,Bl_norm self.file.write(" MeshNormals {\n") #VERTICES NUMBER numvert = 0 for face in mesh.faces: numvert = numvert + len(face.v) self.file.write("%d;\n" % (numvert)) numfaces=len(mesh.faces) if flip_norm : fl = -1 else : fl = 1 #VERTICES NORMAL if Bl_norm: self.writeBlenderNormals(mesh,fl) if recalc_norm: self.writeRecalcNormals(mesh,fl) if no_light: self.writeNoSmothing(mesh,fl) if flip_z: a3 = 0;b3 = 2;c3 = 1 a4 = 0;b4 = 3;c4 = 2;d4 = 1 else: a3 = 0;b3 = 1;c3 = 2 a4 = 0;b4 = 1;c4 = 2;d4 = 3 #FACES NUMBER self.file.write("%s;\n" % (numfaces)) coun,counter = 0, 0 for face in mesh.faces : coun += 1 if coun == numfaces: if len(face.v) == 3: self.file.write("3; %d, %d, %d;;\n" % (counter + a3, counter + b3, counter + c3)) counter += 3 else : self.file.write("4; %d, %d, %d, %d;;\n" % (counter + a4, counter + b4, counter + c4, counter + d4)) counter += 4 else: if len(face.v) == 3: self.file.write("3; %d, %d, %d;,\n" % (counter + a3, counter + b3, counter + c3)) counter += 3 else : self.file.write("4; %d, %d, %d, %d;,\n" % (counter + a4, counter + b4, counter + c4, counter + d4)) counter += 4 self.file.write("} //End of MeshNormals\n") def writeBlenderNormals(self,mesh,fl): numfaces=len(mesh.faces) #VERTICES NORMAL counter = 0 for face in mesh.faces: counter += 1 for n in range(len(face.v)): self.file.write(" %f; %f; %f;" % ( (round(face.v[n].no[0],6)*fl),(round(face.v[n].no[1],6)*fl),(round(face.v[n].no[2],6)*fl))) if counter == numfaces : if n == len(face.v)-1 : self.file.write(";\n") else : self.file.write(",\n") else : self.file.write(",\n") def writeRecalcNormals(self,mesh,fl): numfaces=len(mesh.faces) normal_list = {} idx = 0 for vertex in mesh.verts: v_norm = Vector([0, 0, 0]) normal_list[idx] = v_norm idx += 1 for face in mesh.faces: for verts in face.v: if verts.index == vertex.index : v_norm[0] += face.no[0] v_norm[1] += face.no[1] v_norm[2] += face.no[2] v_norm.normalize() counter = 0 for face in mesh.faces: counter += 1 n = 0 for vert in face.v: n += 1 norm = normal_list[vert.index] self.file.write(" %f; %f; %f;" % ( (round(norm[0],6)*fl),(round(norm[1],6)*fl),(round(norm[2],6)*fl))) if counter == numfaces : if n == len(face.v) : self.file.write(";\n") else : self.file.write(",\n") else : self.file.write(",\n") def writeNoSmothing(self,mesh,fl): numfaces=len(mesh.faces) counter = 0 for face in mesh.faces: counter += 1 n = 0 for n in range(len(face.v)): n += 1 self.file.write(" %f; %f; %f;" % ( (round(face.no[0],6)*fl),(round(face.no[1],6)*fl),(round(face.no[2],6)*fl))) if counter == numfaces : if n == len(face.v) : self.file.write(";\n") else : self.file.write(",\n") else : self.file.write(",\n") #*********************************************** #MESH TEXTURE COORDS #*********************************************** def writeMeshTextureCoords(self, name, mesh): if mesh.hasFaceUV(): self.file.write("MeshTextureCoords {\n") #VERTICES NUMBER numvert = 0 for face in mesh.faces: numvert += len(face.v) self.file.write("%d;\n" % (numvert)) #UV COORDS numfaces = len(mesh.faces) counter = -1 co = 0 for face in mesh.faces: counter += 1 co += 1 for n in range(len(face.v)): self.file.write("%f;%f;" % (mesh.faces[counter].uv[n][0], -mesh.faces[counter].uv[n][1])) if co == numfaces : if n == len(face.v) - 1 : self.file.write(";\n") else : self.file.write(",\n") else : self.file.write(",\n") self.file.write("} //End of MeshTextureCoords\n") #*************************************************** #*********************************************** #FRAMES #*********************************************** def writeFrames(self, matx): self.file.write("%f,%f,%f,%f," % (round(matx[0][0],4),round(matx[0][1],4),round(matx[0][2],4),round(matx[0][3],4))) self.file.write("%f,%f,%f,%f," % (round(matx[1][0],4),round(matx[1][1],4),round(matx[1][2],4),round(matx[1][3],4))) self.file.write("%f,%f,%f,%f," % (round(matx[2][0],4),round(matx[2][1],4),round(matx[2][2],4),round(matx[2][3],4))) self.file.write("%f,%f,%f,%f;;" % (round(matx[3][0],4),round(matx[3][1],4),round(matx[3][2],4),round(matx[3][3],4))) #*********************************************** #WRITE ANIMATION KEYS #*********************************************** def writeAnimation(self,arm_ob): global mat_dict, root_bon arm = arm_ob.getData() act_list = arm_ob.getAction() ip = act_list.getAllChannelIpos() for bon in arm.bones.values() : point_list = [] name = bon.name name_f = name.replace(".", "") try : ip_bon_channel = ip[bon.name] ip_bon_name = ip_bon_channel.getName() ip_bon = Blender.Ipo.Get(ip_bon_name) poi = ip_bon.getCurves() for po in poi[3].getPoints(): a = po.getPoints() point_list.append(int(a[0])) #point_list.pop(0) self.file.write(" Animation { \n") self.file.write(" { %s }\n" %(name_f)) self.file.write(" AnimationKey { \n") self.file.write(" 4;\n") self.file.write(" %d; \n" % (len(point_list))) for fr in point_list: if name == root_bon.name : mat_b = self.writeAnimCombineMatrix(bon,fr) mat_arm = self.getLocMat(arm_ob) mat = mat_b * mat_arm else: mat = self.writeAnimCombineMatrix(bon,fr) self.file.write(" %d;" % (fr)) self.file.write("16;") self.writeFrames(mat) if fr == point_list[len(point_list)-1]: self.file.write(";\n") else: self.file.write(",\n") self.file.write(" }\n") self.file.write(" }\n") self.file.write("\n") except: pass #*********************************************** #WRITE ANIMATION KEYS #*********************************************** def writeAnimationObj(self, obj): point_list = [] ip = obj.getIpo() poi = ip.getCurves() for po in poi[0].getPoints(): a = po.getPoints() point_list.append(int(a[0])) name = obj.name name_f = name.replace(".", "") self.file.write(" Animation {\n") self.file.write(" { ") self.file.write("%s }\n" % (name_f)) self.file.write(" AnimationKey { \n") self.file.write(" 4;\n") self.file.write(" %d; \n" % (len(point_list))) for fr in point_list: self.file.write(" %d;" % (fr)) self.file.write("16;") Blender.Set('curframe',fr) #mat_new = self.getLocMat(obj) mat_new = obj.matrixLocal self.writeFrames(mat_new) if fr == point_list[len(point_list)-1]: self.file.write(";\n") else: self.file.write(",\n") self.file.write(" }\n") self.file.write(" }\n") #******************************************* ~EDITIERT~ Dem Foren-Layout zu liebe habe ich überlange Kommentar-Zeilen gekürzt. MfG, Holzchopf |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group