Created
May 7, 2011 03:21
-
-
Save mobp/960168 to your computer and use it in GitHub Desktop.
MikuMikuDanceからモーションデータをNewTek-MDDに書き出すMMDBridgeのスクリプト。使い方はこちらへ => http://whatweblog.blogspot.com/2011/05/mmdmdd.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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