/// <summary> /// Synchronizes the camera to the controller's current state</summary> /// <param name="camera">Camera</param> protected override void ControllerToCamera(Camera camera) { Vec3F lookAt = Camera.LookAt; Vec3F up = Camera.Up; if (camera.ViewType == ViewTypes.Perspective) { QuatF rotation = m_rotation * m_currentRotation; rotation = rotation.Inverse; Matrix4F transform = new Matrix4F(rotation); lookAt = new Vec3F(0, 0, -1); up = new Vec3F(0, 1, 0); transform.Transform(ref lookAt); transform.Transform(ref up); } float eyeOffset = m_distanceFromLookAt; float lookAtOffset = 0; if (m_distanceFromLookAt < m_dollyThreshold) // do we need to start dollying? { eyeOffset = m_distanceFromLookAt; lookAtOffset = m_distanceFromLookAt - m_dollyThreshold; } Camera.Set( m_lookAtPoint - (eyeOffset * lookAt), // eye m_lookAtPoint - (lookAtOffset * lookAt), // lookAt up); // up base.ControllerToCamera(camera); }
private void TestToStringWithCulture(CultureInfo culture) { CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = culture; try { string listSeparator = culture.TextInfo.ListSeparator; string decimalSeparator = culture.NumberFormat.NumberDecimalSeparator; var o = new QuatF(1.1f, 2.2f, 3.3f, 4.4f); string s = o.ToString(null, null); TestToStringResults(o, s, listSeparator, decimalSeparator); string s2 = o.ToString(); Assert.AreEqual(s, s2); s = o.ToString("G", culture); TestToStringResults(o, s, listSeparator, decimalSeparator); s = o.ToString("R", culture); TestToStringResults(o, s, listSeparator, decimalSeparator); } finally { Thread.CurrentThread.CurrentCulture = originalCulture; } }
private void TestToStringResults(QuatF o, string s, string listSeparator, string decimalSeparator) { string[] results = s.Split(new[] { listSeparator }, StringSplitOptions.RemoveEmptyEntries); Assert.AreEqual(results.Length, 4); foreach (string oneFloatString in results) Assert.True(oneFloatString.Contains(decimalSeparator)); Assert.AreEqual(float.Parse(results[0]), o.X); Assert.AreEqual(float.Parse(results[1]), o.Y); Assert.AreEqual(float.Parse(results[2]), o.Z); Assert.AreEqual(float.Parse(results[3]), o.W); }
/// <summary> /// Handles mouse-up events</summary> /// <param name="sender">Control that raised original event</param> /// <param name="e">Event args</param> /// <returns>true, if controller handled the event</returns> public override bool MouseUp(object sender, MouseEventArgs e) { if (m_dragging) { m_dragging = false; m_rotation = QuatF.Normalize(m_rotation * m_currentRotation); m_currentRotation = QuatF.Identity; return(true); } return(base.MouseUp(sender, e)); }
private void TestToStringResults(QuatF o, string s, string listSeparator, string decimalSeparator) { string[] results = s.Split(new[] { listSeparator }, StringSplitOptions.RemoveEmptyEntries); Assert.AreEqual(results.Length, 4); foreach (string oneFloatString in results) { Assert.True(oneFloatString.Contains(decimalSeparator)); } Assert.AreEqual(float.Parse(results[0]), o.X); Assert.AreEqual(float.Parse(results[1]), o.Y); Assert.AreEqual(float.Parse(results[2]), o.Z); Assert.AreEqual(float.Parse(results[3]), o.W); }
private void Track(Point current) { if (current.X < 0 || current.X > m_width) { return; } if (current.Y < 0 || current.Y > m_height) { return; } Vec3F currentPoint = ProjectToArcball(current); Vec3F i = Vec3F.Cross(currentPoint, m_firstPoint); float r = Vec3F.Dot(m_firstPoint, currentPoint); m_currentRotation = new QuatF(i.X, i.Y, i.Z, r); }
private void Track(Point current) { if (current.X < 0 || current.X > m_width) return; if (current.Y < 0 || current.Y > m_height) return; Vec3F currentPoint = ProjectToArcball(current); Vec3F i = Vec3F.Cross(currentPoint, m_firstPoint); float r = Vec3F.Dot(m_firstPoint, currentPoint); m_currentRotation = new QuatF(i.X, i.Y, i.Z, r); }
/// <summary> /// Handles mouse-up events</summary> /// <param name="sender">Control that raised original event</param> /// <param name="e">Event args</param> /// <returns>true, if controller handled the event</returns> public override bool MouseUp(object sender, MouseEventArgs e) { if (m_dragging) { m_dragging = false; m_rotation = QuatF.Normalize(m_rotation * m_currentRotation); m_currentRotation = QuatF.Identity; return true; } return base.MouseUp(sender, e); }