def camera_delay(self, frame_no, frame_type, overwrite_frames, queue, prev): if prev['frame_no'] < 0: return overwrite_frames if 'c' in frame_type: maxrot = max([ 2 * math.acos( vmdutil.clamp( vmdutil.dot_v( motion.rotation, prev['frames'][vmdutil.b_to_str( motion.name)].rotation), -1, 1)) for motion in overwrite_frames if prev['frames'].get( vmdutil.b_to_str(motion.name)) is not None ]) omega = maxrot / (frame_no - prev['frame_no']) if omega > self.omega_limit: delay_to = math.ceil(maxrot / self.omega_limit) + frame_no while True: peek = queue.top() if (peek is None or delay_to <= peek.frame_no or 'o' in peek.type): break queue.pop() queue.push(MotionFrame(delay_to, 'r', -1, 'DELAY')) return [] else: return overwrite_frames else: return overwrite_frames
def remove_frames_by_name(frames, names, inverse=False): if names is None or len(names) == 0: if inverse: return [] else: return frames new_frames = list() for frame in frames: if not inverse and vmdutil.b_to_str(frame.name) not in names: new_frames.append(frame) elif inverse and vmdutil.b_to_str(frame.name) in names: new_frames.append(frame) return new_frames
def avoid_collision2(vmd): modify = { 1317: { '右ひじ': ((0.0, 0.0, 0.0), (0.5303139090538025, -0.5535628199577332, 0.12653225660324097, 0.6295421719551086)) }, 1322: { '右腕': ((0.0, 0.0, 0.0), (0.25283217430114746, 0.24778856337070465, -0.011708247475326061, 0.9351678490638733)), '右ひじ': ((0.0, 0.0, 0.0), (0.5284314155578613, -0.5674738883972168, 0.11908495426177979, 0.6201204061508179)) }, 1330: { 'センター': ((1.5169070959091187, -0.11587631702423096, 3.358367443084717), (0.0, -0.0, -0.0, 1.0)), '右腕': ((0.0, 0.0, 0.0), (0.20906804502010345, 0.13286317884922028, 0.27482205629348755, 0.9290382266044617)), '右ひじ': ((0.0, 0.0, 0.0), (0.6034250259399414, -0.5745618939399719, -0.04226955026388168, 0.5513404607772827)) }, 1333: { '右ひじ': ((0.0, 0.0, 0.0), (0.6193941831588745, -0.5532808899879456, -0.14503660798072815, 0.5377723574638367)) }, 1339: { 'センター': ((2.3029496669769287, 0.0, 1.9691747426986694), (0.0, -0.0, -0.0, 1.0)), '右腕': ((0.0, 0.0, 0.0), (0.18227244913578033, 0.19123366475105286, 0.2656165361404419, 0.9271727800369263)), '右ひじ': ((0.0, 0.0, 0.0), (0.574394702911377, -0.5680624842643738, -0.36492064595222473, 0.4628258943557739)) }, 1342: { '右ひじ': ((0.0, 0.0, 0.0), (0.574394702911377, -0.5680624842643738, -0.36492064595222473, 0.4628258943557739)) }, 1346: { 'センター': ((3.0592546463012695, 0.0, 0.2976529598236084), (0.0, -0.0, -0.0, 1.0)), '右腕': ((0.0, 0.0, 0.0), (0.1709841787815094, 0.2831650674343109, 0.12234087288379669, 0.9357418417930603)), '右ひじ': ((0.0, 0.0, 0.0), (0.6452091336250305, -0.5575323700904846, -0.011836055666208267, 0.5222232341766357)) } } bone_frames = vmd.get_frames('bones') for i, frame in enumerate(bone_frames): bone_name = vmdutil.b_to_str(frame.name) if frame.frame in modify: if bone_name in modify[frame.frame]: pos, rot = modify[frame.frame][bone_name] bone_frames[i] = frame._replace(position=pos, rotation=rot) return
def translate_bone(motion_def, instruction): if len(instruction) < 4: return motion_def else: bone_name = vmdutil.b_to_str(motion_def.name) if bone_name in TRANSLATE_BONES: position = motion_def.position delta = instruction[3:6] r = vmdutil.add_v(position, delta) motion_def = motion_def._replace(position=tuple(r)) return motion_def
def あplusぺろっ(morphs): frame_dict = vmdutil.frames_to_dict(morphs) name_dict = vmdutil.make_name_dict(frame_dict, True) pelo = name_dict['ぺろっ'] pelo_keys = [frame.frame for frame in pelo] for i, frame in enumerate(morphs): if vmdutil.b_to_str(frame.name) == 'あ': pelo_weight = get_morph_weight(frame.frame, pelo, pelo_keys) if frame.weight + pelo_weight > 0.9: d = 0.9 - pelo_weight if d < 0: d = 0 morphs[i] = frame._replace(weight=d) return morphs
def compare_bone(frame_a, frame_b): name = vmdutil.b_to_str(frame_a.name) if '捩' not in name: # position, rotation, interpolation # do b_to_str() if compare name interpolation_a = reformat_bone_interpolation( frame_a.interpolation) interpolation_b = reformat_bone_interpolation( frame_b.interpolation) return (frame_a.position == frame_b.position and frame_a.rotation == frame_b.rotation and interpolation_a == interpolation_b) else: return compare_screw_bone(frame_a, frame_b)
def avoid_collision1(vmd): center = vmdutil.str_to_b('センター') right_arm = vmdutil.str_to_b('右腕') right_elb = vmdutil.str_to_b('右ひじ') #1032 追加 c_1032 = vmddef.BONE_SAMPLE._replace(frame=1032, name=center, position=(2.141899824142456, -0.4837593138217926, 3.3104584217071533)) ra_1032 = vmddef.BONE_SAMPLE._replace( frame=1032, name=right_arm, rotation=(0.17264382541179657, 0.13622286915779114, 0.361983984708786, 0.905872106552124)) re_1032 = vmddef.BONE_SAMPLE._replace( frame=1032, name=right_elb, rotation=(0.635169506072998, -0.47617700695991516, -0.3107016980648041, 0.5227601528167725)) # 1036 センター削除 # 1036 入れ替え ra_1036_rot = (0.17034076154232025, 0.14684468507766724, 0.3597466051578522, 0.905540406703949) re_1036_rot = (0.6970929503440857, -0.4250965118408203, -0.27151989936828613, 0.5095357894897461) bone_frames = vmd.get_frames('bones') new_frames = [] for frame in bone_frames: if frame.frame != 1036: new_frames.append(frame) else: bone_name = vmdutil.b_to_str(frame.name) if bone_name == 'センター': continue elif bone_name == '右腕': new_frames.append(frame._replace(rotation=ra_1036_rot)) elif bone_name == '右ひじ': new_frames.append(frame._replace(rotation=re_1036_rot)) else: new_frames.append(frame) new_frames.append(c_1032) new_frames.append(ra_1032) new_frames.append(re_1032) vmd.set_frames('bones', new_frames) return
def あplusあ2plusぺろっ(morphs): frame_dict = vmdutil.frames_to_dict(morphs) name_dict = vmdutil.make_name_dict(frame_dict, True) a = name_dict['あ'] a_keys = [frame.frame for frame in a] pelo = name_dict['ぺろっ'] pelo_keys = [frame.frame for frame in pelo] for i, frame in enumerate(morphs): if vmdutil.b_to_str(frame.name) == 'あ2': a_weight = get_morph_weight(frame.frame, a, a_keys) pelo_weight = get_morph_weight(frame.frame, pelo, pelo_keys) plus = a_weight + pelo_weight #if plus > 1: # pass if frame.weight + plus > 0.8: d = 0.8 - plus if d < 0: d = 0 morphs[i] = frame._replace(weight=d) return morphs
def にやり2(morphs): for i, frame in enumerate(morphs): if vmdutil.b_to_str(frame.name) == 'にやり2': morphs[i] = frame._replace(name=vmdutil.str_to_b('にやり')) return morphs
def look_at(self): if self.use_vmd_interpolation: return self.look_at_npath() self.load() queue = PriorityQueue() self.setup_watcher(queue) self.setup_target(queue) self.add_frames(queue) new_frames = list() prev_overwrites = {'frame_no': -1, 'frames': []} o_frame_pattern = re.compile('^o*$') vmd_blend = self.need_vmd_blend() while True: motion_frame = queue.pop() if motion_frame is None: break frame_no = motion_frame.frame_no frame_type = motion_frame.type while queue.top() is not None and queue.top().frame_no == frame_no: dummy = queue.pop() frame_type += dummy.type if not self.frame_ranges.is_in_range(frame_no): new_frames.extend( self.copy_vmd_of_overwrite_bones(frame_no, frame_type)) continue if (not vmd_blend and not self.vmd_lerp and not self.use_vmd_interpolation and o_frame_pattern.match(frame_type)): continue target_pos = self.get_target_pos(frame_no) next_frame = queue.top() if next_frame is not None: next_frame_no = next_frame.frame_no next_center_transform = ( self.get_watcher_center_transform(next_frame_no)) # TODO reuse next_target_pos = self.get_target_pos(next_frame_no) else: next_frame_no = None next_center_transform = None next_target_pos = None overwrite_frames = self.make_look_at_frames( frame_type, frame_no, target_pos, next_frame_no, next_center_transform, next_target_pos) if len(overwrite_frames) == 0: continue if 'CAMERA' == self.target_mode and self.omega_limit > 0: overwrite_frames = self.camera_delay(frame_no, frame_type, overwrite_frames, queue, prev_overwrites) if len(overwrite_frames) > 0: prev_overwrites['frame_no'] = frame_no prev_overwrites['frames'] = { vmdutil.b_to_str(frame.name): frame for frame in overwrite_frames } new_frames.extend(overwrite_frames) self.watcher_transform.delete(frame_no) if 'MODEL' == self.target_mode: self.target_transform.delete(frame_no) return new_frames
def look_at_npath(self): self.load() queue = PriorityQueue() self.setup_watcher(queue) self.setup_target(queue) self.add_frames(queue) new_frames = dict() bone_defs = self.watcher_transform.bone_defs queue_backup = queue.queue if self.ignore_zone2 is not None: queue_backup = self.check_ignore_frames(queue) for bone_index in self.overwrite_indexes: bone_name = bone_defs[bone_index].name_jp queue.queue = queue_backup[:] new_frames[bone_index] = list() is_leaf = bone_index in self.watcher_transform.leaf_indexes prev_overwrites = {'frame_no': -1, 'frames': []} while True: motion_frame = queue.pop() if motion_frame is None: break frame_no = motion_frame.frame_no frame_type = motion_frame.type while (queue.top() is not None and queue.top().frame_no == frame_no): dummy = queue.pop() frame_type += dummy.type if not self.frame_ranges.is_in_range(frame_no): new_frames[bone_index].extend( self.copy_vmd_of_overwrite_bones( frame_no, frame_type, bone_name)) continue if (not is_leaf and self.watcher_transform.get_vmd_frame( frame_no, bone_name) is None): continue target_pos = self.get_target_pos(frame_no) next_frame = queue.top() if next_frame is not None: next_frame_no = next_frame.frame_no next_center_transform = ( self.get_watcher_center_transform(next_frame_no)) # TODO reuse next_target_pos = self.get_target_pos(next_frame_no) else: next_frame_no = None next_center_transform = None next_target_pos = None overwrite_frames = self.make_look_at_frames( frame_type, frame_no, target_pos, next_frame_no, next_center_transform, next_target_pos, bone_index) if len(overwrite_frames) <= 0: continue if (is_leaf and 'CAMERA' == self.target_mode and self.omega_limit > 0): overwrite_frames = self.camera_delay( frame_no, frame_type, overwrite_frames, queue, prev_overwrites) if len(overwrite_frames) > 0: prev_overwrites['frame_no'] = frame_no prev_overwrites['frames'] = { vmdutil.b_to_str(frame.name): frame for frame in overwrite_frames } new_frames[bone_index].extend(overwrite_frames) self.watcher_transform.replace_vmd_frames(new_frames[bone_index]) return [f for inner_list in new_frames.values() for f in inner_list]
def find_frame(bone_name): for index, frame in enumerate(overwrite_frames): if vmdutil.b_to_str(frame.name) == bone_name: return overwrite_frames.pop(index)
if '__main__' == __name__: parser = make_argument_parser() args = parser.parse_args() if args.pmx is not None: pmx = pmxutil.Pmxio() pmx.load(args.pmx) vmd = vmdutil.Vmdio() vmd.load(args.vmd) bone_motions = vmd.get_frames('bones') morph_motions = vmd.get_frames('morphs') print('========') print(vmdutil.b_to_str(vmd.header.model_name)) print('========') for motion_type in ['bones', 'morphs']: if args.pmx is not None: pmx_dict = pmxutil.make_index_dict(pmx.get_elements(motion_type)) else: pmx_dict = None vmd_dict = vmdutil.make_name_dict( vmdutil.frames_to_dict(vmd.get_frames(motion_type)), True) not_used_keys = set( vmdutil.enum_unnecessary_keys(vmd_dict, motion_type, "greedy")) all_keys = set(vmd_dict.keys()) for key in sorted(all_keys - not_used_keys): if pmx_dict is None:
def print_file_info(args, vmd_a, vmd_b): print('--- {}: {}'.format(args.vmd_a, vmdutil.b_to_str(vmd_a.header.model_name))) print('+++ {}: {}'.format(args.vmd_b, vmdutil.b_to_str(vmd_b.header.model_name)))