Skip to content

Instantly share code, notes, and snippets.

@mobp
Created May 7, 2011 03:21
Show Gist options
  • Save mobp/960168 to your computer and use it in GitHub Desktop.
Save mobp/960168 to your computer and use it in GitHub Desktop.
MikuMikuDanceからモーションデータをNewTek-MDDに書き出すMMDBridgeのスクリプト。使い方はこちらへ => http://whatweblog.blogspot.com/2011/05/mmdmdd.html
import os
from struct import pack
def export_mdd(premddpath, mddpath):
if os.path.isfile(premddpath):
pass
if os.path.isfile(mddpath):
pass
pre_mdd = open(premddpath, "r")
fmax = None
pmax = 0
start = None
end = None
for s in pre_mdd:
if s[0] == "#":
if start == None:
start = int(s.split(" ")[1])
else:
end = int(s.split(" ")[1])
print("start frame: "+str(start))
print("end frame: "+str(end))
if start == 0:
fmax = end
else:
fmax = end - start
print("total frames:"+str(fmax))
pre_mdd.seek(0, 0)
pre_mdd.readline()
for s in pre_mdd:
if s[0] == "#":
break
else:
pmax += 1
print("object points: "+str(pmax))
mdd = open(mddpath, "wb")
mdd.write(pack(">ii", fmax, pmax))
mdd.write(pack(">%df" % (fmax), *[frame / float(30) for frame in range(fmax)]))
pre_mdd.seek(0, 0)
for s in pre_mdd:
if s[0] == "#":
break
else:
mdd.write(pack(">fff", *[float(i) for i in s.split(" ")]))
pre_mdd.seek(0, 0)
frame = 0
prev_frame = -1
for s in pre_mdd:
if s[0] == "#":
# skip overlap frames
curent_frame = int(s.split(" ")[1])
#print(str(prev_frame)+" == "+str(curent_frame))
if prev_frame == curent_frame:
print("skip frame "+str(curent_frame))
for s in pre_mdd:
if s[0] == "#":
break
#pre_mdd.seek(pmax*14, 1)
continue
prev_frame = curent_frame
print(str(frame)+"/"+str(fmax))
frame += 1
else:
mdd.write(pack(">fff", *[float(i) for i in s.split(" ")]))
mdd.close()
print("::Finished")
print("start frame: "+str(start))
print("end frame: "+str(end))
print("total frames:"+str(fmax))
print("object points: "+str(pmax))
premddpath = "tmp/pre.expmdd"
mddpath = "out/export_mdd.mdd"
print("::Reading "+premddpath)
export_mdd(premddpath, mddpath)
if os.path.isfile(premddpath):
os.remove("./tmp/isoverlap.expmdd")
os.remove(premddpath)
import mmdbridge
from mmdbridge import *
import os
import math
from math import *
import time
def export_mtl(mtlpath):
if os.path.isfile(mtlpath):
os.remove(mtlpath)
mtlfile = open(mtlpath, 'a')
for buf in range(get_vertex_buffer_size()):
for mat in range(get_material_size(buf)):
material_name = "material_" + str(buf) + "_" + str(mat)
mtlfile.write("newmtl "+material_name+"\n")
ambient = get_ambient(buf, mat)
diffuse = get_diffuse(buf, mat)
specular = get_specular(buf, mat)
emissive = get_emissive(buf, mat)
power = get_power(buf, mat)
texture = get_texture(buf, mat)
if len(texture) == 0:
texture = get_exported_texture(buf, mat) + ".png"
mtlfile.write("Ka "+str(ambient[0])+" "+str(ambient[1])+" "+str(ambient[2])+"\n")
mtlfile.write("Kd "+str(diffuse[0])+" "+str(diffuse[1])+" "+str(diffuse[2])+"\n")
mtlfile.write("Ks "+str(specular[0])+" "+str(specular[1])+" "+str(specular[2])+"\n")
if (diffuse[3] < 1):
mtlfile.write("d "+str(diffuse[3])+"\n")
mtlfile.write("Ns "+str(power)+"\n")
#mtlfile.write("Ni 1.33\n")
# lum = 1 no specular highlights, lum = 2 light normaly
mtlfile.write("lum 1\n")
if len(texture) > 0:
mtlfile.write("map_Kd "+texture+"\n")
if (diffuse[3] < 1):
texname, ext = os.path.splitext(texture)
if (ext is not "bmp") and (ext is not "png") and (ext is not "tif") and \
(ext is not "BMP") and (ext is not "PNG") and (ext is not "TIF"):
export_path = get_base_path() + "tmp\\" + texname + ".png"
export_texture(buf, mat, export_path)
mtlfile.write("map_d "+texname + ".png"+"\n")
else:
mtlfile.write("map_d "+texture+"\n")
def export_obj(objpath, material_file_name):
if os.path.isfile(objpath):
os.remove(objpath)
objfile = open(objpath, 'a')
objfile.write("mtllib "+material_file_name+"\n")
for buf in range(get_vertex_buffer_size()):
for vindex in range(get_vertex_size(buf)):
v = get_vertex(buf, vindex)
objfile.write("v "+str(v[0])+" "+str(v[1])+" "+str(-v[2])+"\n")
for buf in range(get_vertex_buffer_size()):
for nindex in range(get_normal_size(buf)):
n = get_normal(buf, nindex)
objfile.write("vn "+str(n[0])+" "+str(n[1])+" "+str(-n[2])+"\n")
for buf in range(get_vertex_buffer_size()):
if (get_uv_size(buf) > 0):
for uvindex in range(get_uv_size(buf)):
uv = get_uv(buf, uvindex)
objfile.write("vt "+str(uv[0])+" "+str(-uv[1])+"\n") # invert
else:
for uvindex in range(get_vertex_size(buf)):
objfile.write("vt 0 0\n")
last_findex = 0
for buf in range(get_vertex_buffer_size()):
max_findex_in_buf = 0
for mat in range(get_material_size(buf)):
material_name = "material_" + str(buf) + "_" + str(mat)
objfile.write("usemtl "+material_name+"\n")
objfile.write("s "+str(mat+1)+"\n")
for findex in range(get_face_size(buf, mat)):
f = get_face(buf, mat, findex)
if max_findex_in_buf < (last_findex + max(f)):
max_findex_in_buf = (last_findex + max(f))
f0 = str(last_findex + f[0])
f1 = str(last_findex + f[1])
f2 = str(last_findex + f[2])
# righthand coords
objfile.write("f "+f1+"/"+f1+"/"+f1+" "+f0+"/"+f0+"/"+f0+" "+f2+"/"+f2+"/"+f2+"\n")
last_findex = max_findex_in_buf
def write_pre_mdd(is_overlap_path, premddpath):
if os.path.isfile(is_overlap_path):
pass
try:
is_overlap = open(is_overlap_path, "r")
except:
is_overlap = open(is_overlap_path, "w")
is_overlap.write(str(get_frame_number())+"\n")
is_overlap.close()
is_overlap = open(is_overlap_path, "r")
if is_overlap.readable():
i = -1
try:
i = int(is_overlap.readline().split()[0])
except:
is_overlap.close()
is_overlap = open(is_overlap_path, "w")
is_overlap.write(str(get_frame_number())+"\n")
return
if i == get_frame_number():
#messagebox("skip frame")
return
else:
pass
if os.path.isfile(premddpath):
pass
pre_mdd_file = open(premddpath, "a")
pre_mdd_file.write("#"+" "+str(get_frame_number())+"\n")
for buf in range(get_vertex_buffer_size()):
for vindex in range(get_vertex_size(buf)):
v = get_vertex(buf, vindex)
pre_mdd_file.write(str(v[0])+" "+str(v[1])+" "+str(-v[2])+"\n")
pre_mdd_file.close()
is_overlap.close()
is_overlap = open(is_overlap_path, "w")
is_overlap.write(str(get_frame_number())+"\n")
is_overlap.close()
tmppath = get_base_path().replace("\\", "/") + "tmp/"
outpath = get_base_path().replace("\\", "/") + "out/"
objpath = outpath + "export_mdd.obj"
mtlpath = outpath + "export_mdd.mtl"
mtlfilename = "export_mtl.mtl"
texture_export_dir = outpath
premddpath = tmppath + "pre.expmdd"
is_overlap_path = tmppath + "isoverlap.expmdd"
if os.path.isfile(objpath):
write_pre_mdd(is_overlap_path, premddpath)
else:
export_mtl(mtlpath)
copy_textures(texture_export_dir.replace("/", "\\"))
export_uncopied_textures(texture_export_dir.replace("/", "\\"), "png")
export_obj(objpath, mtlfilename)
write_pre_mdd(is_overlap_path, premddpath)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment