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