def tool_move(self, event): if self._handle < 0: return # Nearest point on line A to line B: # N = (Da x Db) x Db # t = ((Pb - Pa) . N) / (Da . N) # A == bone # B == event # event axis (Db) is normalized, so t in units of |Da| pos, axis = self.get_world_bone_axis(self._bones[self._handle]) eventpos = Vector(event.posRaw[0], event.posRaw[1], event.posRaw[2]) eventaxis = Vector(event.axis[0], event.axis[1], event.axis[2]) N = Vector.cross(Vector.cross(axis, eventaxis), eventaxis) DaN = Vector.dot(axis, N) Pba = eventpos - pos self._frac = Vector.dot(Pba, N) / DaN if self._frac < 0: self._frac = 0 if self._frac > 1: self._frac = 1 self._dirty = True self._moved = True
def tool_down(self, event): self._handle = -1 self._moved = False self._bones = self.get_current_bones() for i in range(len(self._bones)): bone = self._bones[i] pos, axis = self.get_world_bone_axis(bone) pos += axis * self._frac scale = Vector.magnitude(axis) / 10.0 eventpos = Vector(event.posRaw[0], event.posRaw[1], event.posRaw[2]) eventaxis = Vector(event.axis[0], event.axis[1], event.axis[2]) # te.axis is normalized # d = |(x2-x1) x (x1-x0)| / |x2-x1| # x2 = eventpos, x1 = eventpos + axis, x0 = pos # (x2-x1) = -axis # (x1-x0) = eventpos+axis - pos # |(x2-x1)| = 1 # (-axis) x (eventpos-pos+axis) d = Vector.magnitude(Vector.cross(-eventaxis, eventpos - pos + eventaxis)) if d <= scale: self._handle = i return 1 return 0