private void _primaryGrid_MouseMove(object sender, MouseEventArgs e) { Point newMousePosition = e.GetPosition(_viewport3D1); if (e.LeftButton == MouseButtonState.Pressed) { if (!_primaryGrid.IsMouseCaptured) { _primaryGrid.CaptureMouse(); } double deltaX = ModelViewerHelper.ToRad(newMousePosition.X - _oldPosition.X); _angleXRad -= deltaX; double deltaY = newMousePosition.Y - _oldPosition.Y; _angleYDegree += deltaY; UpdateCamera(); } else if (e.RightButton == MouseButtonState.Pressed) { if (!_primaryGrid.IsMouseCaptured) { _primaryGrid.CaptureMouse(); } double deltaX = newMousePosition.X - _oldPosition.X; double deltaZ = newMousePosition.Y - _oldPosition.Y; double distX = _distance * 0.0013 * deltaX; double distZ = _distance * 0.0013 * deltaZ; _lookAt.X += -distX *Math.Cos(_angleXRad) - distZ * Math.Sin(_angleXRad); _lookAt.Z += distX * Math.Sin(_angleXRad) - distZ * Math.Cos(_angleXRad); UpdateCamera(); } _oldPosition = newMousePosition; }
public void UpdateCamera() { Dispatcher.Invoke(new Action(delegate { _angleYDegree = _angleYDegree > 89 ? 89 : _angleYDegree; _angleYDegree = _angleYDegree < -89 ? -89 : _angleYDegree; double subDistance = _distance * Math.Cos(ModelViewerHelper.ToRad(_angleYDegree)); _cameraPosition.Y = _distance * Math.Sin(ModelViewerHelper.ToRad(_angleYDegree)); _cameraPosition.X = subDistance * Math.Sin(_angleXRad); _cameraPosition.Z = subDistance * Math.Cos(_angleXRad); _cameraPosition += _lookAt; _primaryCamera.Position = new Point3D(_cameraPosition.X, _cameraPosition.Y, _cameraPosition.Z); _primaryCamera.LookDirection = _lookAt - _cameraPosition; if (_modelLight.Content is DirectionalLight) { ((DirectionalLight)_modelLight.Content).Direction = _lookAt - _cameraPosition; } })); }