Skip to content

Commit e1e4d07

Browse files
authored
Merge pull request #8 from miu200521358/develop
ver2.01.01
2 parents 42cc28e + 4c3bd9b commit e1e4d07

20 files changed

+393
-57
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,6 @@ dmypy.json
123123

124124
history.json
125125
*.zip
126+
src/example.py
127+
test/resources/サンプルモデル.pmx
128+
test/resources/サンプルモーション.vmd

archive/β版Readme.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@
5353
���@rivision
5454
----------------------------------------------------------------
5555

56+
Vroid2Pmx_2.01.01_��03 (2022/11/04) miumiu
57+
�E�e�w�̊p�x��␳���鏈����lj�
58+
59+
Vroid2Pmx_2.01.01_��02 (2022/09/18)
60+
�E��֘A���_���Ȃ������ꍇ�ɁA�㕪���������X�L�b�v����悤����lj�
61+
62+
Vroid2Pmx_2.01.01_��01 (2022/08/06)
63+
�E�lj��e�N�X�`���ǂݍ��ݎ���Permission�G���[���o��ꍇ���������̂��C��
64+
5665
Vroid2Pmx_2.01.00_��02 (2022/07/12)
5766
�E�g�̍��̂̏d���ύX�i���d���z�����ɏ��Ă�悤�j
5867
�E��������PmxTailor�p�ݒ�t�@�C�����������̔���~�X���Ă��̂ŏC��

rivision.txt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,17 @@ Vroid2Pmx_2.01.00_
258258
�E�g�̍��̂̏d���ύX�i���d���z�����ɏ��Ă�悤�j
259259
�E��������PmxTailor�p�ݒ�t�@�C�����������̔���~�X���Ă��̂ŏC��
260260

261+
https://fire.st/ppnorQy
262+
Vroid2Pmx_2.01.01_��01 (2022/08/06) miumiu
263+
�E�lj��e�N�X�`���ǂݍ��ݎ���Permission�G���[���o��ꍇ���������̂��C��
264+
265+
https://fire.st/lcIKYIg
266+
Vroid2Pmx_2.01.01_��02 (2022/09/18) miumiu
267+
�E��֘A���_���Ȃ������ꍇ�ɁA�㕪���������X�L�b�v����悤����lj�
268+
269+
https://fire.st/trLePJj
270+
Vroid2Pmx_2.01.01_��03 (2022/11/03) miumiu
271+
�E�e�w�̊p�x��␳���鏈����lj�
261272

262273

263274
Vroid2Pmx_1.01.00_��13 ���������[�X���܂����I
@@ -278,10 +289,9 @@ https://com.nicovideo.jp/community/co5387214
278289

279290

280291

281-
https://fire.st/pXqiu5x
292+
https://fire.st/trLePJj
282293
<br>
283294
<br>
284-
�E�g�̍��̂̏d���ύX�i���d���z�����ɏ��Ă�悤�j<br>
285-
�E��������PmxTailor�p�ݒ�t�@�C�����������̔���~�X���Ă��̂ŏC��<br>
295+
�E�e�w�̊p�x��␳���鏈����lj�<br>
286296
<br>
287297
���Ўg���Ă��������āA���z�E�s��񍐓����肢�������܂��B<br>

src/executor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from utils.MLogger import MLogger
1313
from utils import MFileUtils
1414

15-
VERSION_NAME = "2.01.00"
15+
VERSION_NAME = "2.01.01"
1616

1717
# 指数表記なし、有効小数点桁数6、30を超えると省略あり、一行の文字数200
1818
np.set_printoptions(suppress=True, precision=6, threshold=30, linewidth=200)

src/locale/en_US/messages.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,5 +409,7 @@
409409
"-- PmxTailor用設定ファイル出力準備2": "--Preparation for output of configuration file for PmxTailor 2",
410410
"-- -- PmxTailor用設定ファイル出力準備2 (%s)": "---- Preparation for output of configuration file for PmxTailor 2 ( %s)",
411411
"-- 身体剛体準備終了": "--Completion of body rigid body preparation",
412-
"-- -- 身体剛体[%s]": "---- Body Rigid Body [ %s]"
412+
"-- -- 身体剛体[%s]": "---- Body Rigid Body [ %s]",
413+
"舌関連頂点が見つからなかったため、舌分離処理をスキップします": "No tongue-related vertices found, skipping tongue separation processing",
414+
"-- Aスタンス・親指調整終了": "-- Finished A stance/thumb adjustment"
413415
}

src/locale/ja_JP/messages.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,5 +409,7 @@
409409
"-- PmxTailor用設定ファイル出力準備2": "-- PmxTailor用設定ファイル出力準備2",
410410
"-- -- PmxTailor用設定ファイル出力準備2 (%s)": "-- -- PmxTailor用設定ファイル出力準備2 (%s)",
411411
"-- 身体剛体準備終了": "-- 身体剛体準備終了",
412-
"-- -- 身体剛体[%s]": "-- -- 身体剛体[%s]"
412+
"-- -- 身体剛体[%s]": "-- -- 身体剛体[%s]",
413+
"舌関連頂点が見つからなかったため、舌分離処理をスキップします": "舌関連頂点が見つからなかったため、舌分離処理をスキップします",
414+
"-- Aスタンス・親指調整終了": "-- Aスタンス・親指調整終了"
413415
}

