示例#1
0
        public override void LoadContent(Microsoft.Xna.Framework.Content.ContentManager content)
        {
            base.LoadContent(content);

            BlockData.Initialize(Device, content);

            cam = new FirstPersonCamera(0.5f, 10);
            cam.Pos = new Vector3(3, 3, 13);


            map = new Map(Device);

            partition = new MapPartition(map);
            engine = new PhysicsEngine3D(partition);

            MeshBuilder mb = new MeshBuilder(Device);
            sphere = mb.CreateSphere(0.1f, 10, 10);
            marker = new MeshNode(sphere);

            placeType = 1;

            primBatch = new PrimitiveBatch(Device);


        }
示例#2
0
        public override void LoadContent(Microsoft.Xna.Framework.Content.ContentManager content)
        {
            base.LoadContent(content);

            map = new Map(Device, "startPosTest.txt");
            //        map = new Map();
            BlockData.Initialize(Device, content);
            primBatch = new PrimitiveBatch(Device);

            MeshBuilder mb = new MeshBuilder(Device);
            mb.Begin();

            //mb.AddCylinder(1, 1, 50);
            mb.AddSphere(1, 20, 20);
            testMesh = mb.End();

            mNode = new MeshNode(testMesh);
            mNode.SetPivot(new Vector3(0, -1f, 0));
            mNode.SetScl(new Vector3(1, 5, 1));
            MeshNode child = new MeshNode(testMesh);
            child.SetPos(new Vector3(0, 2, 0));
            MeshNode another = new MeshNode(testMesh);
            another.SetPos(new Vector3(0, 2, 0));

            //Mesh sphere = mb.CreateSphere(0.1f, 10, 10);
            //startMarker = new MeshNode(sphere);
            //startMarker.SetPos(map.StartPos);
            //child.AddChild(another);
            //mNode.AddChild(child);
        }
示例#3
0
        //A scenegraph is composed of SceneNodes
        public override void LoadContent(ContentManager content, GraphicsDevice g)
        {
            base.LoadContent(content, g);

            //Set up our camera and primitive renderer
            cam = new FirstPersonCamera(0.5f, 5f);        //0.5f is the turn speed for the camera, and 5f is the translational speed
            cam.Pos = new Vector3(3, 3, 13);              //Move our camera to the point (3, 3, 13)
            primBatch = new PrimitiveBatch(g);            //Initialize our PrimitiveBatch

            //Define the objects in our scene
            Mesh sphere, cylinder, box;                   //Define the meshes we will use for the robot arm
                                                          //A mesh holds a list of vertices, and a list of indices which represent triangles

            MeshNode arm, elbow, forearm, wrist, hand;    //Define all the parts of the robot arm we will use

            MeshBuilder mb = new MeshBuilder(g);          //MeshBuilder is a helper class for generating 3D geometry
                                                          //It has some built in functions to create primitives, as well as
                                                          //functions to create your own arbitrary meshes

            //Genererate our geometry
            //All geometry created is centered around the origin in its local coordinate system
            sphere = mb.CreateSphere(0.5f, 15, 15);       //Create a sphere mesh, with radius 0.5 and with 15 subdivisions
            cylinder = mb.CreateCylinder(0.3f, 2.0f, 15); //Create a cylinder with radius 0.3, a height of 2, and 15 subdivisions
            box = mb.CreateBox(0.8f, 1.4f, 0.1f);         //Create a box with width 0.8, height of 1.4, and depth of 0.1

            shoulder = new MeshNode(sphere);              //Assign the sphere mesh to our shoulder node

            arm = new MeshNode(cylinder);                 //Assign the cylinder mesh to our arm node
            arm.SetPos(new Vector3(0, -1, 0));            //Translate the arm down 1 on the y axis

            elbow = new MeshNode(sphere);                 //Assign a sphere to our elbow node
            elbow.SetPos(new Vector3(0, -2, 0));          //Translate the elbow down 2 on the y axis

            forearm = new MeshNode(cylinder);             //Assign a cylinder to our forearm node
            forearm.SetPos(new Vector3(0, -1, 0));        //Translate the forearm down 1 on the y axis

            wrist = new MeshNode(sphere);                 //Assign a sphere for the wrist node
            wrist.SetPos(new Vector3(0, -2, 0));          //Translate the wrist down 2 on the y axis

            hand = new MeshNode(box);                     //Assign the box to the hand node
            hand.SetPos(new Vector3(0, -0.7f, 0));        //Translate the hand down 0.7 (half the height of the box) on the y axis

            shoulder.AddChild(arm);                       //The shoulder is the root of this scene, in our case. It is the parent
            shoulder.AddChild(elbow);                     //of both the arm and the elbow

            elbow.AddChild(forearm);                      //The elbow is the parent of the forearm and wrist
            elbow.AddChild(wrist);

            wrist.AddChild(hand);                         //The wrist is the parent of the hand

            shoulder.SetPos(new Vector3(0, 5, 0));        //This call effectively translates the entire arm up 5 on the y axis
        }
        public override void LoadContent(ContentManager content, GraphicsDevice g)
        {
            base.LoadContent(content, g);

            //Set up our camera and primitive renderer
            cam = new ThirdPersonCamera(targetPos, 5.0f, 0.2f);

            primBatch = new PrimitiveBatch(g);            //Initialize our PrimitiveBatch
            MeshBuilder mb = new MeshBuilder(g);
            Mesh triangle;// = mb.CreateSphere(0.3f, 15, 15);
            mb.Begin();
             //       mb.AddTriangle(Vector3.Zero, new Vector3(1, 1, 0), new Vector3(1, 0, 0), true);
             //       mb.AddTriangle(Vector3.Zero, new Vector3(1, 1, 0), new Vector3(1, 0, 0), new Vector2(1, 1), new Vector2(0, 0), new Vector2(0, 1), true);
            mb.AddQuad(Vector3.Zero, new Vector3(1, 1, 0), new Vector3(2, 1, 0), new Vector3(1, 0, 0), true, new Vector2(0, 0), new Vector2(1, 1), new Vector2(2, 1), new Vector2(1, 0));
            triangle = mb.End();

            triangle.Texture = content.Load<Texture2D>("Cube");
            target = new MeshNode(triangle);
            target.SetPos(targetPos);
        }
