Exemplo n.º 1
0
    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