src/locale/zh_CN/messages.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,5 +412,7 @@
412412
"-- PmxTailor用設定ファイル出力準備2": "-- 准备输出 PmxTailor 2 的配置文件",
413413
"-- -- PmxTailor用設定ファイル出力準備2 (%s)": "---- 准备输出 PmxTailor 2 的配置文件 (%s)",
414414
"-- 身体剛体準備終了": "--完成刚体刚体准备",
415-
"-- -- 身体剛体[%s]": "---- Body 刚体 [%s]"
415+
"-- -- 身体剛体[%s]": "---- Body 刚体 [%s]",
416+
"舌関連頂点が見つからなかったため、舌分離処理をスキップします": "未找到舌相关顶点,跳过舌分离处理",
417+
"-- Aスタンス・親指調整終了": "-- 完成了姿势/拇指调整"
416418
}

src/service/VroidExportService.py

Lines changed: 70 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def vroid2pmx(self):
136136
if not model:
137137
return False
138138

139-
model = self.transfer_astance(model)
139+
model = self.transfer_stance(model)
140140
if not model:
141141
return False
142142

@@ -788,7 +788,7 @@ def create_body_rigidbody(self, model: PmxModel):
788788

789789
return model
790790

791-
def transfer_astance(self, model: PmxModel):
791+
def transfer_stance(self, model: PmxModel):
792792
# 各頂点
793793
all_vertex_relative_poses = {}
794794
for vertex in model.vertex_dict.values():
@@ -851,22 +851,38 @@ def transfer_astance(self, model: PmxModel):
851851
trans_vs = MServiceUtils.calc_relative_position(model, bone_links, VmdMotion(), 0)
852852

853853
if "右" in ",".join(list(bone_links.all().keys())):
854-
astance_qq = MQuaternion.fromEulerAngles(0, 0, 35)
854+
arm_astance_qq = MQuaternion.fromEulerAngles(0, 0, 35)
855855
arm_bone_name = "右腕"
856+
thumb0_stance_qq = MQuaternion.fromEulerAngles(0, 8, 0)
857+
thumb0_bone_name = "右親指0"
858+
thumb1_stance_qq = MQuaternion.fromEulerAngles(0, 24, 0)
859+
thumb1_bone_name = "右親指1"
856860
elif "左" in ",".join(list(bone_links.all().keys())):
857-
astance_qq = MQuaternion.fromEulerAngles(0, 0, -35)
861+
arm_astance_qq = MQuaternion.fromEulerAngles(0, 0, -35)
858862
arm_bone_name = "左腕"
863+
thumb0_stance_qq = MQuaternion.fromEulerAngles(0, -8, 0)
864+
thumb0_bone_name = "左親指0"
865+
thumb1_stance_qq = MQuaternion.fromEulerAngles(0, -24, 0)
866+
thumb1_bone_name = "左親指1"
859867
else:
860-
astance_qq = MQuaternion.fromEulerAngles(0, 0, 0)
868+
arm_astance_qq = MQuaternion.fromEulerAngles(0, 0, 0)
861869
arm_bone_name = ""
870+
thumb0_bone_name = ""
871+
thumb1_bone_name = ""
862872

