Пример #1
0
        /// <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;
        }
Пример #2
0
        /// <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;
        }
Пример #3
0
        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;
                }
            }
        }