예제 #1
0
        public static Sphere CreateNormalTextured(GraphicsDevice device, int slices, int stacks)
        {
            var vpnt = new VertexPositionNormalTexture[(slices + 1) * (stacks + 1)];
            float phi, theta;
            float dphi = MathHelper.Pi / stacks;
            float dtheta = MathHelper.TwoPi / slices;
            float x, y, z, sc;
            int index = 0;
            for (int stack = 0; stack <= stacks; stack++)
            {
                phi = MathHelper.PiOver2 - stack * dphi;
                y = (float)Math.Sin(phi);
                sc = -(float)Math.Cos(phi);
                for (int slice = 0; slice <= slices; slice++)
                {
                    theta = slice * dtheta;
                    x = sc * (float)Math.Sin(theta);
                    z = sc * (float)Math.Cos(theta);
                    vpnt[index++] = new VertexPositionNormalTexture(new Vector3(x, y, z), new Vector3(x, y, z),
                        new Vector2((float)slice / (float)slices, (float)stack / (float)stacks));
                }
            }
            var indices = new ushort[slices * stacks * 6];
            index = 0;
            int k = slices + 1;
            for (int stack = 0; stack < stacks; stack++)
            {
                for (int slice = 0; slice < slices; slice++)
                {
                    indices[index++] = (ushort)((stack + 0) * k + slice);
                    indices[index++] = (ushort)((stack + 1) * k + slice);
                    indices[index++] = (ushort)((stack + 0) * k + slice + 1);
                    indices[index++] = (ushort)((stack + 0) * k + slice + 1);
                    indices[index++] = (ushort)((stack + 1) * k + slice);
                    indices[index++] = (ushort)((stack + 1) * k + slice + 1);
                }
            }

            var ret = new Sphere();
            ret.vertexBuffer = new VertexBuffer(device, VertexPositionNormalTexture.VertexDeclaration, vpnt.Length, BufferUsage.WriteOnly);
            ret.vertexBuffer.SetData(vpnt);
            ret.indexBuffer = new IndexBuffer(device, IndexElementSize.SixteenBits, indices.Length, BufferUsage.WriteOnly);
            ret.indexBuffer.SetData(indices);
            ret.effect = new BasicEffect(device);
            ret.effect.TextureEnabled = true;
            return ret;
        }
예제 #2
0
 public Sky(GraphicsDevice device, Texture2D tex)
 {
     model = Sphere.CreateNormalTextured(device, 20, 20);
     model.effect.Texture = tex;
 }