Blenderscript
Aus DGL Wiki
Version vom 11. Juni 2005, 10:09 Uhr von TAK2004 (Diskussion | Beiträge) (Zeigt ein Blender exporter Script)
Blender exporter Script
Folgendes Blenderscript, welches in Python geschrieben ist, exportiert das Mesh, Texturcoordinate und Normals. Es wurde von TAK2004 geschrieben und stellt es hiermit frei dieses zu erweiter, anpassen oder einfach zu kopieren. Zur bedienung ist folgendes zu sagen
- es ist auf korrekte Einrückung zu achten, da durch diese Codeblocke,Funktionen und Einsprungspunkt erkannt werden
- die Datei wir 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 zu raten durch folgende tastenkombis mal die Objekte neuzujustieren : "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 sonnst 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)