Esempio n. 1
0
        private void InitVertices(float radius, int rings, int sectors)
        {
            // ReSharper disable InconsistentNaming
            var R = 1.0f / (rings - 1);
            var S = 1.0f / (sectors - 1);

            mVertices = new SphereVertex[rings * sectors];
            var counter = 0;

            for (var r = 0; r < rings; ++r)
            {
                for (var s = 0; s < sectors; ++s)
                {
                    var z = (float)Math.Sin(-(Math.PI / 2.0f) + Math.PI * r * R);
                    var x = (float)Math.Cos((2 * Math.PI * s * S)) * (float)Math.Sin(Math.PI * r * R);
                    var y = (float)Math.Sin((2 * Math.PI * s * S)) * (float)Math.Sin(Math.PI * r * R);

                    mVertices[counter++] = new SphereVertex
                    {
                        Position = new Vector3(x * radius, y * radius, z * radius),
                        TexCoord = new Vector2(s * S, r * R)
                    };
                }
            }

            var indices = new uint[rings * sectors * 6];

            counter = 0;
            for (uint r = 0; r < rings - 1; ++r)
            {
                for (uint s = 0; s < sectors - 1; ++s)
                {
                    indices[counter++] = (uint)(r * sectors + s);
                    indices[counter++] = (uint)(r * sectors + s + 1);
                    indices[counter++] = (uint)((r + 1) * sectors + s + 1);
                    indices[counter++] = (uint)(r * sectors + s);
                    indices[counter++] = (uint)((r + 1) * sectors + s + 1);
                    indices[counter++] = (uint)((r + 1) * sectors + s);
                }
            }

            mMesh.IndexCount = indices.Length;
            mMesh.IndexBuffer.IndexFormat = SharpDX.DXGI.Format.R32_UInt;
            mMesh.IndexBuffer.UpdateData(indices);
        }
Esempio n. 2
0
        private void CreateSphere()
        {
            var stacks = 128;
            var slices = 128;
            var radius = 10;

            var vertices = new SphereVertex[(stacks - 1) * (slices + 1) + 2];
            var indices  = new ushort[(stacks - 2) * slices * 6 + slices * 6];

            float phiStep   = Numerics.PI / stacks;
            float thetaStep = Numerics.TwoPI / slices;

            // do not count the poles as rings
            int numRings = stacks - 1;

            // Compute vertices for each stack ring.
            int k = 0;
            var v = new SphereVertex();

            for (int i = 1; i <= numRings; ++i)
            {
                float phi = i * phiStep;

                // vertices of ring
                for (int j = 0; j <= slices; ++j)
                {
                    float theta = j * thetaStep;

                    // spherical to cartesian
                    v.Position = Vector3.SphericalToCartesian(phi, theta, radius);
                    v.Normal   = Vector3.Normalize(v.Position);
                    v.TexCoord = new Vector2(theta / (-2.0f * (float)Math.PI), phi / (float)Math.PI);

                    // partial derivative of P with respect to theta
                    v.Tangent = new Vector3(-radius * (float)Math.Sin(phi) * (float)Math.Sin(theta), 0, radius * (float)Math.Sin(phi) * (float)Math.Cos(theta));

                    vertices[k++] = v;
                }
            }
            // poles: note that there will be texture coordinate distortion
            vertices[vertices.Length - 2] = new SphereVertex(new Vector3(0.0f, -radius, 0.0f), new Vector3(0.0f, -1.0f, 0.0f), Vector3.Zero, new Vector2(0.0f, 1.0f));
            vertices[vertices.Length - 1] = new SphereVertex(new Vector3(0.0f, radius, 0.0f), new Vector3(0.0f, 1.0f, 0.0f), Vector3.Zero, new Vector2(0.0f, 0.0f));

            int northPoleIndex = vertices.Length - 1;
            int southPoleIndex = vertices.Length - 2;

            int numRingVertices = slices + 1;

            // Compute indices for inner stacks (not connected to poles).
            k = 0;
            for (int i = 0; i < stacks - 2; ++i)
            {
                for (int j = 0; j < slices; ++j)
                {
                    indices[k++] = (ushort)((i + 1) * numRingVertices + j);
                    indices[k++] = (ushort)(i * numRingVertices + j + 1);
                    indices[k++] = (ushort)(i * numRingVertices + j);

                    indices[k++] = (ushort)((i + 1) * numRingVertices + j + 1);
                    indices[k++] = (ushort)(i * numRingVertices + j + 1);
                    indices[k++] = (ushort)((i + 1) * numRingVertices + j);
                }
            }

            // Compute indices for top stack.  The top stack was written
            // first to the vertex buffer.
            for (int i = 0; i < slices; ++i)
            {
                indices[k++] = (ushort)i;
                indices[k++] = (ushort)(i + 1);
                indices[k++] = (ushort)northPoleIndex;
            }

            // Compute indices for bottom stack.  The bottom stack was written
            // last to the vertex buffer, so we need to offset to the index
            // of first vertex in the last ring.
            int baseIndex = (numRings - 1) * numRingVertices;

            for (int i = 0; i < slices; ++i)
            {
                indices[k++] = (ushort)(baseIndex + i + 1);
                indices[k++] = (ushort)(baseIndex + i);
                indices[k++] = (ushort)southPoleIndex;
            }

            vertexBuffer = device.CreateVertexBuffer(data: vertices);
            indexBuffer  = device.CreateIndexBuffer(data: indices);
        }
Esempio n. 3
0
        private void InitVertices(float radius, int rings, int sectors)
        {
            // ReSharper disable InconsistentNaming
            var R = 1.0f / (rings - 1);
            var S = 1.0f / (sectors - 1);

            mVertices = new SphereVertex[rings * sectors];
            var counter = 0;

            for(var r = 0; r < rings; ++r)
            {
                for(var s = 0; s < sectors; ++s)
                {
                    var z = (float) Math.Sin(-(Math.PI / 2.0f) + Math.PI * r * R);
                    var x = (float) Math.Cos((2 * Math.PI * s * S)) * (float) Math.Sin(Math.PI * r * R);
                    var y = (float) Math.Sin((2 * Math.PI * s * S)) * (float) Math.Sin(Math.PI * r * R);

                    mVertices[counter++] = new SphereVertex
                    {
                        Position = new Vector3(x * radius, y * radius, z * radius),
                        TexCoord = new Vector2(s * S, r * R)
                    };
                }
            }

            var indices = new uint[rings * sectors * 6];
            counter = 0;
            for (uint r = 0; r < rings - 1; ++r)
            {
                for (uint s = 0; s < sectors - 1; ++s)
                {
                    indices[counter++] = (uint)(r * sectors + s);
                    indices[counter++] = (uint) (r * sectors + s + 1);
                    indices[counter++] = (uint) ((r + 1) * sectors + s + 1);
                    indices[counter++] = (uint)(r * sectors + s);
                    indices[counter++] = (uint)((r + 1) * sectors + s + 1);
                    indices[counter++] = (uint)((r + 1) * sectors + s);
                }
            }

            mMesh.IndexCount = indices.Length;
            mMesh.IndexBuffer.IndexFormat = SharpDX.DXGI.Format.R32_UInt;
            mMesh.IndexBuffer.UpdateData(indices);
        }