示例#5
0
        public override void LoadContent(ContentManager content, GraphicsDevice g)
        {
            base.LoadContent(content, g);

            primBatch = new PrimitiveBatch(Device);
            cam = new FirstPersonCamera(0.5f, 10);
            cam.Pos = new Vector3(3, 3, 13);

            MeshBuilder mb = new MeshBuilder(Device);
            mb.Begin();
            mb.AddSphere(radius, 20, 20);
            Mesh sphereMesh = mb.End();

            sphere = new MeshNode(sphereMesh);
            sphere.SetPos(new Vector3(5, 5, 5));

            planes = new List<Plane>();
            planes.Add(new Plane(Vector3.Right, 0));
            planes.Add(new Plane(Vector3.Up, 0));
            planes.Add(new Plane(new Vector3(0, 0, 1), 0));
            planes.Add(new Plane(Vector3.Left, -10));
            planes.Add(new Plane(Vector3.Down, -10));
            planes.Add(new Plane(new Vector3(0, 0, -1), -10));
        }
示例#6
0
        private void updatePicking()
        {
            float closest = float.MaxValue;
            if (dragging || InputHandler.MouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Released)
            {
                return;
            }

            foreach (MeshNode mesh in pickableObjects)
            {
                if (camRay.Intersects(mesh.GetBounds()) != null)
                {
                    if (mesh.Equals(trigger))
                    {
                        //Check trigger triangles
                        foreach (Triangle tri in triggerTris)
                        {
                            Matrix meshInverseTransform = Matrix.Invert(mesh.GetAbsoluteTransform());
                            Vector3 transformedRayStart = Vector3.Transform(camRay.Position, meshInverseTransform);
                            Vector3 transformedRayDir = Vector3.TransformNormal(camRay.Direction, meshInverseTransform);
                            float dist = IntersectRayTriangle(transformedRayStart, transformedRayStart + (transformedRayDir * 1000f), tri.v1, tri.v2, tri.v3);
                            if (dist > 0 && dist < closest)
                            {
                                closest = dist;
                                selectedObject = trigger;
                            }
                        }
                    }
                    else if (mesh.Equals(handle))
                    {
                        //Check handle triangles
                        foreach (Triangle tri in handleTris)
                        {
                            Matrix meshInverseTransform = Matrix.Invert(mesh.GetAbsoluteTransform());
                            Vector3 transformedRayStart = Vector3.Transform(camRay.Position, meshInverseTransform);
                            Vector3 transformedRayDir = Vector3.TransformNormal(camRay.Direction, meshInverseTransform);
                            float dist = IntersectRayTriangle(transformedRayStart, transformedRayStart + (transformedRayDir * 100f), tri.v1, tri.v2, tri.v3);
                            if (dist > 0 && dist < closest)
                            {
                                closest = dist;
                                selectedObject = handle;
                            }
                        }
                    }
                    else if (mesh.Equals(body))
                    {
                        //Check body triangles
                        foreach (Triangle tri in bodyTris)
                        {
                            Matrix meshInverseTransform = Matrix.Invert(mesh.GetAbsoluteTransform());
                            Vector3 transformedRayStart = Vector3.Transform(camRay.Position, meshInverseTransform);
                            Vector3 transformedRayDir = Vector3.TransformNormal(camRay.Direction, meshInverseTransform);
                            float dist = IntersectRayTriangle(transformedRayStart, transformedRayStart + (transformedRayDir * 1000f), tri.v1, tri.v2, tri.v3);
                            if (dist > 0 && dist < closest)
                            {
                                closest = dist;
                                selectedObject = body;
                            }
                        }
                    }
                }
            }
        }
