Esempio n. 1
0
        public void DrawLine(Vector3 start, Vector3 end, Color color, float width = 0.025f)
        {
            Vector3 dir = end - start;

            dir.Z = 0;

            Vector3 extDir1;
            Vector3 extDir2;

            if (dir.LengthSquared() > 0.0001f)
            {
                dir.Normalize();

                extDir1.X = -dir.Y;
                extDir1.Y = dir.X;
                extDir1.Z = 0;

                extDir2 = Vector3.Cross(dir, extDir1);
            }
            else
            {
                extDir1 = Vector3.UnitX;
                extDir2 = Vector3.UnitY;
            }

            _vertexBuffer[0] = new ColoredVertex(start + extDir1 * (width / 2), color);
            _vertexBuffer[1] = new ColoredVertex(start - extDir1 * (width / 2), color);
            _vertexBuffer[2] = new ColoredVertex(end + extDir1 * (width / 2), color);
            _vertexBuffer[3] = new ColoredVertex(end - extDir1 * (width / 2), color);

            _vertexBuffer[4] = new ColoredVertex(start + extDir2 * (width / 2), color);
            _vertexBuffer[5] = new ColoredVertex(start - extDir2 * (width / 2), color);
            _vertexBuffer[6] = new ColoredVertex(end + extDir2 * (width / 2), color);
            _vertexBuffer[7] = new ColoredVertex(end - extDir2 * (width / 2), color);

            _indexBuffer[0] = 0;
            _indexBuffer[1] = 1;
            _indexBuffer[2] = 2;

            _indexBuffer[3] = 1;
            _indexBuffer[4] = 2;
            _indexBuffer[5] = 3;

            _indexBuffer[6] = 4;
            _indexBuffer[7] = 5;
            _indexBuffer[8] = 6;

            _indexBuffer[9]  = 5;
            _indexBuffer[10] = 6;
            _indexBuffer[11] = 7;

            SetDeclaration();
            Device.DrawIndexedUserPrimitives(PrimitiveType.TriangleList, 0, 8, 4, _indexBuffer,
                                             Format.Index32, _vertexBuffer, ColoredVertex.Stride);
        }
Esempio n. 2
0
        private static SlimDX.Matrix RotationVectors(SlimDX.Vector3 v1, SlimDX.Vector3 v2)
        {
            v1.Normalize();
            v2.Normalize();
            Vector3 cp = Vector3.Cross(v1, v2);

            if (cp.Length() < 1e-3)
            {
                Vector3[] orts = { new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1) };
                foreach (Vector3 ort in orts)
                {
                    cp = Vector3.Cross(v1, ort);
                    if (cp.Length() > 1e-1)
                    {
                        break;
                    }
                }
            }
            cp.Normalize();
            return(Matrix.RotationAxis(cp, (float)Math.Acos(Vector3.Dot(v1, v2))));
        }
Esempio n. 3
0
        public static Mesh CreateSpring(float springR, float springLength,
                                        SlimDX.Vector3 springDirection, int springDetalization,
                                        int loopCount, float wireR, int wireDetalization)
        {
            if (springDetalization < 3 || wireDetalization < 3)
            {
                throw new ApplicationException("Too low detalization level");
            }

            if (loopCount == 1)
            {
                throw new ApplicationException("Cannot create spring without loops");
            }

            float                 h        = (float)(springLength / (2 * Math.PI * loopCount));
            List <Vertex>         vertices = new List <Vertex>();
            List <IndexedPolygon> indices  = new List <IndexedPolygon>();

            int[] prevStep = null;
            int[] curStep  = null;

            for (int i = 0; i < loopCount; i++)
            {
                for (int j = 0; j < springDetalization; j++)
                {
                    float alpha = (float)(2 * Math.PI * j / ((double)springDetalization - 1));
                    float x     = springR * (float)Math.Cos(alpha);
                    float y     = springR * (float)Math.Sin(alpha);
                    float z     = (float)(h * (alpha + 2 * Math.PI * i));

                    SlimDX.Vector3 v1 = new Vector3(0, 0, wireR);
                    SlimDX.Vector3 v2 = new Vector3(x, y, 0);
                    v2.Normalize();
                    v2 = v2 * wireR;

                    curStep = new int[wireDetalization];
                    for (int t = 0; t < wireDetalization; t++)
                    {
                        float          beta = (float)(2 * Math.PI * t / (double)wireDetalization - 1);
                        SlimDX.Vector3 v    = v1 * (float)Math.Sin(beta) + v2 * (float)Math.Cos(beta);
                        SlimDX.Vector3 nv   = v;
                        nv.Normalize();
                        curStep[t] = vertices.Count;
                        vertices.Add(new Vertex(x + v.X, y + v.Y, z + v.Z, nv.X, nv.Y, nv.Z));
                    }

                    if (prevStep != null)
                    {
                        for (int t = 0; t < wireDetalization; t++)
                        {
                            int tNext = (t + 1) % wireDetalization;
                            indices.Add(new IndexedPolygon((UInt16)prevStep[t], (UInt16)curStep[t], (UInt16)prevStep[tNext]));
                            indices.Add(new IndexedPolygon((UInt16)prevStep[tNext], (UInt16)curStep[t], (UInt16)curStep[tNext]));
                        }
                    }
                    prevStep = curStep;
                }
            }

            SlimDX.Matrix mat = RotationVectors(springDirection, new Vector3(0, 0, 1));
            foreach (var v in vertices)
            {
                v.Transform(mat);
            }

            return(new Mesh(vertices, indices));
        }