class VmdBoneFrame(): def __init__(self, fno=0): self.name = '' self.bname = '' self.fno = fno self.position = MVector3D() self.rotation = MQuaternion() self.org_position = MVector3D() self.org_rotation = MQuaternion() self.interpolation = [20, 20, 0, 0, 20, 20, 20, 20, 107, 107, 107, 107, 107, 107, 107, 107, 20, 20, 20, 20, 20, 20, 20, 107, 107, 107, 107, 107, 107, 107, 107, 0, 20, 20, 20, 20, 20, 20, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 20, 20, 20, 20, 20, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0] # noqa self.org_interpolation = [20, 20, 0, 0, 20, 20, 20, 20, 107, 107, 107, 107, 107, 107, 107, 107, 20, 20, 20, 20, 20, 20, 20, 107, 107, 107, 107, 107, 107, 107, 107, 0, 20, 20, 20, 20, 20, 20, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 20, 20, 20, 20, 20, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0] # noqa # 登録対象であるか否か self.key = False # VMD読み込み処理で読み込んだキーか self.read = False # 接触回避の方向 self.avoidance = "" def set_name(self, name): self.name = name self.bname = '' if not name else name.encode('cp932').decode('shift_jis').encode('shift_jis')[:15].ljust(15, b'\x00') def copy(self): bf = VmdBoneFrame(self.fno) bf.name = self.name bf.bname = self.bname bf.position = self.position.copy() bf.rotation = self.rotation.copy() bf.org_position = self.org_position.copy() bf.org_rotation = self.org_rotation.copy() bf.interpolation = cPickle.loads(cPickle.dumps(self.interpolation, -1)) bf.key = self.key bf.read = self.read return bf def __str__(self): return "<VmdBoneFrame name:{0}, fno:{1}, position:{2}, rotation:{3}, euler:{4}, key:{5}, read:{6}, interpolation: {7}>".format( \ self.name, self.fno, self.position, self.rotation, self.rotation.toEulerAngles4MMD(), self.key, self.read, self.interpolation) def write(self, fout): if not self.bname: self.bname = self.name.encode('cp932').decode('shift_jis').encode('shift_jis')[:15].ljust(15, b'\x00') # 15文字制限 fout.write(self.bname) fout.write(struct.pack('<L', int(self.fno))) fout.write(struct.pack('<f', float(self.position.x()))) fout.write(struct.pack('<f', float(self.position.y()))) fout.write(struct.pack('<f', float(self.position.z()))) v = self.rotation.normalized().toVector4D() fout.write(struct.pack('<f', float(v.x()))) fout.write(struct.pack('<f', float(v.y()))) fout.write(struct.pack('<f', float(v.z()))) fout.write(struct.pack('<f', float(v.w()))) fout.write(bytearray([int(min(127, max(0, x))) for x in self.interpolation]))
def calc_direction_qq(model: PmxModel, links: BoneLinks, motion: VmdMotion, fno: int, limit_links=None): add_qs = calc_relative_rotation(model, links, motion, fno, limit_links) total_qq = MQuaternion() for qq in add_qs: total_qq *= qq return total_qq.normalized()