pyjallib 0.1.10__py3-none-any.whl → 0.1.12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyjallib/__init__.py +7 -7
- pyjallib/max/__init__.py +24 -25
- pyjallib/max/autoClavicle.py +39 -4
- pyjallib/max/bip.py +69 -2
- pyjallib/max/bone.py +37 -0
- pyjallib/max/boneChain.py +182 -0
- pyjallib/max/groinBone.py +65 -29
- pyjallib/max/hip.py +44 -7
- pyjallib/max/kneeBone.py +61 -26
- pyjallib/max/macro/jal_macro_bone.py +1 -1
- pyjallib/max/twistBone.py +59 -40
- pyjallib/max/volumeBone.py +77 -26
- pyjallib/naming.py +27 -2
- pyjallib/namingConfig.py +3 -2
- pyjallib/perforce.py +489 -9
- {pyjallib-0.1.10.dist-info → pyjallib-0.1.12.dist-info}/METADATA +1 -1
- {pyjallib-0.1.10.dist-info → pyjallib-0.1.12.dist-info}/RECORD +18 -21
- pyjallib/max/autoClavicleChain.py +0 -173
- pyjallib/max/groinBoneChain.py +0 -173
- pyjallib/max/twistBoneChain.py +0 -162
- pyjallib/max/volumeBoneChain.py +0 -363
- {pyjallib-0.1.10.dist-info → pyjallib-0.1.12.dist-info}/WHEEL +0 -0
pyjallib/max/volumeBoneChain.py
DELETED
@@ -1,363 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
|
4
|
-
"""
|
5
|
-
볼륨 뼈대 체인(Volume Bone Chain) 모듈 - 3ds Max 캐릭터 리깅을 위한 볼륨 본 시스템
|
6
|
-
|
7
|
-
이 모듈은 VolumeBone 클래스가 생성한 볼륨 본 세트를 관리하고 제어하는 기능을 제공합니다.
|
8
|
-
관절 회전 시 부피 감소를 방지하기 위한 보조 본 시스템으로, 특히 캐릭터 팔다리나
|
9
|
-
관절 부위의 자연스러운 움직임을 구현하는 데 유용합니다.
|
10
|
-
|
11
|
-
Examples:
|
12
|
-
# 기본 볼륨 체인 생성 예시
|
13
|
-
from pyjallib.max import VolumeBone, VolumeBoneChain
|
14
|
-
from pymxs import runtime as rt
|
15
|
-
|
16
|
-
# 캐릭터에서 팔꿈치 뼈대와 상위 부모 가져오기
|
17
|
-
elbow_bone = rt.getNodeByName("L_Elbow_Bone")
|
18
|
-
upper_arm = rt.getNodeByName("L_UpperArm_Bone")
|
19
|
-
|
20
|
-
# VolumeBone 클래스 인스턴스 생성
|
21
|
-
volume_bone = VolumeBone()
|
22
|
-
|
23
|
-
# 다양한 옵션으로 볼륨 뼈대 생성
|
24
|
-
volume_result = volume_bone.create_bones(
|
25
|
-
elbow_bone, # 관절 본
|
26
|
-
upper_arm, # 관절 부모
|
27
|
-
inRotScale=0.7, # 회전 영향도 (0.0 ~ 1.0)
|
28
|
-
inVolumeSize=10.0, # 볼륨 크기
|
29
|
-
inRotAxises=["X", "Z"], # 회전 감지 축 (여러 축 지정 가능)
|
30
|
-
inTransAxises=["PosY", "PosZ"], # 이동 방향 축
|
31
|
-
inTransScales=[1.0, 0.8] # 각 방향별 이동 스케일
|
32
|
-
)
|
33
|
-
|
34
|
-
# 생성된 뼈대로 VolumeBoneChain 인스턴스 생성
|
35
|
-
chain = VolumeBoneChain.from_volume_bone_result(volume_result)
|
36
|
-
|
37
|
-
# 체인 속성 및 관리 기능 사용
|
38
|
-
print(f"볼륨 크기: {chain.get_volume_size()}")
|
39
|
-
print(f"볼륨 본 개수: {len(chain.bones)}")
|
40
|
-
|
41
|
-
# 볼륨 속성 동적 업데이트
|
42
|
-
chain.update_volume_size(15.0) # 볼륨 크기 변경
|
43
|
-
chain.update_rot_scale(0.5) # 회전 영향도 변경
|
44
|
-
|
45
|
-
# 회전 축 업데이트
|
46
|
-
chain.update_rot_axises(["Y", "Z"])
|
47
|
-
|
48
|
-
# 이동 축 업데이트
|
49
|
-
chain.update_trans_axises(["PosX", "PosZ"])
|
50
|
-
|
51
|
-
# 이동 스케일 업데이트
|
52
|
-
chain.update_trans_scales([0.7, 1.2])
|
53
|
-
|
54
|
-
# 필요 없어지면 체인의 모든 뼈대 삭제
|
55
|
-
# chain.delete_all()
|
56
|
-
"""
|
57
|
-
|
58
|
-
import copy
|
59
|
-
|
60
|
-
from pymxs import runtime as rt
|
61
|
-
from pyjallib.max.header import get_pyjallibmaxheader
|
62
|
-
jal = get_pyjallibmaxheader()
|
63
|
-
|
64
|
-
class VolumeBoneChain:
|
65
|
-
"""
|
66
|
-
볼륨 본 체인 관리 클래스
|
67
|
-
|
68
|
-
VolumeBone 클래스로 생성된 볼륨 본들의 집합을 관리하는 클래스입니다.
|
69
|
-
볼륨 본의 크기 조절, 회전 및 이동 축 변경, 스케일 조정 등의 기능을 제공하며,
|
70
|
-
여러 개의 볼륨 본을 하나의 논리적 체인으로 관리합니다.
|
71
|
-
생성된 볼륨 본 체인은 캐릭터 관절의 자연스러운 변형을 위해 사용됩니다.
|
72
|
-
"""
|
73
|
-
|
74
|
-
def __init__(self, inResult):
|
75
|
-
"""
|
76
|
-
볼륨 본 체인 클래스 초기화
|
77
|
-
|
78
|
-
VolumeBone 클래스의 create_bones 메서드로부터 생성된 결과 딕셔너리를
|
79
|
-
받아 볼륨 본 체인을 구성합니다.
|
80
|
-
|
81
|
-
Args:
|
82
|
-
inResult: VolumeBone 클래스의 create_bones 메서드가 반환한 결과 딕셔너리
|
83
|
-
(루트 본, 회전 헬퍼, 회전 축, 이동 축, 볼륨 크기 등의 정보 포함)
|
84
|
-
"""
|
85
|
-
self.rootBone = inResult.get("RootBone", None)
|
86
|
-
self.rotHelper = inResult.get("RotHelper", None)
|
87
|
-
self.rotScale = inResult.get("RotScale", 0.0)
|
88
|
-
self.limb = inResult.get("Limb", None)
|
89
|
-
self.limbParent = inResult.get("LimbParent", None)
|
90
|
-
self.bones = inResult.get("Bones", [])
|
91
|
-
self.rotAxises = inResult.get("RotAxises", [])
|
92
|
-
self.transAxises = inResult.get("TransAxises", [])
|
93
|
-
self.transScales = inResult.get("TransScales", [])
|
94
|
-
self.volumeSize = inResult.get("VolumeSize", 0.0)
|
95
|
-
|
96
|
-
def get_volume_size(self):
|
97
|
-
"""
|
98
|
-
볼륨 뼈대의 크기 가져오기
|
99
|
-
|
100
|
-
볼륨 본 생성 시 설정된 크기 값을 반환합니다. 이 값은 관절의 볼륨감 정도를
|
101
|
-
결정합니다.
|
102
|
-
|
103
|
-
Returns:
|
104
|
-
float: 현재 설정된 볼륨 크기 값
|
105
|
-
"""
|
106
|
-
return self.volumeSize
|
107
|
-
|
108
|
-
def is_empty(self):
|
109
|
-
"""
|
110
|
-
체인이 비어있는지 확인
|
111
|
-
|
112
|
-
볼륨 본 체인에 본이 하나라도 존재하는지 확인합니다.
|
113
|
-
|
114
|
-
Returns:
|
115
|
-
bool: 체인이 비어있으면 True, 하나 이상의 본이 있으면 False
|
116
|
-
"""
|
117
|
-
return len(self.bones) == 0
|
118
|
-
|
119
|
-
def clear(self):
|
120
|
-
"""체인의 모든 뼈대 및 헬퍼 참조 제거"""
|
121
|
-
self.rootBone = None
|
122
|
-
self.rotHelper = None
|
123
|
-
self.rotScale = 0.0
|
124
|
-
self.limb = None
|
125
|
-
self.limbParent = None
|
126
|
-
self.bones = []
|
127
|
-
self.rotAxises = []
|
128
|
-
self.transAxises = []
|
129
|
-
self.transScales = []
|
130
|
-
self.volumeSize = 0.0
|
131
|
-
|
132
|
-
def delete_all(self):
|
133
|
-
"""
|
134
|
-
체인의 모든 뼈대와 헬퍼를 3ds Max 씬에서 삭제
|
135
|
-
|
136
|
-
Returns:
|
137
|
-
삭제 성공 여부 (boolean)
|
138
|
-
"""
|
139
|
-
if self.is_empty():
|
140
|
-
return False
|
141
|
-
|
142
|
-
try:
|
143
|
-
# 루트 본 삭제
|
144
|
-
if self.rootBone:
|
145
|
-
rt.delete(self.rootBone)
|
146
|
-
|
147
|
-
# 회전 헬퍼 삭제
|
148
|
-
if self.rotHelper:
|
149
|
-
rt.delete(self.rotHelper)
|
150
|
-
|
151
|
-
# 뼈대 삭제
|
152
|
-
for bone in self.bones:
|
153
|
-
rt.delete(bone)
|
154
|
-
|
155
|
-
self.rotAxises = []
|
156
|
-
self.transAxises = []
|
157
|
-
self.transScales = []
|
158
|
-
|
159
|
-
self.clear()
|
160
|
-
return True
|
161
|
-
except:
|
162
|
-
return False
|
163
|
-
|
164
|
-
def update_volume_size(self, inNewSize):
|
165
|
-
"""
|
166
|
-
볼륨 뼈대의 크기 업데이트
|
167
|
-
|
168
|
-
Args:
|
169
|
-
inNewSize: 새로운 볼륨 크기 값
|
170
|
-
|
171
|
-
Returns:
|
172
|
-
업데이트 성공 여부 (boolean)
|
173
|
-
"""
|
174
|
-
if self.is_empty() or self.limb is None:
|
175
|
-
return False
|
176
|
-
|
177
|
-
try:
|
178
|
-
# 필요한 값들 백업
|
179
|
-
limb = self.limb
|
180
|
-
limbParent = self.limbParent
|
181
|
-
rotScale = self.rotScale
|
182
|
-
rotAxises = copy.deepcopy(self.rotAxises)
|
183
|
-
transAxises = copy.deepcopy(self.transAxises)
|
184
|
-
transScales = copy.deepcopy(self.transScales)
|
185
|
-
|
186
|
-
self.delete_all()
|
187
|
-
# VolumeBone 클래스를 통해 새로운 볼륨 뼈대 생성
|
188
|
-
result = jal.volumeBone.create_bones(limb, limbParent, inVolumeSize=inNewSize,
|
189
|
-
inRotScale=rotScale, inRotAxises=rotAxises,
|
190
|
-
inTransAxises=transAxises, inTransScales=transScales)
|
191
|
-
|
192
|
-
# 속성들 한번에 업데이트
|
193
|
-
for key, value in result.items():
|
194
|
-
if hasattr(self, key):
|
195
|
-
setattr(self, key, value)
|
196
|
-
|
197
|
-
self.volumeSize = inNewSize
|
198
|
-
|
199
|
-
return True
|
200
|
-
except:
|
201
|
-
return False
|
202
|
-
|
203
|
-
def update_rot_axises(self, inNewRotAxises):
|
204
|
-
"""
|
205
|
-
볼륨 뼈대의 회전 축을 업데이트
|
206
|
-
|
207
|
-
Args:
|
208
|
-
inNewRotAxises: 새로운 회전 축 리스트
|
209
|
-
|
210
|
-
Returns:
|
211
|
-
업데이트 성공 여부 (boolean)
|
212
|
-
"""
|
213
|
-
if self.is_empty() or self.limb is None:
|
214
|
-
return False
|
215
|
-
|
216
|
-
try:
|
217
|
-
# 필요한 값들 백업
|
218
|
-
limb = self.limb
|
219
|
-
limbParent = self.limbParent
|
220
|
-
rotScale = self.rotScale
|
221
|
-
volumeSize = self.volumeSize
|
222
|
-
transAxises = copy.deepcopy(self.transAxises)
|
223
|
-
transScales = copy.deepcopy(self.transScales)
|
224
|
-
|
225
|
-
self.delete_all()
|
226
|
-
# VolumeBone 클래스를 통해 새로운 볼륨 뼈대 생성
|
227
|
-
result = jal.volumeBone.create_bones(limb, limbParent, inVolumeSize=volumeSize,
|
228
|
-
inRotScale=rotScale, inRotAxises=inNewRotAxises,
|
229
|
-
inTransAxises=transAxises, inTransScales=transScales)
|
230
|
-
|
231
|
-
# 속성들 한번에 업데이트
|
232
|
-
for key, value in result.items():
|
233
|
-
if hasattr(self, key):
|
234
|
-
setattr(self, key, value)
|
235
|
-
|
236
|
-
return True
|
237
|
-
except:
|
238
|
-
return False
|
239
|
-
|
240
|
-
def update_trans_axises(self, inNewTransAxises):
|
241
|
-
"""
|
242
|
-
볼륨 뼈대의 이동 축을 업데이트
|
243
|
-
|
244
|
-
Args:
|
245
|
-
inNewTransAxises: 새로운 이동 축 리스트
|
246
|
-
|
247
|
-
Returns:
|
248
|
-
업데이트 성공 여부 (boolean)
|
249
|
-
"""
|
250
|
-
if self.is_empty() or self.limb is None:
|
251
|
-
return False
|
252
|
-
|
253
|
-
try:
|
254
|
-
# 필요한 값들 백업
|
255
|
-
limb = self.limb
|
256
|
-
limbParent = self.limbParent
|
257
|
-
rotScale = self.rotScale
|
258
|
-
volumeSize = self.volumeSize
|
259
|
-
rotAxises = copy.deepcopy(self.rotAxises)
|
260
|
-
transScales = copy.deepcopy(self.transScales)
|
261
|
-
|
262
|
-
self.delete_all()
|
263
|
-
# VolumeBone 클래스를 통해 새로운 볼륨 뼈대 생성
|
264
|
-
result = jal.volumeBone.create_bones(limb, limbParent, inVolumeSize=volumeSize,
|
265
|
-
inRotScale=rotScale, inRotAxises=rotAxises,
|
266
|
-
inTransAxises=inNewTransAxises, inTransScales=transScales)
|
267
|
-
|
268
|
-
# 속성들 한번에 업데이트
|
269
|
-
for key, value in result.items():
|
270
|
-
if hasattr(self, key):
|
271
|
-
setattr(self, key, value)
|
272
|
-
|
273
|
-
return True
|
274
|
-
except:
|
275
|
-
return False
|
276
|
-
|
277
|
-
def update_trans_scales(self, inNewTransScales):
|
278
|
-
"""
|
279
|
-
볼륨 뼈대의 이동 스케일을 업데이트
|
280
|
-
|
281
|
-
Args:
|
282
|
-
inNewTransScales: 새로운 이동 스케일 리스트
|
283
|
-
|
284
|
-
Returns:
|
285
|
-
업데이트 성공 여부 (boolean)
|
286
|
-
"""
|
287
|
-
if self.is_empty() or self.limb is None:
|
288
|
-
return False
|
289
|
-
|
290
|
-
try:
|
291
|
-
# 필요한 값들 백업
|
292
|
-
limb = self.limb
|
293
|
-
limbParent = self.limbParent
|
294
|
-
rotScale = self.rotScale
|
295
|
-
volumeSize = self.volumeSize
|
296
|
-
rotAxises = copy.deepcopy(self.rotAxises)
|
297
|
-
transAxises = copy.deepcopy(self.transAxises)
|
298
|
-
|
299
|
-
self.delete_all()
|
300
|
-
# VolumeBone 클래스를 통해 새로운 볼륨 뼈대 생성
|
301
|
-
result = jal.volumeBone.create_bones(limb, limbParent, inVolumeSize=volumeSize,
|
302
|
-
inRotScale=rotScale, inRotAxises=rotAxises,
|
303
|
-
inTransAxises=transAxises, inTransScales=inNewTransScales)
|
304
|
-
|
305
|
-
# 속성들 한번에 업데이트
|
306
|
-
for key, value in result.items():
|
307
|
-
if hasattr(self, key):
|
308
|
-
setattr(self, key, value)
|
309
|
-
|
310
|
-
return True
|
311
|
-
except:
|
312
|
-
return False
|
313
|
-
|
314
|
-
def update_rot_scale(self, inNewRotScale):
|
315
|
-
"""
|
316
|
-
볼륨 뼈대의 회전 스케일을 업데이트
|
317
|
-
|
318
|
-
Args:
|
319
|
-
inNewRotScale: 새로운 회전 스케일 값
|
320
|
-
|
321
|
-
Returns:
|
322
|
-
업데이트 성공 여부 (boolean)
|
323
|
-
"""
|
324
|
-
if self.is_empty() or self.limb is None:
|
325
|
-
return False
|
326
|
-
|
327
|
-
try:
|
328
|
-
# 필요한 값들 백업
|
329
|
-
limb = self.limb
|
330
|
-
limbParent = self.limbParent
|
331
|
-
volumeSize = self.volumeSize
|
332
|
-
rotAxises = copy.deepcopy(self.rotAxises)
|
333
|
-
transAxises = copy.deepcopy(self.transAxises)
|
334
|
-
transScales = copy.deepcopy(self.transScales)
|
335
|
-
|
336
|
-
self.delete_all()
|
337
|
-
# VolumeBone 클래스를 통해 새로운 볼륨 뼈대 생성
|
338
|
-
result = jal.volumeBone.create_bones(limb, limbParent, inVolumeSize=volumeSize,
|
339
|
-
inRotScale=inNewRotScale, inRotAxises=rotAxises,
|
340
|
-
inTransAxises=transAxises, inTransScales=transScales)
|
341
|
-
|
342
|
-
# 속성들 한번에 업데이트
|
343
|
-
for key, value in result.items():
|
344
|
-
if hasattr(self, key):
|
345
|
-
setattr(self, key, value)
|
346
|
-
|
347
|
-
return True
|
348
|
-
except:
|
349
|
-
return False
|
350
|
-
|
351
|
-
@classmethod
|
352
|
-
def from_volume_bone_result(cls, inResult):
|
353
|
-
"""
|
354
|
-
VolumeBone 클래스의 결과로부터 VolumeBoneChain 인스턴스 생성
|
355
|
-
|
356
|
-
Args:
|
357
|
-
inResult: VolumeBone 클래스의 메서드가 반환한 결과 딕셔너리
|
358
|
-
|
359
|
-
Returns:
|
360
|
-
VolumeBoneChain 인스턴스
|
361
|
-
"""
|
362
|
-
chain = cls(inResult)
|
363
|
-
return chain
|
File without changes
|