863873
mat = MMatrix4x4()
864874
mat.setToIdentity()
865875
for vi, (bone_name, trans_v) in enumerate(zip(bone_links.all().keys(), trans_vs)):
866876
mat.translate(trans_v)
867877
if bone_name == arm_bone_name:
868-
# 腕だけ回転させる
869-
mat.rotate(astance_qq)
878+
# 腕回転させる
879+
mat.rotate(arm_astance_qq)
880+
elif bone_name == thumb0_bone_name:
881+
# 親指0回転させる
882+
mat.rotate(thumb0_stance_qq)
883+
elif bone_name == thumb1_bone_name:
884+
# 親指1回転させる
885+
mat.rotate(thumb1_stance_qq)
870886

871887
if bone_name not in trans_bone_vecs:
872888
trans_bone_vecs[bone_name] = mat * MVector3D()
@@ -1005,7 +1021,7 @@ def transfer_astance(self, model: PmxModel):
10051021
model.vertex_dict[vertex_idx].position = vertex_vec
10061022
model.vertex_dict[vertex_idx].normal = vertex_normal.normalized()
10071023

1008-
logger.info("-- Aスタンス調整終了")
1024+
logger.info("-- Aスタンス・親指調整終了")
10091025

10101026
return model
10111027

@@ -1733,51 +1749,56 @@ def reconvert_bone(self, model: PmxModel):
17331749
tongue_poses.append(v.position.data())
17341750
v.deform = Bdef1(model.bones["舌1"].index)
17351751

1736-
# 舌ボーン位置配置
1737-
tongue1_pos = np.max(tongue_poses, axis=0)
1738-
model.bones["舌1"].position = MVector3D(0, tongue1_pos[1], tongue1_pos[2])
1739-
tongue4_pos = np.min(tongue_poses, axis=0)
1740-
model.bones["舌4"].position = MVector3D(0, tongue4_pos[1], tongue4_pos[2])
1741-
model.bones["舌2"].position = model.bones["舌1"].position + (
1742-
(model.bones["舌4"].position - model.bones["舌1"].position) * 0.4
1743-
)
1744-
model.bones["舌3"].position = model.bones["舌1"].position + (
1745-
(model.bones["舌4"].position - model.bones["舌1"].position) * 0.7
1746-
)
1747-
1748-
for from_bone_name, to_bone_name in [("舌1", "舌2"), ("舌2", "舌3"), ("舌3", "舌4")]:
1749-
# ローカル軸
1750-
model.bones[from_bone_name].local_x_vector = (
1751-
model.bones[to_bone_name].position - model.bones[from_bone_name].position
1752-
).normalized()
1753-
model.bones[from_bone_name].local_z_vector = MVector3D.crossProduct(
1754-
model.bones[from_bone_name].local_x_vector, MVector3D(0, -1, 0)
1755-
).normalized()
1756-
model.bones["舌4"].local_x_vector = model.bones["舌3"].local_x_vector.copy()
1757-
model.bones["舌4"].local_z_vector = model.bones["舌3"].local_z_vector.copy()
1752+
if tongue_poses and tongue_vertices and tongue_vidxs:
1753+
# 舌ボーン位置配置
1754+
tongue1_pos = np.max(tongue_poses, axis=0)
1755+
model.bones["舌1"].position = MVector3D(0, tongue1_pos[1], tongue1_pos[2])
1756+
tongue4_pos = np.min(tongue_poses, axis=0)
1757+
model.bones["舌4"].position = MVector3D(0, tongue4_pos[1], tongue4_pos[2])
1758+
model.bones["舌2"].position = model.bones["舌1"].position + (
1759+
(model.bones["舌4"].position - model.bones["舌1"].position) * 0.4
1760+
)
1761+
model.bones["舌3"].position = model.bones["舌1"].position + (
1762+
(model.bones["舌4"].position - model.bones["舌1"].position) * 0.7
1763+
)
17581764