示例#7
0
        public override void Update(GameTime g)
        {
            cam.Update(g);

            float dt = (float)g.ElapsedGameTime.TotalSeconds;
            Vector2 mousePos = new Vector2(InputHandler.MouseState.X, InputHandler.MouseState.Y);
            camRay = GetRayFromScreen(new Vector2(Config.ScreenWidth / 2f, Config.ScreenHeight / 2f));

            updatePicking();

            if (InputHandler.LastMouseState.LeftButton == ButtonState.Pressed && InputHandler.MouseState.LeftButton == ButtonState.Pressed)
            {
                dragging = true;
            }

            if (InputHandler.LastMouseState.LeftButton == ButtonState.Pressed && InputHandler.MouseState.LeftButton == ButtonState.Released)
            {
                selectedObject = null;
                dragging = false;
            }

            if (dragging && selectedObject != null)
            {
                Vector3 gunDirection = Vector3.TransformNormal(new Vector3(0, 0, 1), body.GetAbsoluteTransform());

                if (trigger.Equals(selectedObject))
                {
                    Ray diffRay = GetRayFromScreen(mousePos + cam.MouseDelta);
                    Vector3 diffPoint = diffRay.Position + (diffRay.Direction * 10f);
                    Vector3 camPoint = camRay.Position + (camRay.Direction * 10f);
                    Vector3 diff = diffPoint - camPoint;
                    float amt = Vector3.Dot(diff, -gunDirection);
                    float triggerMax = 0.6f;
                    triggerRot += amt;
                    if (triggerRot >= triggerMax)
                    {
                        Console.WriteLine("BANG!");
                        fire.Play();
                        triggerRot = 0;
                        //dragging = false;
                        //5selectedObject = null;
                    }
                    triggerRot = MathHelper.Clamp(triggerRot, 0, triggerMax);

                    trigger.SetRotation(Quaternion.CreateFromAxisAngle(Vector3.Right, triggerRot));
                }
                else if (handle.Equals(selectedObject))
                {
                    Ray diffRay = GetRayFromScreen(mousePos + cam.MouseDelta);
                    Vector3 diffPoint = diffRay.Position + (diffRay.Direction * 10f);
                    Vector3 camPoint = camRay.Position + (camRay.Direction * 10f);
                    Vector3 diff = diffPoint - camPoint;
                    handle.SetPos(handle.GetPos() + new Vector3(0, 0, 1) * Vector3.Dot(new Vector3(0, 0, 1), diff));
                    float clampedZ = MathHelper.Clamp(handle.GetPos().Z, 0.0f, 0.477f);
                    Vector3 newPos = handle.GetPos();
                    newPos.Z = clampedZ;
                    handle.SetPos(newPos);
                }
                else if (body.Equals(selectedObject))
                {
                    Ray diffRay = GetRayFromScreen(mousePos + cam.MouseDelta);
                    Vector3 cross = Vector3.Cross(camRay.Direction*10, diffRay.Direction*10);
                    if (cross.Length() > 0)
                    {
                        Quaternion rotDiff = Quaternion.CreateFromAxisAngle(Vector3.Normalize(cross), -0.06f);
                        body.SetRotation(body.GetRotation() * rotDiff);
                    }
                }
            }
        }
示例#8
0
        public override void LoadContent(ContentManager content, GraphicsDevice g)
        {
            base.LoadContent(content, g);

            primBatch = new PrimitiveBatch(Device);
            cam = new FirstPersonCamera(0.5f, 10);
            //cam.Pos = new Vector3(3, 3, 13);

            Model bodyModel = content.Load<Model>("Models/Body");
            Model handleModel = content.Load<Model>("Models/Handle");
            Model triggerModel = content.Load<Model>("Models/Trigger");
            crosshair = content.Load<Texture2D>("Crosshair");
            fire = content.Load<SoundEffect>("fire_silenced");
            batch = new SpriteBatch(Device);

            Mesh bodyMesh = new Mesh();
            bodyMesh.Indices = bodyModel.Meshes[0].MeshParts[0].IndexBuffer;
            bodyMesh.Vertices = bodyModel.Meshes[0].MeshParts[0].VertexBuffer;
            body = new MeshNode(bodyMesh);

            Mesh handleMesh = new Mesh();
            handleMesh.Indices = handleModel.Meshes[0].MeshParts[0].IndexBuffer;
            handleMesh.Vertices = handleModel.Meshes[0].MeshParts[0].VertexBuffer;
            handle = new MeshNode(handleMesh);
            handle.SetPos(new Vector3(0, 0.13f, 0.477f));

            Mesh triggerMesh = new Mesh();
            triggerMesh.Indices = triggerModel.Meshes[0].MeshParts[0].IndexBuffer;
            triggerMesh.Vertices = triggerModel.Meshes[0].MeshParts[0].VertexBuffer;
            trigger = new MeshNode(triggerMesh);
            trigger.SetPos(new Vector3(0, 0.033f, -1.561f));

            body.AddChild(handle);
            body.AddChild(trigger);
            body.SetPos(new Vector3(0, 5, 0));

            pickableObjects = new List<MeshNode>();
            pickableObjects.Add(body);
            pickableObjects.Add(handle);
            pickableObjects.Add(trigger);

            //Extract triangles
            bodyTris = GetTriangles(bodyMesh);
            handleTris = GetTriangles(handleMesh);
            triggerTris = GetTriangles(triggerMesh);
        }