Blenderscript: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Blender exporter Script)
K (Blender exporter Script: Python-Code in <source>-Block gepackt (für Syntaxhighlighting))
 
Zeile 10: Zeile 10:
 
*es müssen Lichter,Empty und Kameras entfernt werden da diese sonst als Objekte interpretiert und falsch behandelt werden
 
*es müssen Lichter,Empty und Kameras entfernt werden da diese sonst als Objekte interpretiert und falsch behandelt werden
  
#!BPY
+
<source lang="python">#!BPY
+
 
"""
+
"""
Name: '... Meshformat (.meshf)...'
+
Name: '... Meshformat (.meshf)...'
Blender: 234
+
Blender: 234
Group: 'Export'
+
Group: 'Export'
Tooltip: 'Exportiert die aktuelle Szene in das ... Format'
+
Tooltip: 'Exportiert die aktuelle Szene in das ... Format'
"""
+
"""
+
 
import struct
+
import struct
import Blender
+
import Blender
import sys
+
import sys
+
 
from Blender import NMesh
+
from Blender import NMesh
from Blender import Image
+
from Blender import Image
from Blender.NMesh import *
+
from Blender.NMesh import *
from Blender.Image import *
+
from Blender.Image import *
+
 
class TFace:
+
class TFace:
vertstart=0
+
vertstart=0
vertcount=0
+
vertcount=0
+
 
class TObject:
+
class TObject:
posx=0
+
posx=0
posy=0
+
posy=0
posz=0
+
posz=0
facestart=0
+
facestart=0
facecount=0
+
facecount=0
+
 
class meshf:
+
class meshf:
#header
+
#header
Version="meshf1"
+
Version="meshf1"
  NumOfVert=0
+
NumOfVert=0
NumOfFace=0
+
NumOfFace=0
  NumOfObj=0
+
NumOfObj=0
#data
+
#data
+
 
Verts=[]
+
Verts=[]
Faces=[]
+
Faces=[]
Meshs=[]
+
Meshs=[]
Texcoords=[]
+
Texcoords=[]
+
 
size=0
+
size=0
+
 
file=meshf
+
file=meshf
+
 
#Funktion zum schreiben des Headers
+
#Funktion zum schreiben des Headers
def writeheader():
+
def writeheader():
iof.write(file.Version)
+
iof.write(file.Version)
data=struct.pack("iii",file.NumOfVert,
+
data=struct.pack("iii",file.NumOfVert,
                          file.NumOfFace,
+
                        file.NumOfFace,
                          file.NumOfObj)
+
                        file.NumOfObj)
iof.write(data)
+
iof.write(data)
+
 
#Funktion zum schreiben des Datenteils
+
#Funktion zum schreiben des Datenteils
def writedata():
+
def writedata():
+
 
#Verticekoordinaten
+
#Verticekoordinaten
for v in file.Verts:
+
for v in file.Verts:
data=struct.pack("fff",v.co[0],v.co[1],v.co[2])
+
data=struct.pack("fff",v.co[0],v.co[1],v.co[2])
file.size=file.size+12
+
file.size=file.size+12
iof.write(data)
+
iof.write(data)
+
 
+
 
#Normalen
+
#Normalen
for v in file.Verts:
+
for v in file.Verts:
data=struct.pack("fff",v.no[0],v.no[1],v.no[2])
+
data=struct.pack("fff",v.no[0],v.no[1],v.no[2])
file.size=file.size+12
+
file.size=file.size+12
iof.write(data)
+
iof.write(data)
+
 
#Texkoordinaten
+
#Texkoordinaten
for t in file.Texcoords:
+
for t in file.Texcoords:
data=struct.pack("ff",t[0],t[1])
+
data=struct.pack("ff",t[0],t[1])
file.size=file.size+8
+
file.size=file.size+8
iof.write(data)
+
iof.write(data)
+
 
#Flächen
+
#Flächen
for f in file.Faces:
+
for f in file.Faces:
#vertstart,vertcount
+
#vertstart,vertcount
data=struct.pack("ii",f.vertstart,f.vertcount)
+
data=struct.pack("ii",f.vertstart,f.vertcount)
iof.write(data)
+
iof.write(data)
file.size=file.size+8
+
file.size=file.size+8
+
 
#Objekte
+
#Objekte
for o in file.Meshs:
+
for o in file.Meshs:
data=struct.pack("fff",o.posx,o.posy,o.posz)
+
data=struct.pack("fff",o.posx,o.posy,o.posz)
iof.write(data)
+
iof.write(data)
data=struct.pack("ii",o.facestart,o.facecount)
+
data=struct.pack("ii",o.facestart,o.facecount)
iof.write(data)
+
iof.write(data)
+
 