1759-
for vertex in tongue_vertices:
17601765
for from_bone_name, to_bone_name in [("舌1", "舌2"), ("舌2", "舌3"), ("舌3", "舌4")]:
1761-
tongue_distance = model.bones[to_bone_name].position.z() - model.bones[from_bone_name].position.z()
1762-
vertex_distance = vertex.position.z() - model.bones[from_bone_name].position.z()
1763-
1764-
if np.sign(tongue_distance) == np.sign(vertex_distance):
1765-
# 範囲内である場合、ウェイト分布
1766-
vertex.deform = Bdef2(
1767-
model.bones[to_bone_name].index,
1768-
model.bones[from_bone_name].index,
1769-
vertex_distance / tongue_distance,
1766+
# ローカル軸
1767+
model.bones[from_bone_name].local_x_vector = (
1768+
model.bones[to_bone_name].position - model.bones[from_bone_name].position
1769+
).normalized()
1770+
model.bones[from_bone_name].local_z_vector = MVector3D.crossProduct(
1771+
model.bones[from_bone_name].local_x_vector, MVector3D(0, -1, 0)
1772+
).normalized()
1773+
model.bones["舌4"].local_x_vector = model.bones["舌3"].local_x_vector.copy()
1774+
model.bones["舌4"].local_z_vector = model.bones["舌3"].local_z_vector.copy()
1775+
1776+
for vertex in tongue_vertices:
1777+
for from_bone_name, to_bone_name in [("舌1", "舌2"), ("舌2", "舌3"), ("舌3", "舌4")]:
1778+
tongue_distance = (
1779+
model.bones[to_bone_name].position.z() - model.bones[from_bone_name].position.z()
17701780
)
1781+
vertex_distance = vertex.position.z() - model.bones[from_bone_name].position.z()
1782+
1783+
if np.sign(tongue_distance) == np.sign(vertex_distance):
1784+
# 範囲内である場合、ウェイト分布
1785+
vertex.deform = Bdef2(
1786+
model.bones[to_bone_name].index,
1787+
model.bones[from_bone_name].index,
1788+
vertex_distance / tongue_distance,
1789+
)
17711790

1772-
# 舌頂点モーフを削除
1773-
for morph in model.org_morphs.values():
1774-
if morph.morph_type == 1:
1775-
# 頂点モーフの場合
1776-
without_tongue_offsets = []
1777-
for offset in morph.offsets:
1778-
if offset.vertex_index not in tongue_vidxs:
1779-
without_tongue_offsets.append(offset)
1780-
morph.offsets = without_tongue_offsets
1791+
# 舌頂点モーフを削除
1792+
for morph in model.org_morphs.values():
1793+
if morph.morph_type == 1:
1794+
# 頂点モーフの場合
1795+
without_tongue_offsets = []
1796+
for offset in morph.offsets:
1797+
if offset.vertex_index not in tongue_vidxs:
1798+
without_tongue_offsets.append(offset)
1799+
morph.offsets = without_tongue_offsets
1800+
else:
1801+
logger.warning("舌関連頂点が見つからなかったため、舌分離処理をスキップします", decoration=MLogger.DECORATION_BOX)
17811802

17821803
logger.info("-- ボーンデータ調整終了")
17831804

vroid2pmx.spec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ exe = EXE(pyz,
2626
a.zipfiles,
2727
a.datas,
2828
[],
29-
name='Vroid2Pmx_2.01.00',
29+
name='Vroid2Pmx_2.01.01',
3030
debug=False,
3131
bootloader_ignore_signals=False,
3232
strip=False,

0 commit comments

Comments
 (0)