Пример #1
0
    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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
 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)
Пример #7
0
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
Пример #8
0
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
Пример #9
0
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
Пример #10
0
    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
Пример #11
0
    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]
Пример #12
0
 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)
Пример #13
0

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:
Пример #14
0
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)))