def test_LTC(t, fps=30): l1 = KBB_util.LTC(t) l2 = KBB_util.LTC(t) l1.drop_frame_flag = True l2.drop_frame_flag = False print t print l1, l1.frame_number(fps), l1.drop_frame_flag print l2, l2.frame_number(fps), l2.drop_frame_flag print
def animateCam(kb_node, kbb_file, frame_rate=30, start_from=None, total_frames=None): if frame_rate == 24: mc.currentUnit(time="film") elif frame_rate == 25: mc.currentUnit(time="pal") elif frame_rate == 30: mc.currentUnit(time="ntsc") else: print "Warning, unsupported frame_rate", frame_rate if total_frames == -1: total_frames = None start_ltc = KBB_util.LTC() if start_from is not None: start_ltc = KBB_util.LTC(start_from) print "STARTING FROM:", start_ltc, start_from if ROOT_DIR is not None: kbb_file = os.path.join(ROOT_DIR, kbb_file) try: kbb = KBB.KBB_factory(kbb_file) except IOError: print "ERROR, couldn't open file '%s'" % kbb_file return print kbb ##############kbb.set_index(0) first_tc_idx = 0 while kbb.read_next(): if kbb.packet.header.msg_class == KBB_types.CLASS_DATA: if kbb.packet.ltc_frame.hours != 0 or kbb.packet.ltc_frame.minutes != 0 or kbb.packet.ltc_frame.seconds != 0 or kbb.packet.ltc_frame.frames != 0: break first_tc_idx += 1 print "First TC index:", first_tc_idx, kbb.packet.ltc_frame skip_item = None ypr = [] skipping = True start_frame = kbb.packet.ltc_frame.frame_number(frame_rate) frame_count = 0 first_frame = None while kbb.read_next(): if KBB_util.LTC_LT(kbb.packet.ltc_frame, start_ltc): continue if first_frame is None: first_frame = kbb.packet.ltc_frame.frame_number(frame_rate) skipping = False #print kbb.header.msg_num, kbb.ltc_frame, frame, frames if kbb.packet.ltc_frame.frames != skip_item: if frame_count % 100 == 0: print kbb.packet.msg_num, kbb.packet.ltc_frame, frame_count skip_item = kbb.packet.ltc_frame.frames frame = kbb.packet.ltc_frame.frame_number( frame_rate) - first_frame + 1 mc.setKeyframe(kb_node, attribute="tc_h", time=frame, value=kbb.packet.ltc_frame.hours) mc.setKeyframe(kb_node, attribute="tc_m", time=frame, value=kbb.packet.ltc_frame.minutes) mc.setKeyframe(kb_node, attribute="tc_s", time=frame, value=kbb.packet.ltc_frame.seconds) mc.setKeyframe(kb_node, attribute="tc_f", time=frame, value=kbb.packet.ltc_frame.frames) mc.setKeyframe(kb_node, attribute="msg_num", time=frame, value=kbb.packet.msg_num) for i in range(len(ypr)): sub_frame = float(i + 1) / (float(len(ypr))) + (frame - 1) #print "\t", kbb.header.msg_num, kbb.ltc_frame, frame, sub_frame if is_sane(ypr[i].yaw): mc.setKeyframe(kb_node, attribute="ry", time=sub_frame, value=-ypr[i].yaw) if is_sane(ypr[i].pitch): mc.setKeyframe(kb_node, attribute="rx", time=sub_frame, value=ypr[i].pitch) if is_sane(ypr[i].roll): mc.setKeyframe(kb_node, attribute="rz", time=sub_frame, value=180.0 - ypr[i].roll) ypr = [] frame_count += 1 if total_frames is not None: if frame_count > total_frames: break else: ypr.append(kbb.packet.vnav) end_frame = kbb.packet.ltc_frame.frame_number(frame_rate) # get rid of the full-path using mc.ls() mc.filterCurve("%s_rotateY" % mc.ls(kb_node)[0]) mc.filterCurve("%s_rotateX" % mc.ls(kb_node)[0]) mc.filterCurve("%s_rotateZ" % mc.ls(kb_node)[0]) mc.keyTangent("%s_rotateY" % mc.ls(kb_node)[0], outTangentType="linear") mc.keyTangent("%s_rotateX" % mc.ls(kb_node)[0], outTangentType="linear") mc.keyTangent("%s_rotateZ" % mc.ls(kb_node)[0], outTangentType="linear") mc.playbackOptions(minTime=0, maxTime=(end_frame - first_frame + 1))