/// <summary> /// Calculate a ray between the camer and the selected point /// </summary> private void CalculateRay() { // Get the current touch location currentLocation = touchPanelState.First(); // Apply the near point: nearPoint.X = currentLocation.Position.X; nearPoint.Y = currentLocation.Position.Y; nearPoint.Z = 0f; // And the far point farPoint.X = currentLocation.Position.X; farPoint.Y = currentLocation.Position.Y; farPoint.Z = 1f; // Unproject both to get the 2d point in a 3d screen projections. nearPoint = Camera.Unproject(ref nearPoint); farPoint = Camera.Unproject(ref farPoint); // Now, we have a 3d point. We calculate the point direction direction = farPoint - nearPoint; // And normalized it. direction.Normalize(); // Set the ray to the cached variable ray.Direction = direction; ray.Position = nearPoint; }
/// <summary> /// Calculate a ray between the camer and the selected point /// </summary> private void CalculateRay() { // Get the current touch location currentLocation = touchPanelState.First(); //Labels.Add("MouseX", currentLocation.Position.X.ToString()); //Labels.Add("MouseY", currentLocation.Position.Y.ToString()); // Apply the near point: nearPoint = Vector3.Zero; farPoint = Vector3.Zero; nearPoint.X = currentLocation.Position.X; nearPoint.Y = currentLocation.Position.Y; nearPoint.Z = 0f; // And the far point farPoint.X = currentLocation.Position.X; farPoint.Y = currentLocation.Position.Y; farPoint.Z = 1f; //Labels.Add("Nearpoint", nearPoint.ToString()); //Labels.Add("Farpoint", farPoint.ToString()); Matrix world = Matrix.CreateTranslation(0, 0, 0); // Unproject both to get the 2d point in a 3d screen projections. nearPoint = Camera.Unproject(ref nearPoint); farPoint = Camera.Unproject(ref farPoint); // Now, we have a 3d point. We calculate the point direction direction = farPoint - nearPoint; // And normalized it. direction.Normalize(); // Set the ray to the cached variable ray.Direction = direction; ray.Position = nearPoint; this.line2.StartPoint = nearPoint; this.line2.EndPoint = farPoint; }
private void HandleInput(float amount) { input = WaveServices.Input; isMouseConnected = input.MouseState.IsConnected; isTouchPanelConnected = input.MouseState.IsConnected; if (isMouseConnected) { isTouchPanelConnected = false; } if (input.KeyboardState.IsConnected) { keyboardState = input.KeyboardState; if (keyboardState.W == ButtonState.Pressed) { // Manual inline: position += speed * forward; position.X = position.X + (amount * speed * forward.X); position.Y = position.Y + (amount * speed * forward.Y); position.Z = position.Z + (amount * speed * forward.Z); UpdateCameraPosition(); } else if (keyboardState.S == ButtonState.Pressed) { // Manual inline: position -= speed * forward; position.X = position.X - (amount * speed * forward.X); position.Y = position.Y - (amount * speed * forward.Y); position.Z = position.Z - (amount * speed * forward.Z); UpdateCameraPosition(); } if (keyboardState.A == ButtonState.Pressed) { // Manual inline: position -= speed * right; position.X = position.X - (amount * speed * right.X); position.Y = position.Y - (amount * speed * right.Y); position.Z = position.Z - (amount * speed * right.Z); UpdateCameraPosition(); } else if (keyboardState.D == ButtonState.Pressed) { // Manual inline: position += speed * right; position.X = position.X + (amount * speed * right.X); position.Y = position.Y + (amount * speed * right.Y); position.Z = position.Z + (amount * speed * right.Z); UpdateCameraPosition(); } } if (isTouchPanelConnected || isMouseConnected) { if (isTouchPanelConnected) { currentTouchPanelState = input.TouchPanelState; } if (isMouseConnected) { currentMouseState = input.MouseState; } if ((isTouchPanelConnected && currentTouchPanelState.Count == 1) || (isMouseConnected && currentMouseState.RightButton == ButtonState.Pressed)) { if (isTouchPanelConnected && currentTouchPanelState.Count == 1) { currentTouchLocation = currentTouchPanelState.First(); } if ((isTouchPanelConnected && currentTouchLocation.State == TouchLocationState.Pressed) || (isMouseConnected && currentMouseState.RightButton == ButtonState.Pressed)) { if (isDragging == false) { isDragging = true; } else { if (currentTouchPanelState.IsConnected) { xDifference = (currentTouchLocation.Position.X - lastTouchLocation.Position.X); yDifference = (currentTouchLocation.Position.Y - lastTouchLocation.Position.Y); } if (isMouseConnected) { xDifference = (currentMouseState.X - lastMouseState.X); yDifference = (currentMouseState.Y - lastMouseState.Y); } yaw = yaw - (xDifference * amount * rotationSpeed); pitch = pitch - (yDifference * amount * rotationSpeed); // Manual inline: forwardNormalizedVector = cameraRotation.Forward; forwardNormalizedVector.X = cameraMatrixRotation.Forward.X; forwardNormalizedVector.Y = cameraMatrixRotation.Forward.Y; forwardNormalizedVector.Z = cameraMatrixRotation.Forward.Z; forwardNormalizedVector.Normalize(); // Manual inline: rightNormalizedVector = cameraRotation.Right; rightNormalizedVector.X = cameraMatrixRotation.Right.X; rightNormalizedVector.Y = cameraMatrixRotation.Right.Y; rightNormalizedVector.Z = cameraMatrixRotation.Right.Z; rightNormalizedVector.Normalize(); // Manual inline: upNormalizedVector = cameraMatrixRotation.Up; upNormalizedVector.X = cameraMatrixRotation.Up.X; upNormalizedVector.Y = cameraMatrixRotation.Up.Y; upNormalizedVector.Z = cameraMatrixRotation.Up.Z; upNormalizedVector.Normalize(); Matrix.CreateFromAxisAngle(ref rightNormalizedVector, pitch, out tempRotationMatrix); Matrix.Multiply(ref cameraMatrixRotation, ref tempRotationMatrix, out cameraMatrixRotation); Matrix.CreateFromAxisAngle(ref upNormalizedVector, yaw, out tempRotationMatrix); Matrix.Multiply(ref cameraMatrixRotation, ref tempRotationMatrix, out cameraMatrixRotation); Matrix.CreateFromAxisAngle(ref forwardNormalizedVector, 0f, out tempRotationMatrix); Matrix.Multiply(ref cameraMatrixRotation, ref tempRotationMatrix, out cameraMatrixRotation); // Original code /* * cameraMatrixRotation.Forward.Normalize(); * cameraMatrixRotation.Right.Normalize(); * cameraMatrixRotation.Up.Normalize(); * * cameraMatrixRotation *= Matrix.CreateFromAxisAngle(cameraMatrixRotation.Right, pitch); * cameraMatrixRotation *= Matrix.CreateFromAxisAngle(cameraMatrixRotation.Up, yaw); * cameraMatrixRotation *= Matrix.CreateFromAxisAngle(cameraMatrixRotation.Forward, 0f); */ yaw = 0.0f; pitch = 0.0f; // Manual inline: forward = cameraRotation.Forward; forward.X = cameraMatrixRotation.Forward.X; forward.Y = cameraMatrixRotation.Forward.Y; forward.Z = cameraMatrixRotation.Forward.Z; //// Manual inline: right = cameraRotation.Right; right.X = cameraMatrixRotation.Right.X; right.Y = cameraMatrixRotation.Right.Y; right.Z = cameraMatrixRotation.Right.Z; UpdateLookAt(); //Restore the current matrix rotation cameraMatrixRotation = Matrix.Invert(Matrix.CreateLookAt(camera.Position, camera.LookAt, camera.UpVector)); } } lastTouchLocation = currentTouchLocation; lastMouseState = currentMouseState; } else { isDragging = false; } } }