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()
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()
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))