diff --git a/.gitignore b/.gitignore index 3304e52..2377db6 100644 --- a/.gitignore +++ b/.gitignore @@ -126,3 +126,4 @@ history.json src/example.py test/resources/サンプルモデル.pmx test/resources/サンプルモーション.vmd +配布/ diff --git a/archive/Readme.txt b/archive/Readme.txt index 9a1e323..fef9d3d 100644 --- a/archive/Readme.txt +++ b/archive/Readme.txt @@ -208,6 +208,16 @@ https://github.com/miu200521358/vroid2pmx @ ---------------------------------------------------------------- +ver2.01.06 (2023/10/22) +Evrm1.0ŏo͂ꍇ̃G[nhOlj +E}eA팸ŏo͂ꍇ̃nhOlj +@E}eA2܂łɍ팸Ǝs܂ +@E{[K؂Ɋ蓖ĂĂȂꍇAPmxTailorpݒC|[gJSONȂꍇ܂ +EVRoid Studiox[^łŃGNX|[gvrmxŏo͂ł悤 +@Evrm̃[tłƈقȂ邽߁Alj[t̐X[܂ +@@iVRoid StudioŐݒ肵[t͂̂܂܂̖Oŏo͂܂j +@E`ɂĂPmxTailorpݒt@C̏o͂Ɏs”\܂ + ver2.01.05 (2023/04/22) EVRoid Studio 1.22.0 ȍ~ŁA @PmxTailorݒpGNX|[gōގȂ̃nhOlj diff --git "a/archive/\316\262\347\211\210Readme.txt" "b/archive/\316\262\347\211\210Readme.txt" index 4c3d56b..b337343 100644 --- "a/archive/\316\262\347\211\210Readme.txt" +++ "b/archive/\316\262\347\211\210Readme.txt" @@ -54,6 +54,20 @@ @rivision ---------------------------------------------------------------- +Vroid2Pmx_2.01.06_03 (2023/09/30) +EVRoid StudiołŃGNX|[gvrm̕ϊɎsꍇ̂C + +Vroid2Pmx_2.01.06_02 (2023/09/27) +EVRoid Studiox[^łŃGNX|[gvrmxŏo͂ł悤 +@Evrm̃[tłƈقȂ邽߁Alj[t̐X[܂ +@@iVRoid StudioŐݒ肵[t͂̂܂܂̖Oŏo͂܂j +@E`ɂĂPmxTailorpݒt@C̏o͂Ɏs”\܂ + +Vroid2Pmx_2.01.06_01 (2023/09/26) +Evrm1.0ŏo͂ꍇ̃G[nhOlj +E}eA팸ŏo͂ꍇ̃nhOlj +@{[K؂Ɋ蓖ĂĂȂꍇAPmxTailorpݒC|[gJSONȂꍇ܂ + Vroid2Pmx_2.01.05_01 (2023/04/15) EPmxTailorݒpGNX|[gŁAގȂ̃nhOlj diff --git a/rivision.txt b/rivision.txt index a963be4..952269e 100644 --- a/rivision.txt +++ b/rivision.txt @@ -1,4 +1,65 @@ +Vroid2Pmx_2.01.06_03 (2023/09/30) + +EVRoid StudiołŃGNX|[gvrm̕ϊɎsꍇ̂C
+
+ m|Xg
+()
+
+ zzꏊ
+https://fire.st/jVPUABu + + +VRoid Studio 1.x ō쐬vrmf[^pmxiMMDpfjf[^ɕϊł uVroid2Pmxvx[^łAbvf[g܂I + +v2.01.06_02 +EVRoid Studiox[^łŃGNX|[gvrmxŏo͂ł悤 +@[tljΉ + +R~jeBzz +https://com.nicovideo.jp/community/co5387214 + + + VRoid Studiox[^ňꕔΉ + +VRoid Studiox[^łŃGNX|[gvrmAxŏo͂܂ł͂ł悤ɂĂ݂܂B +A[tłƈقȂ邽߁Alj[t̐̓X[܂ +iVRoid StudioŐݒ肵[t͂̂܂܂̖Oŏo͂܂j +PmxTailorpݒt@Co͂܂A܂ɌʂςȂ̂łӂ + + + +vrm1.0̉͂͌ݑΉĂȂ̂ŁAK؂ȃbZ[Wo͏o悤nhOlj܂ + + }eA팸̃nhOlj + +vrmGNX|[gɃ}eA팸ꍇAo͂ɎssɑΉ܂ +ߑȂǂ̗hꕨݒ肪ȂȂĂꍇAPmxTailorpݒt@CJSONɂݒ肪lj܂ + + + + gUnXLbvlj + +gU͍\IɕGł܂ƂւʂɓȂꍇ邽߁AUO悤ɂ܂ +萔łgUꂽꍇ̓vOCœ꒼Ă + + + t@CC + +t@CPMXf𗬗pĂ̂łAɃt@CƂďo͂łȂ񂪂ꍇɃt@CpXŃG[Ă̂ŁAPMXft@CƂďo͂łȂ폜悤ɂ܂ + + + VroidΉ + +Vroid2PmxoRi㔼g3j̃fŃtBbeBOYɂȂȂp^[̂‚CĂ܂ +ȑOYɃtBbeBOł悤ɂȂĂc͂ł + + + + + + + https://fire.st/RIy5ZY4 Vroid2Pmx_1.00.00_01 (2021/11/21) EVK쐬 diff --git a/src/executor.py b/src/executor.py index 563086f..41d8d34 100644 --- a/src/executor.py +++ b/src/executor.py @@ -12,7 +12,7 @@ from utils.MLogger import MLogger from utils import MFileUtils -VERSION_NAME = "2.01.05" +VERSION_NAME = "2.01.06" # 指数表記なし、有効小数点桁数6、30を超えると省略あり、一行の文字数200 np.set_printoptions(suppress=True, precision=6, threshold=30, linewidth=200) diff --git a/src/locale/en_US/messages.json b/src/locale/en_US/messages.json index f8d4eda..5210e65 100644 --- a/src/locale/en_US/messages.json +++ b/src/locale/en_US/messages.json @@ -411,5 +411,6 @@ "-- 身体剛体準備終了": "--Completion of body rigid body preparation", "-- -- 身体剛体[%s]": "---- Body Rigid Body [ %s]", "舌関連頂点が見つからなかったため、舌分離処理をスキップします": "No tongue-related vertices found, skipping tongue separation processing", - "-- Aスタンス・親指調整終了": "-- Finished A stance/thumb adjustment" + "-- Aスタンス・親指調整終了": "-- Finished A stance/thumb adjustment", + "出力ソフト情報がないため、処理を中断します。\nvrm1.0でエクスポートした場合、vrm0.0でエクスポートし直してください。": "The process is aborted because there is no output software information. \nIf you exported with vrm1.0, please re-export with vrm0.0." } \ No newline at end of file diff --git a/src/locale/ja_JP/messages.json b/src/locale/ja_JP/messages.json index f42df0e..c2fec41 100644 --- a/src/locale/ja_JP/messages.json +++ b/src/locale/ja_JP/messages.json @@ -411,5 +411,6 @@ "-- 身体剛体準備終了": "-- 身体剛体準備終了", "-- -- 身体剛体[%s]": "-- -- 身体剛体[%s]", "舌関連頂点が見つからなかったため、舌分離処理をスキップします": "舌関連頂点が見つからなかったため、舌分離処理をスキップします", - "-- Aスタンス・親指調整終了": "-- Aスタンス・親指調整終了" + "-- Aスタンス・親指調整終了": "-- Aスタンス・親指調整終了", + "出力ソフト情報がないため、処理を中断します。\nvrm1.0でエクスポートした場合、vrm0.0でエクスポートし直してください。": "出力ソフト情報がないため、処理を中断します。\nvrm1.0でエクスポートした場合、vrm0.0でエクスポートし直してください。" } \ No newline at end of file diff --git a/src/locale/zh_CN/messages.json b/src/locale/zh_CN/messages.json index 8489ea5..3f9a006 100644 --- a/src/locale/zh_CN/messages.json +++ b/src/locale/zh_CN/messages.json @@ -414,5 +414,6 @@ "-- 身体剛体準備終了": "--完成刚体刚体准备", "-- -- 身体剛体[%s]": "---- Body 刚体 [%s]", "舌関連頂点が見つからなかったため、舌分離処理をスキップします": "未找到舌相关顶点,跳过舌分离处理", - "-- Aスタンス・親指調整終了": "-- 完成了姿势/拇指调整" + "-- Aスタンス・親指調整終了": "-- 完成了姿势/拇指调整", + "出力ソフト情報がないため、処理を中断します。\nvrm1.0でエクスポートした場合、vrm0.0でエクスポートし直してください。": "由于没有输出软件信息,进程被中止。 \n如果您已使用vrm1.0 导出,请使用 vrm0.0 重新导出。" } \ No newline at end of file diff --git a/src/service/VroidExportService.py b/src/service/VroidExportService.py index a079494..42072be 100644 --- a/src/service/VroidExportService.py +++ b/src/service/VroidExportService.py @@ -106,17 +106,25 @@ def execute(self): except MKilledException: return False except SizingException as se: - logger.error("Vroid2Pmx処理が処理できないデータで終了しました。\n\n%s", se.message, decoration=MLogger.DECORATION_BOX) + logger.error( + "Vroid2Pmx処理が処理できないデータで終了しました。\n\n%s\n%s", + "2.01.06", + se.message, + decoration=MLogger.DECORATION_BOX, + ) except Exception: logger.critical( - "Vroid2Pmx処理が意図せぬエラーで終了しました。\n\n%s", traceback.format_exc(), decoration=MLogger.DECORATION_BOX + "Vroid2Pmx処理が意図せぬエラーで終了しました。\n\n%s\n%s", + "2.01.06", + traceback.format_exc(), + decoration=MLogger.DECORATION_BOX, ) finally: logging.shutdown() def vroid2pmx(self): try: - model, tex_dir_path, setting_dir_path = self.create_model() + model, tex_dir_path, setting_dir_path, is_vroid1 = self.create_model() if not model: return False @@ -132,7 +140,7 @@ def vroid2pmx(self): if not model: return False - model = self.convert_morph(model) + model = self.convert_morph(model, is_vroid1) if not model: return False @@ -1032,7 +1040,7 @@ def calc_normal(self, bone_mat: MMatrix4x4, normal: MVector3D): return MVector3D(np.sum(normal.data() * bone_invert_mat, axis=1)).normalized() - def convert_morph(self, model: PmxModel): + def convert_morph(self, model: PmxModel, is_vroid1: bool): # グループモーフ定義 if ( "extensions" not in model.json_data @@ -1050,8 +1058,9 @@ def convert_morph(self, model: PmxModel): logger.info("-- -- モーフ調整準備") face_close_dict = {} - for base_offset in target_morphs["Fcl_EYE_Close"].offsets: - face_close_dict[base_offset.vertex_index] = base_offset.position_offset.copy().data() + if is_vroid1: + for base_offset in target_morphs["Fcl_EYE_Close"].offsets: + face_close_dict[base_offset.vertex_index] = base_offset.position_offset.copy().data() face_material_index_vertices = [] face_left_close_index_vertices = [] @@ -1949,6 +1958,7 @@ def convert_mesh(self, model: PmxModel, bone_name_dict: dict, tex_dir_path: str) indices_by_materials = {} materials_by_type = {} registed_material_names = [] + midx = 0 for vertex_key, vertex_dict in vertex_blocks.items(): start_vidx = vertex_dict["start"] @@ -2154,7 +2164,7 @@ def convert_mesh(self, model: PmxModel, bone_name_dict: dict, tex_dir_path: str) if "vectorProperties" in material_ext and "_ShadeColor" in material_ext["vectorProperties"]: toon_sharing_flag = 0 if material_ext["textureProperties"]["_MainTex"] < len(model.json_data["images"]): - toon_img_name = f'{model.json_data["images"][material_ext["textureProperties"]["_MainTex"]]["name"]}_Toon.bmp' + toon_img_name = f'{model.json_data["images"][material_ext["textureProperties"]["_MainTex"]].get("name", f"M{midx:03d}")}_Toon.bmp' else: toon_img_name = f"{material_name}_Toon.bmp" @@ -2220,6 +2230,7 @@ def convert_mesh(self, model: PmxModel, bone_name_dict: dict, tex_dir_path: str) material.vertex_count += len(indices) logger.info("-- 面・材質データ解析[%s-%s]", index_accessor, material_accessor) + midx += 1 # 材質を透過順に並べ替て設定 index_idx = 0 @@ -3003,8 +3014,11 @@ def create_model(self): or "VRM" not in model.json_data["extensions"] or "exporterVersion" not in model.json_data["extensions"]["VRM"] ): - logger.error("出力ソフト情報がないため、処理を中断します。", decoration=MLogger.DECORATION_BOX) - return None, None, None + logger.error( + "出力ソフト情報がないため、処理を中断します。\nvrm1.0でエクスポートした場合、vrm0.0でエクスポートし直してください。", + decoration=MLogger.DECORATION_BOX, + ) + return None, None, None, None if ( "extensions" not in model.json_data @@ -3012,16 +3026,18 @@ def create_model(self): or "meta" not in model.json_data["extensions"]["VRM"] ): logger.error("メタ情報がないため、処理を中断します。", decoration=MLogger.DECORATION_BOX) - return None, None, None + return None, None, None, None - if "VRoidStudio-0." in model.json_data["extensions"]["VRM"]["exporterVersion"]: - # VRoid Studioベータ版はNG - logger.error( - "VRoid Studio ベータ版 で出力されたvrmデータではあるため、処理を中断します。\n正式版でコンバートしてから再度試してください。\n出力元: %s", - model.json_data["extensions"]["VRM"]["exporterVersion"], - decoration=MLogger.DECORATION_BOX, - ) - return None, None, None + # if "VRoidStudio-0." in model.json_data["extensions"]["VRM"]["exporterVersion"]: + # # VRoid Studioベータ版はNG + # logger.error( + # "VRoid Studio ベータ版 で出力されたvrmデータではあるため、処理を中断します。\n正式版でコンバートしてから再度試してください。\n出力元: %s", + # model.json_data["extensions"]["VRM"]["exporterVersion"], + # decoration=MLogger.DECORATION_BOX, + # ) + # return None, None, None + + is_vroid1 = True if "VRoid Studio-1." not in model.json_data["extensions"]["VRM"]["exporterVersion"]: # VRoid Studio正式版じゃなくても警告だけに留める @@ -3030,6 +3046,7 @@ def create_model(self): model.json_data["extensions"]["VRM"]["exporterVersion"], decoration=MLogger.DECORATION_BOX, ) + is_vroid1 = False if "title" in model.json_data["extensions"]["VRM"]["meta"]: model.name = model.json_data["extensions"]["VRM"]["meta"]["title"] @@ -3091,11 +3108,11 @@ def create_model(self): if "images" not in model.json_data: logger.error("変換可能な画像情報がないため、処理を中断します。", decoration=MLogger.DECORATION_BOX) - return None, None, None + return None, None, None, None # jsonデータの中に画像データの指定がある場合 image_offset = 0 - for image in model.json_data["images"]: + for iidx, image in enumerate(model.json_data["images"]): if int(image["bufferView"]) < len(model.json_data["bufferViews"]): image_buffer = model.json_data["bufferViews"][int(image["bufferView"])] # 画像の開始位置はオフセット分ずらす @@ -3103,7 +3120,10 @@ def create_model(self): # 拡張子 ext = MIME_TYPE[image["mimeType"]] # 画像名 - image_name = f"{image['name']}.{ext}" + if "name" in image: + image_name = f"{image['name']}.{ext}" + else: + image_name = f"T{iidx:03d}.{ext}" with open(os.path.join(glft_dir_path, image_name), "wb") as ibf: ibf.write(self.buffer[image_start : (image_start + image_buffer["byteLength"])]) # オフセット加算 @@ -3115,7 +3135,7 @@ def create_model(self): logger.info("-- テクスチャデータ解析終了") - return model, tex_dir_path, setting_dir_path + return model, tex_dir_path, setting_dir_path, is_vroid1 # アクセサ経由で値を取得する # https://github.com/ft-lab/Documents_glTF/blob/master/structure.md diff --git a/vroid2pmx.spec b/vroid2pmx.spec index 36b7e21..4f3a9d8 100644 --- a/vroid2pmx.spec +++ b/vroid2pmx.spec @@ -57,7 +57,7 @@ exe = EXE(pyz, a.zipfiles, a.datas, [], - name='Vroid2Pmx_2.01.05', + name='Vroid2Pmx_2.01.06', debug=False, bootloader_ignore_signals=False, strip=False,