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); }
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)))); }
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)); }