private void UpdateCameraDirection(Point mousePos) { if (!IsMouseCaptured || lastPoint.Equals(mousePos)) { return; } var deltaX = (float)(mousePos.X - lastPoint.X) * (float)SpeedMultipler * 2; var deltaY = (float)(mousePos.Y - lastPoint.Y) * (float)SpeedMultipler * 2; var upAnchor = Viewport.ModelUpDirection.ToNumericsVector3(); var upVector = Numerics.Vector3.Normalize(Viewport.Camera.UpDirection.ToNumericsVector3()); var forwardVector = Numerics.Vector3.Normalize(Viewport.Camera.LookDirection.ToNumericsVector3()); var rightVector = Numerics.Vector3.Normalize(Numerics.Vector3.Cross(forwardVector, upVector)); var yaw = Numerics.Matrix4x4.CreateFromAxisAngle(upAnchor, -deltaX); forwardVector = Numerics.Vector3.TransformNormal(forwardVector, yaw); rightVector = Numerics.Vector3.TransformNormal(rightVector, yaw); var pitch = Numerics.Matrix4x4.CreateFromAxisAngle(rightVector, -deltaY); forwardVector = Numerics.Vector3.TransformNormal(forwardVector, pitch); upVector = Numerics.Vector3.Normalize(Numerics.Vector3.Cross(rightVector, forwardVector)); Viewport.Camera.LookDirection = new Media3D.Vector3D(forwardVector.X, forwardVector.Y, forwardVector.Z); Viewport.Camera.UpDirection = new Media3D.Vector3D(upVector.X, upVector.Y, upVector.Z); Yaw = Math.Atan2(forwardVector.X, forwardVector.Y); Pitch = Math.Asin(-forwardVector.Z); NativeMethods.SetCursorPos((int)lastPoint.X, (int)lastPoint.Y); }
private void Timer_Tick(object sender, EventArgs e) { var cursorPos = new System.Drawing.Point(); NativeMethods.GetCursorPos(out cursorPos); UpdateCameraPosition(); UpdateCameraDirection(new Point(cursorPos.X, cursorPos.Y)); }
private static bool CheckKeyState(Keys keys) { return((NativeMethods.GetAsyncKeyState((int)keys) & 32768) != 0); }