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