コード例 #1
0
        private void SetGhostFaceAtFace(WorldObject target, TileFace resultFace)
        {
            var bb    = target.ObjectType.TileData.GetBoundingBox();
            var range = (bb.Max - bb.Min) * 0.5f;


            Vector3 right;
            Vector3 normal;
            Vector3 up;

            normal = TileSnapInformationBuilder.getFaceNormal(resultFace);
            up     = TileSnapInformationBuilder.getFaceUp(resultFace);
            right  = Vector3.Cross(up, normal);
            range *= 2f;
            Vector3 dim        = new Vector3();
            var     ghostWidth = 0.01f;


            dim += normal * ghostWidth;
            dim += up * Vector3.Dot(up, range);
            dim += right * Vector3.Dot(right, range);

            dim.X = Math.Abs(dim.X);
            dim.Y = Math.Abs(dim.Y);
            dim.Z = Math.Abs(dim.Z);


            ghostFace.Dimensions  = dim;
            ghostFace.PivotPoint  = Vector3.One * 0.5f;
            ghostFace.WorldMatrix = Matrix.CreateTranslation(normal * (Math.Abs(Vector3.Dot(normal, range * 0.5f)) + 0.01f)) * target.WorldMatrix;
        }
コード例 #2
0
        private TileFace RaycastTileFace(IXNAGame _game, WorldObject target)
        {
            var bb    = target.ObjectType.TileData.GetBoundingBox();
            var range = (bb.Max - bb.Min) * 0.5f;

            Ray ray;
            var targetMatrix = Matrix.Invert(target.WorldMatrix);

            ray           = _game.GetWereldViewRay(_game.Mouse.CursorPositionVector);
            ray.Position  = Vector3.Transform(ray.Position, targetMatrix);
            ray.Direction = Vector3.TransformNormal(ray.Direction, targetMatrix);

            raycasterFace.Reset();
            Vector3 normal;
            Vector3 up;
            Vector3 right;


            for (int i = 0; i < 6; i++)
            {
                var face = (TileFace)(i + 1);
                normal = TileSnapInformationBuilder.getFaceNormal(face);
                up     = TileSnapInformationBuilder.getFaceUp(face);
                right  = Vector3.Cross(up, normal);
                var scaledNormal = normal * Math.Abs(Vector3.Dot(normal, range));
                var scaledUp     = up * Math.Abs(Vector3.Dot(up, range));
                var scaledRight  = right * Math.Abs(Vector3.Dot(right, range));
                var v1           = scaledNormal + scaledUp +
                                   scaledRight;
                var v2 = scaledNormal + scaledUp -
                         scaledRight;
                var v3 = scaledNormal - scaledUp +
                         scaledRight;
                var v4 = scaledNormal - scaledUp -
                         scaledRight;

                float?result;
                Functions.RayIntersectsSquare(ref ray, ref v1, ref v2, ref v3, ref v4, out result);
                raycasterFace.AddResult(result, face);
            }

            return(raycasterFace.ClosestObject);
        }