Ejemplo n.º 1
0
 def Walk(self, dForward, dRight):
     ''' Specialized camera movement that moves it on the "horizontal" plane
     '''
     # need to update the camera transform before we access the frustum
     self._pushToCameraTransform()
     frustum = self._camera.frustum
     cam_up = frustum.ComputeUpVector().GetNormalized()
     cam_forward = frustum.ComputeViewDirection().GetNormalized()
     cam_right = Gf.Cross(cam_forward, cam_up)
     delta = dForward * cam_forward + dRight * cam_right
     self._center += delta
     self._cameraTransformDirty = True
     self.signalFrustumChanged.emit()
Ejemplo n.º 2
0
    def Truck(self, deltaRight, deltaUp):
        ''' Moves the camera by (deltaRight, deltaUp) in worldspace coordinates. 

        This is similar to a camera Truck/Pedestal.
        '''
        # need to update the camera transform before we access the frustum
        self._pushToCameraTransform()
        frustum = self._camera.frustum
        cam_up = frustum.ComputeUpVector()
        cam_right = Gf.Cross(frustum.ComputeViewDirection(), cam_up)
        self._center += (deltaRight * cam_right + deltaUp * cam_up)
        self._cameraTransformDirty = True
        self.signalFrustumChanged.emit()
Ejemplo n.º 3
0
    def MethodsTest(self, Vec):
        v1 = Vec()
        v2 = Vec()
        if isFloatingPoint(Vec):
            eps = getEps(Vec)

            # length
            SetVec(v1, [3, 1, 4, 1])
            l = Gf.GetLength(v1)
            l2 = v1.GetLength()
            self.assertTrue(Gf.IsClose(l, l2, eps), repr(l) + ' ' + repr(l2))
            self.assertTrue(Gf.IsClose(l, math.sqrt(Gf.Dot(v1, v1)), eps), \
                ' '.join([repr(x) for x in [l, v1, math.sqrt(Gf.Dot(v1, v1))]]))

            # Normalize...
            SetVec(v1, [3, 1, 4, 1])
            v2 = Vec(v1)
            v2.Normalize()
            nv = Gf.GetNormalized(v1)
            nv2 = v1.GetNormalized()
            nvcheck = v1 / Gf.GetLength(v1)
            self.assertTrue(Gf.IsClose(nv, nvcheck, eps))
            self.assertTrue(Gf.IsClose(nv2, nvcheck, eps))
            self.assertTrue(Gf.IsClose(v2, nvcheck, eps))

            SetVec(v1, [3, 1, 4, 1])
            nv = v1.GetNormalized()
            nvcheck = v1 / Gf.GetLength(v1)
            self.assertEqual(nv, nvcheck)

            SetVec(v1, [0, 0, 0, 0])
            v1.Normalize()
            self.assertTrue(checkVec(v1, [0, 0, 0, 0]))

            SetVec(v1, [2, 0, 0, 0])
            Gf.Normalize(v1)
            self.assertTrue(checkVec(v1, [1, 0, 0, 0]))

            # projection
            SetVec(v1, [3, 1, 4, 1])
            SetVec(v2, [5, 9, 2, 6])
            p1 = Gf.GetProjection(v1, v2)
            p2 = v1.GetProjection(v2)
            check = (v1 * v2) * v2
            self.assertTrue((p1 == check) and (p2 == check))

            # complement
            SetVec(v1, [3, 1, 4, 1])
            SetVec(v2, [5, 9, 2, 6])
            p1 = Gf.GetComplement(v1, v2)
            p2 = v1.GetComplement(v2)
            check = v1 - (v1 * v2) * v2
            self.assertTrue((p1 == check) and (p2 == check))

            # component-wise multiplication
            SetVec(v1, [3, 1, 4, 1])
            SetVec(v2, [5, 9, 2, 6])
            v3 = Gf.CompMult(v1, v2)
            self.assertTrue(checkVec(v3, [15, 9, 8, 6]))

            # component-wise division
            SetVec(v1, [3, 9, 18, 21])
            SetVec(v2, [3, 3, 9, 7])
            v3 = Gf.CompDiv(v1, v2)
            self.assertTrue(checkVec(v3, [1, 3, 2, 3]))

            # is close
            SetVec(v1, [3, 1, 4, 1])
            SetVec(v2, [5, 9, 2, 6])
            self.assertTrue(Gf.IsClose(v1, v1, 0.1))
            self.assertFalse(Gf.IsClose(v1, v2, 0.1))

            # static Axis methods
            for i in range(Vec.dimension):
                v1 = Vec.Axis(i)
                v2 = Vec()
                v2[i] = 1
                self.assertEqual(v1, v2)

            v1 = Vec.XAxis()
            self.assertTrue(checkVec(v1, [1, 0, 0, 0]))

            v1 = Vec.YAxis()
            self.assertTrue(checkVec(v1, [0, 1, 0, 0]))

            if Vec.dimension != 2:
                v1 = Vec.ZAxis()
                self.assertTrue(checkVec(v1, [0, 0, 1, 0]))

            if Vec.dimension == 3:
                # cross product
                SetVec(v1, [3, 1, 4, 0])
                SetVec(v2, [5, 9, 2, 0])
                v3 = Vec(Gf.Cross(v1, v2))
                v4 = v1 ^ v2
                v5 = v1.GetCross(v2)  # 2x compatibility
                check = Vec()
                SetVec(check, [1 * 2 - 4 * 9, 4 * 5 - 3 * 2, 3 * 9 - 1 * 5, 0])
                self.assertTrue(v3 == check and v4 == check and v5 == check)

                # orthogonalize basis

                # case 1: close to orthogonal, don't normalize
                SetVec(v1, [1, 0, 0.1])
                SetVec(v2, [0.1, 1, 0])
                SetVec(v3, [0, 0.1, 1])
                self.assertTrue(Vec.OrthogonalizeBasis(v1, v2, v3, False))
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v3, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v3), 0, eps))

                # case 2: far from orthogonal, normalize
                SetVec(v1, [1, 2, 3])
                SetVec(v2, [-1, 2, 3])
                SetVec(v3, [-1, -2, 3])
                self.assertTrue(Vec.OrthogonalizeBasis(v1, v2, v3, True))
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v3, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v3), 0, eps))
                self.assertTrue(Gf.IsClose(v1.GetLength(), 1, eps))
                self.assertTrue(Gf.IsClose(v2.GetLength(), 1, eps))
                self.assertTrue(Gf.IsClose(v3.GetLength(), 1, eps))

                # case 3: already orthogonal - shouldn't change, even with large
                # tolerance
                SetVec(v1, [1, 0, 0])
                SetVec(v2, [0, 1, 0])
                SetVec(v3, [0, 0, 1])
                vt1 = v1
                vt2 = v2
                vt3 = v3
                self.assertTrue(Vec.OrthogonalizeBasis(v1, v2, v3, False, 1.0))
                self.assertTrue(v1 == vt1)
                self.assertTrue(v2 == vt2)
                self.assertTrue(v3 == vt3)

                # case 4: co-linear input vectors - should do nothing
                SetVec(v1, [1, 0, 0])
                SetVec(v2, [1, 0, 0])
                SetVec(v3, [0, 0, 1])
                vt1 = v1
                vt2 = v2
                vt3 = v3
                self.assertFalse(Vec.OrthogonalizeBasis(
                    v1, v2, v3, False, 1.0))
                self.assertEqual(v1, vt1)
                self.assertEqual(v2, vt2)
                self.assertEqual(v3, vt3)

                # build orthonormal frame
                SetVec(v1, [1, 1, 1, 1])
                (v2, v3) = v1.BuildOrthonormalFrame()
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v3, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v3), 0, eps))

                SetVec(v1, [0, 0, 0, 0])
                (v2, v3) = v1.BuildOrthonormalFrame()
                self.assertTrue(Gf.IsClose(v2, Vec(), eps))
                self.assertTrue(Gf.IsClose(v3, Vec(), eps))

                SetVec(v1, [1, 0, 0, 0])
                (v2, v3) = v1.BuildOrthonormalFrame()
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v3, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v3), 0, eps))

                SetVec(v1, [1, 0, 0, 0])
                (v2, v3) = v1.BuildOrthonormalFrame()
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v3, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v3), 0, eps))

                SetVec(v1, [1, 0, 0, 0])
                (v2, v3) = v1.BuildOrthonormalFrame(2)
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v3, v1), 0, eps))
                self.assertTrue(Gf.IsClose(Gf.Dot(v2, v3), 0, eps))

                # test Slerp w/ orthogonal vectors
                SetVec(v1, [1, 0, 0])
                SetVec(v2, [0, 1, 0])

                v3 = Gf.Slerp(0, v1, v2)
                self.assertTrue(Gf.IsClose(v3, v1, eps))

                v3 = Gf.Slerp(1, v1, v2)
                self.assertTrue(Gf.IsClose(v3, v3, eps))

                v3 = Gf.Slerp(0.5, v1, v2)
                self.assertTrue(Gf.IsClose(v3, Vec(.7071, .7071, 0), eps))

                # test Slerp w/ nearly parallel vectors
                SetVec(v1, [1, 0, 0])
                SetVec(v2, [1.001, 0.0001, 0])
                v2.Normalize()

                v3 = Gf.Slerp(0, v1, v2)
                self.assertTrue(Gf.IsClose(v3, v1, eps))

                v3 = Gf.Slerp(1, v1, v2)
                self.assertTrue(Gf.IsClose(v3, v3, eps))

                v3 = Gf.Slerp(0.5, v1, v2)
                self.assertTrue(Gf.IsClose(v3, v1, eps), [v3, v1, eps])
                self.assertTrue(Gf.IsClose(v3, v2, eps))

                # test Slerp w/ opposing vectors
                SetVec(v1, [1, 0, 0])
                SetVec(v2, [-1, 0, 0])

                v3 = Gf.Slerp(0, v1, v2)
                self.assertTrue(Gf.IsClose(v3, v1, eps))
                v3 = Gf.Slerp(0.25, v1, v2)
                self.assertTrue(Gf.IsClose(v3, Vec(.70711, 0, -.70711), eps))
                v3 = Gf.Slerp(0.5, v1, v2)
                self.assertTrue(Gf.IsClose(v3, Vec(0, 0, -1), eps))
                v3 = Gf.Slerp(0.75, v1, v2)
                self.assertTrue(Gf.IsClose(v3, Vec(-.70711, 0, -.70711), eps))
                v3 = Gf.Slerp(1, v1, v2)
                self.assertTrue(Gf.IsClose(v3, v3, eps))

                # test Slerp w/ opposing vectors
                SetVec(v1, [0, 1, 0])
                SetVec(v2, [0, -1, 0])

                v3 = Gf.Slerp(0, v1, v2)
                self.assertTrue(Gf.IsClose(v3, v1, eps))
                v3 = Gf.Slerp(0.25, v1, v2)
                self.assertTrue(Gf.IsClose(v3, Vec(0, .70711, .70711), eps))
                v3 = Gf.Slerp(0.5, v1, v2)
                self.assertTrue(Gf.IsClose(v3, Vec(0, 0, 1), eps))
                v3 = Gf.Slerp(0.75, v1, v2)
                self.assertTrue(Gf.IsClose(v3, Vec(0, -.70711, .70711), eps))
                v3 = Gf.Slerp(1, v1, v2)
                self.assertTrue(Gf.IsClose(v3, v3, eps))