#Funktion zum lesen der Blender Daten
+
#Funktion zum lesen der Blender Daten
def readblenderdata():
+
def readblenderdata():
#lade alle Objekte in objs
+
#lade alle Objekte in objs
objs=Blender.Object.Get()
+
objs=Blender.Object.Get()
#geht alle Objekte in objs durch
+
#geht alle Objekte in objs durch
for obj in objs:
+
for obj in objs:
#holt sich die Meshdaten und speichert sie
+
#holt sich die Meshdaten und speichert sie
mesh=obj.getData()
+
mesh=obj.getData()
facecount=file.NumOfFace
+
facecount=file.NumOfFace
file.NumOfFace=file.NumOfFace+len(mesh.faces)
+
file.NumOfFace=file.NumOfFace+len(mesh.faces)
+
 
for f in mesh.faces:
+
for f in mesh.faces:
if len(f.v)==4:#wenn die Fläche aus 4 Vertice besteht
+
if len(f.v)==4:#wenn die Fläche aus 4 Vertice besteht
file.Verts.append(f.v[0])
+
file.Verts.append(f.v[0])
file.Verts.append(f.v[1])
+
file.Verts.append(f.v[1])
file.Verts.append(f.v[2])
+
file.Verts.append(f.v[2])
fa=TFace()
+
fa=TFace()
fa.vertstart=len(file.Verts)-3
+
fa.vertstart=len(file.Verts)-3
fa.vertcount=3
+
fa.vertcount=3
file.Faces.append(fa)
+
file.Faces.append(fa)
+
 
file.Verts.append(f.v[0])
+
file.Verts.append(f.v[0])
file.Verts.append(f.v[2])
+
file.Verts.append(f.v[2])
file.Verts.append(f.v[3])
+
file.Verts.append(f.v[3])
fa=TFace()
+
fa=TFace()
fa.vertstart=len(file.Verts)-3
+
fa.vertstart=len(file.Verts)-3
fa.vertcount=3
+
fa.vertcount=3
file.Faces.append(fa)
+
file.Faces.append(fa)
+
 
file.NumOfFace=file.NumOfFace+1
+
file.NumOfFace=file.NumOfFace+1
file.NumOfVert=file.NumOfVert+6
+
file.NumOfVert=file.NumOfVert+6
+
 
if len(f.uv)==0:
+
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])
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:
+
else:
file.Texcoords.append((f.uv[0][0],f.uv[0][1]))
+
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[1][0],f.uv[1][1]))
file.Texcoords.append((f.uv[2][0],f.uv[2][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[0][0],f.uv[0][1]))
file.Texcoords.append((f.uv[2][0],f.uv[2][1]))
+
file.Texcoords.append((f.uv[2][0],f.uv[2][1]))
file.Texcoords.append((f.uv[3][0],f.uv[3][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
+
if len(f.v)==3:#wenn die Fläche aus 3 Vertice besteht
for ve in f.v:
+
for ve in f.v:
file.Verts.append(ve)
+
file.Verts.append(ve)
file.NumOfVert=file.NumOfVert+len(f.v)
+
file.NumOfVert=file.NumOfVert+len(f.v)
fa=TFace()
+
fa=TFace()
fa.vertstart=len(file.Verts)-3
+
fa.vertstart=len(file.Verts)-3
fa.vertcount=3
+
fa.vertcount=3
file.Faces.append(fa)
+
file.Faces.append(fa)
+
 
if len(f.uv)==0:
+
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:
+
else:
for tc in f.uv:
+
for tc in f.uv:
file.Texcoords.append((tc[0],tc[1]))
+
file.Texcoords.append((tc[0],tc[1]))
+
 
ob=TObject()
+
ob=TObject()
ob.posx=obj.LocX
+
ob.posx=obj.LocX
ob.posy=obj.LocY
+
ob.posy=obj.LocY
ob.posz=obj.LocZ
+
ob.posz=obj.LocZ
ob.facestart=facecount
+
ob.facestart=facecount
ob.facecount=file.NumOfFace-facecount
+
ob.facecount=file.NumOfFace-facecount
file.Meshs.append(ob)
+
file.Meshs.append(ob)
+
 
#Objektanzahl erhoehen
+
#Objektanzahl erhoehen
file.NumOfObj=file.NumOfObj+1
+
file.NumOfObj=file.NumOfObj+1
+
 
print "start"
+
print "start"
#Open File
+
#Open File
iof=open("C:/Medien/player.xdp","wb")
+
iof=open("C:/Medien/player.xdp","wb")
+
 
#holt die Szenendaten
+
#holt die Szenendaten
readblenderdata()
+
readblenderdata()
+
 
#schreibt den Header der Datei
+
#schreibt den Header der Datei
writeheader()
+
writeheader()
+
 
#schreibt den Datenteil der Datei
+
#schreibt den Datenteil der Datei
writedata()
+
writedata()
+
 
#Datei schliessen
+
#Datei schliessen
iof.close()
+
iof.close()
+
 
print "Flaechen:"+str(file.NumOfFace)
+
print "Flaechen:"+str(file.NumOfFace)
print "Vertice:"+str(file.NumOfVert)
+
print "Vertice:"+str(file.NumOfVert)
print "ready Size:"+str(file.size)
+
print "ready Size:"+str(file.size)</source>

Aktuelle Version vom 21. April 2014, 10:39 Uhr

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)