Blenderscript
Aus DGL Wiki
Version vom 1. Oktober 2005, 21:59 Uhr von Luketheduke (Diskussion | Beiträge) (→Blender exporter Script)
Blender exporter Script
Folgendes Blenderscript, welches in Python geschrieben ist, exportiert Mesh, Texturkoordinaten und Normalen. Es wurde von TAK2004 geschrieben welcher es euch hiermit freistellt dieses zu erweitern, anzupassen oder einfach zu kopieren. Zur Bedienung ist folgendes zu sagen:
- es ist auf korrekte Einrückung zu achten, da dadurch Codeblöcke, Funktionen und Einsprungspunkte erkannt werden
- die Datei wird an dem am Ende eingetragen Punkt gespeichert
- bevor das Script im File->Export Menü erscheint muss das Script einmal interpretiert werden
- ein Script kann über ein Textfenster in Blender angezeigt und gestartet werden
- das Script achtet nicht auf die Rotation der Objekte, deswegen ist anzuraten durch folgende Tastenkombinationen die Objekte neu auszurichten : "a"(wählt alle Objekte aus/ab),"strg+s"(tranformiert Objektrotation mit dem Mesh und setz dann die rotation auf 0)
- es müssen Lichter,Empty und Kameras entfernt werden da diese sonst als Objekte interpretiert und falsch behandelt werden
#!BPY """ Name: '... Meshformat (.meshf)...' Blender: 234 Group: 'Export' Tooltip: 'Exportiert die aktuelle Szene in das ... Format' """ import struct import Blender import sys from Blender import NMesh from Blender import Image from Blender.NMesh import * from Blender.Image import * class TFace: vertstart=0 vertcount=0 class TObject: posx=0 posy=0 posz=0 facestart=0 facecount=0 class meshf: #header Version="meshf1" NumOfVert=0 NumOfFace=0 NumOfObj=0 #data Verts=[] Faces=[] Meshs=[] Texcoords=[] size=0 file=meshf #Funktion zum schreiben des Headers def writeheader(): iof.write(file.Version) data=struct.pack("iii",file.NumOfVert, file.NumOfFace, file.NumOfObj) iof.write(data) #Funktion zum schreiben des Datenteils def writedata(): #Verticekoordinaten for v in file.Verts: data=struct.pack("fff",v.co[0],v.co[1],v.co[2]) file.size=file.size+12 iof.write(data) #Normalen for v in file.Verts: data=struct.pack("fff",v.no[0],v.no[1],v.no[2]) file.size=file.size+12 iof.write(data) #Texkoordinaten for t in file.Texcoords: data=struct.pack("ff",t[0],t[1]) file.size=file.size+8 iof.write(data) #Flächen for f in file.Faces: #vertstart,vertcount data=struct.pack("ii",f.vertstart,f.vertcount) iof.write(data) file.size=file.size+8 #Objekte for o in file.Meshs: data=struct.pack("fff",o.posx,o.posy,o.posz) iof.write(data) data=struct.pack("ii",o.facestart,o.facecount) iof.write(data) #Funktion zum lesen der Blender Daten def readblenderdata(): #lade alle Objekte in objs objs=Blender.Object.Get() #geht alle Objekte in objs durch for obj in objs: #holt sich die Meshdaten und speichert sie mesh=obj.getData() facecount=file.NumOfFace file.NumOfFace=file.NumOfFace+len(mesh.faces) for f in mesh.faces: if len(f.v)==4:#wenn die Fläche aus 4 Vertice besteht file.Verts.append(f.v[0]) file.Verts.append(f.v[1]) file.Verts.append(f.v[2]) fa=TFace() fa.vertstart=len(file.Verts)-3 fa.vertcount=3 file.Faces.append(fa) file.Verts.append(f.v[0]) file.Verts.append(f.v[2]) file.Verts.append(f.v[3]) fa=TFace() fa.vertstart=len(file.Verts)-3 fa.vertcount=3 file.Faces.append(fa) file.NumOfFace=file.NumOfFace+1 file.NumOfVert=file.NumOfVert+6 if len(f.uv)==0: file.Texcoords.append([0,0]) file.Texcoords.append([0,0]) file.Texcoords.append([0,0]) file.Texcoords.append([0,0]) file.Texcoords.append([0,0]) file.Texcoords.append([0,0]) else: file.Texcoords.append((f.uv[0][0],f.uv[0][1])) file.Texcoords.append((f.uv[1][0],f.uv[1][1])) file.Texcoords.append((f.uv[2][0],f.uv[2][1])) file.Texcoords.append((f.uv[0][0],f.uv[0][1])) file.Texcoords.append((f.uv[2][0],f.uv[2][1])) file.Texcoords.append((f.uv[3][0],f.uv[3][1])) if len(f.v)==3:#wenn die Fläche aus 3 Vertice besteht for ve in f.v: file.Verts.append(ve) file.NumOfVert=file.NumOfVert+len(f.v) fa=TFace() fa.vertstart=len(file.Verts)-3 fa.vertcount=3 file.Faces.append(fa) if len(f.uv)==0: file.Texcoords.append([0,0]) file.Texcoords.append([0,0]) file.Texcoords.append([0,0]) else: for tc in f.uv: file.Texcoords.append((tc[0],tc[1])) ob=TObject() ob.posx=obj.LocX ob.posy=obj.LocY ob.posz=obj.LocZ ob.facestart=facecount ob.facecount=file.NumOfFace-facecount file.Meshs.append(ob) #Objektanzahl erhoehen file.NumOfObj=file.NumOfObj+1 print "start" #Open File iof=open("C:/Medien/player.xdp","wb") #holt die Szenendaten readblenderdata() #schreibt den Header der Datei writeheader() #schreibt den Datenteil der Datei writedata() #Datei schliessen iof.close() print "Flaechen:"+str(file.NumOfFace) print "Vertice:"+str(file.NumOfVert) print "ready Size:"+str(file.size)