[3D]绘制线

数据实体:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Drawing;
 6 using SlimDX;
 7 using RGeos.SlimScene.Core;
 8 
 9 namespace RGeos.Framework.OTL.Geometries
10 {
11 
12     /// <summary>
13     /// LineString.
14     /// </summary>
15     public class LineString
16     {
17         public Point3d[] Coordinates = null;
18         public Color Color = Color.Yellow;
19         public float LineWidth = 1.0f;
20         public bool Visible = true;
21         public bool Remove = false;
22         public RenderableObject ParentRenderable = null;
23 
24         public BoundingBox GetBoundingBox()
25         {
26             if (Coordinates == null || Coordinates.Length == 0)
27                 return new BoundingBox();
28 
29             double minX = Coordinates[0].X;
30             double maxX = Coordinates[0].X;
31             double minY = Coordinates[0].Y;
32             double maxY = Coordinates[0].Y;
33             double minZ = Coordinates[0].Z;
34             double maxZ = Coordinates[0].Z;
35 
36             for (int i = 1; i < Coordinates.Length; i++)
37             {
38                 if (Coordinates[i].X < minX)
39                     minX = Coordinates[i].X;
40                 if (Coordinates[i].X > maxX)
41                     maxX = Coordinates[i].X;
42 
43                 if (Coordinates[i].Y < minY)
44                     minY = Coordinates[i].Y;
45                 if (Coordinates[i].Y > maxY)
46                     maxY = Coordinates[i].Y;
47 
48                 if (Coordinates[i].Z < minZ)
49                     minZ = Coordinates[i].Z;
50                 if (Coordinates[i].Z > maxZ)
51                     maxZ = Coordinates[i].Z;
52             }
53 
54             return new BoundingBox(new Vector3(
55                 (float)maxY, (float)minY, (float)minX), new Vector3((float)maxX, (float)minZ, (float)maxZ));
56         }
57     }
58 
59 
60 }
LineString

渲染对象

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using RGeos.SlimScene.Core;
  6 using SlimDX.Direct3D9;
  7 using SlimDX;
  8 
  9 namespace RGeos.Framework.OTL.Geometries
 10 {
 11     public class RenderableLineString : RenderableObject
 12     {
 13         #region Static Members
 14         #endregion
 15 
 16         #region Private Members
 17         double m_distanceAboveSurface = 0;
 18         Point3d[] m_points = null;
 19         CustomVertex.PositionColoredTextured[] m_wallVertices = null;
 20 
 21         CustomVertex.PositionColored[] m_topVertices = null;
 22         CustomVertex.PositionColored[] m_bottomVertices = null;
 23         CustomVertex.PositionColored[] m_sideVertices = null;
 24 
 25         System.Drawing.Color m_lineColor = System.Drawing.Color.Black;
 26         float m_verticalExaggeration = 1;
 27         double m_minimumDisplayAltitude = 0;
 28         double m_maximumDisplayAltitude = double.MaxValue;
 29         string m_imageUri = null;
 30         Texture m_texture = null;
 31         System.Drawing.Color m_polygonColor = System.Drawing.Color.Black;
 32         bool m_outline = true;
 33         float m_lineWidth = 1.0f;
 34         bool m_extrude = false;
 35         AltitudeMode m_altitudeMode = AltitudeMode.Absolute;
 36         long m_numPoints = 0;
 37         #endregion
 38 
 39         /// <summary>
 40         /// Boolean indicating whether or not the line needs rebuilding.
 41         /// </summary>
 42         public bool NeedsUpdate = true;
 43 
 44         public bool Extrude
 45         {
 46             get { return m_extrude; }
 47             set { m_extrude = value; }
 48         }
 49 
 50         public AltitudeMode AltitudeMode
 51         {
 52             get { return m_altitudeMode; }
 53             set { m_altitudeMode = value; }
 54         }
 55 
 56         public System.Drawing.Color LineColor
 57         {
 58             get { return m_lineColor; }
 59             set
 60             {
 61                 m_lineColor = value;
 62                 NeedsUpdate = true;
 63             }
 64         }
 65 
 66         public float LineWidth
 67         {
 68             get { return m_lineWidth; }
 69             set
 70             {
 71                 m_lineWidth = value;
 72                 NeedsUpdate = true;
 73             }
 74         }
 75 
 76         public double DistanceAboveSurface
 77         {
 78             get { return m_distanceAboveSurface; }
 79             set
 80             {
 81                 m_distanceAboveSurface = value;
 82                 if (m_topVertices != null)
 83                 {
 84                     NeedsUpdate = true;
 85                     //UpdateVertices();
 86                 }
 87             }
 88         }
 89 
 90         public System.Drawing.Color PolygonColor
 91         {
 92             get { return m_polygonColor; }
 93             set
 94             {
 95                 m_polygonColor = value;
 96                 if (m_topVertices != null)
 97                 {
 98                     NeedsUpdate = true;
 99                     //UpdateVertices();
100                 }
101             }
102         }
103 
104         public bool Outline
105         {
106             get { return m_outline; }
107             set
108             {
109                 m_outline = value;
110                 if (m_topVertices != null)
111                 {
112                     NeedsUpdate = true;
113                     //UpdateVertices();
114                 }
115             }
116         }
117 
118         public Point3d[] Points
119         {
120             get
121             {
122                 // if the array size is correct just return it
123                 if (m_numPoints == m_points.LongLength)
124                     return m_points;
125 
126                 // return an array the correct size.
127                 Point3d[] points = new Point3d[m_numPoints];
128                 for (int i = 0; i < m_numPoints; i++)
129                 {
130                     points[i] = m_points[i];
131                 }
132                 return points;
133             }
134             set
135             {
136                 m_points = value;
137                 m_numPoints = m_points.LongLength;
138                 NeedsUpdate = true;
139             }
140         }
141 
142         public long NumPoints
143         {
144             get { return m_numPoints; }
145         }
146 
147         public double MinimumDisplayAltitude
148         {
149             get { return m_minimumDisplayAltitude; }
150             set { m_minimumDisplayAltitude = value; }
151         }
152 
153         public double MaximumDisplayAltitude
154         {
155             get { return m_maximumDisplayAltitude; }
156             set { m_maximumDisplayAltitude = value; }
157         }
158 
159         public override byte Opacity
160         {
161             get
162             {
163                 return base.Opacity;
164             }
165             set
166             {
167                 base.Opacity = value;
168                 if (m_topVertices != null)
169                 {
170                     UpdateVertices();
171                 }
172             }
173         }
174 
175         public RenderableLineString(string name, World parentWorld, Point3d[] points, System.Drawing.Color lineColor)
176             : base(name, parentWorld)
177         {
178             m_points = points;
179             m_lineColor = lineColor;
180             m_polygonColor = lineColor;
181             m_numPoints = m_points.LongLength;
182 
183             // RenderPriority = WorldWind.Renderable.RenderPriority.LinePaths;
184         }
185 
186         public RenderableLineString(string name, World parentWorld, Point3d[] points, string imageUri)
187             : base(name, parentWorld)
188         {
189             m_points = points;
190             m_imageUri = imageUri;
191             m_numPoints = m_points.LongLength;
192 
193             // RenderPriority = WorldWind.Renderable.RenderPriority.LinePaths;
194         }
195 
196         public override void Dispose()
197         {
198             if (m_texture != null && !m_texture.Disposed)
199             {
200                 m_texture.Dispose();
201                 m_texture = null;
202             }
203 
204             if (m_lineString != null)
205             {
206                 m_lineString.Remove = true;
207                 m_lineString = null;
208             }
209             NeedsUpdate = true;
210         }
211 
212         public override void Initialize(DrawArgs drawArgs)
213         {
214             if (m_points == null)
215             {
216                 isInitialized = true;
217                 return;
218             }
219 
220             if (m_imageUri != null)
221             {
222                 //load image
223                 //if (m_imageUri.ToLower().StartsWith("http://"))
224                 //{
225                 //    string savePath = string.Format("{0}\image", ConfigurationLoader.GetRenderablePathString(this));
226                 //    System.IO.FileInfo file = new System.IO.FileInfo(savePath);
227                 //    if (!file.Exists)
228                 //    {
229                 //        WorldWind.Net.WebDownload download = new WorldWind.Net.WebDownload(m_imageUri);
230 
231                 //        if (!file.Directory.Exists)
232                 //            file.Directory.Create();
233 
234                 //        download.DownloadFile(file.FullName, WorldWind.Net.DownloadType.Unspecified);
235                 //    }
236 
237                 //    m_texture = ImageHelper.LoadTexture(file.FullName);
238                 //}
239                 //else
240                 //{
241                 //    m_texture = ImageHelper.LoadTexture(m_imageUri);
242                 //}
243             }
244 
245             UpdateVertices();
246 
247             isInitialized = true;
248         }
249 
250         /// <summary>
251         /// Adds a point to the line at the end of the line.
252         /// </summary>
253         /// <param name="point">The Point3d object to add.</param>
254         public void AddPoint(Point3d point)
255         {
256             // if the array is too small grow it.
257             if (m_numPoints >= m_points.LongLength)
258             {
259                 long growSize = m_points.LongLength / 2;
260                 if (growSize < 10) growSize = 10;
261 
262                 Point3d[] points = new Point3d[m_points.LongLength + growSize];
263 
264                 for (int i = 0; i < m_numPoints; i++)
265                 {
266                     points[i] = m_points[i];
267                 }
268                 m_points = points;
269             }
270             m_points[m_numPoints] = point;
271             m_numPoints++;
272             NeedsUpdate = true;
273         }
274 
275         private void UpdateVertices()
276         {
277             try
278             {
279                 // m_verticalExaggeration = World.Settings.VerticalExaggeration;
280 
281                 UpdateTexturedVertices();
282 
283                 if (m_lineString != null && m_outline && m_wallVertices != null && m_wallVertices.Length > m_topVertices.Length)
284                 {
285                     UpdateOutlineVertices();
286                 }
287 
288                 NeedsUpdate = false;
289             }
290             catch (Exception ex)
291             {
292                 Utility.Log.Write(ex);
293             }
294         }
295 
296         private void UpdateOutlineVertices()
297         {
298             m_bottomVertices = new CustomVertex.PositionColored[m_numPoints];
299             m_sideVertices = new CustomVertex.PositionColored[m_numPoints * 2];
300 
301             for (int i = 0; i < m_numPoints; i++)
302             {
303                 m_sideVertices[2 * i] = m_topVertices[i];
304 
305                 Vector3 xyzVertex = new Vector3(
306                     m_wallVertices[2 * i + 1].Position.X,
307                     m_wallVertices[2 * i + 1].Position.Y,
308                     m_wallVertices[2 * i + 1].Position.Z);
309 
310                 m_bottomVertices[i].Position.X = xyzVertex.X;
311                 m_bottomVertices[i].Position.Y = xyzVertex.Y;
312                 m_bottomVertices[i].Position.Z = xyzVertex.Z;
313                 m_bottomVertices[i].Color = m_lineColor.ToArgb();
314 
315                 m_sideVertices[2 * i + 1] = m_bottomVertices[i];
316             }
317         }
318 
319         LineString m_lineString = null;
320         private void UpdateTexturedVertices()
321         {
322             if (m_altitudeMode == AltitudeMode.ClampedToGround)
323             {
324                 if (m_lineString != null)
325                 {
326                     m_lineString.Remove = true;
327                     m_lineString = null;
328                 }
329 
330                 m_lineString = new LineString();
331                 m_lineString.Coordinates = Points;
332                 m_lineString.Color = LineColor;
333                 m_lineString.LineWidth = LineWidth;
334                 m_lineString.ParentRenderable = this;
335                 // this.World.ProjectedVectorRenderer.Add(m_lineString);
336 
337                 if (m_wallVertices != null)
338                     m_wallVertices = null;
339 
340                 return;
341             }
342 
343             if (m_extrude || m_altitudeMode == AltitudeMode.RelativeToGround)
344             {
345                 m_wallVertices = new CustomVertex.PositionColoredTextured[m_numPoints * 2];
346             }
347 
348             float textureCoordIncrement = 1.0f / (float)(m_numPoints - 1);
349             // m_verticalExaggeration = World.Settings.VerticalExaggeration;
350             int vertexColor = m_polygonColor.ToArgb();
351 
352             m_topVertices = new CustomVertex.PositionColored[m_numPoints];
353 
354             for (int i = 0; i < m_numPoints; i++)
355             {
356                 double terrainHeight = 0;
357 
358 
359                 Vector3 xyzVertex = new Vector3((float)m_points[i].X, (float)m_points[i].Y, (float)m_points[i].Z);
360 
361                 m_topVertices[i].Position.X = xyzVertex.X;
362                 m_topVertices[i].Position.Y = xyzVertex.Y;
363                 m_topVertices[i].Position.Z = xyzVertex.Z;
364                 m_topVertices[i].Color = m_lineColor.ToArgb();
365 
366                 if (m_extrude || m_altitudeMode == AltitudeMode.RelativeToGround)
367                 {
368                     m_wallVertices[2 * i].Position.X = xyzVertex.X;
369                     m_wallVertices[2 * i].Position.Y = xyzVertex.Y;
370                     m_wallVertices[2 * i].Position.Z = xyzVertex.Z;
371                     m_wallVertices[2 * i].Color = vertexColor;
372                     m_wallVertices[2 * i].Tu = i * textureCoordIncrement;
373                     m_wallVertices[2 * i].Tv = 1.0f;
374 
375                     m_wallVertices[2 * i + 1].Position.X = xyzVertex.X;
376                     m_wallVertices[2 * i + 1].Position.Y = xyzVertex.Y;
377                     m_wallVertices[2 * i + 1].Position.Z = xyzVertex.Z;
378                     m_wallVertices[2 * i + 1].Color = vertexColor;
379                     m_wallVertices[2 * i + 1].Tu = i * textureCoordIncrement;
380                     m_wallVertices[2 * i + 1].Tv = 0.0f;
381                 }
382             }
383         }
384 
385         public override bool PerformSelectionAction(DrawArgs drawArgs)
386         {
387             return false;
388         }
389 
390         public override void Update(DrawArgs drawArgs)
391         {
392             if (drawArgs.WorldCamera.Distance >= m_minimumDisplayAltitude && drawArgs.WorldCamera.Distance <= m_maximumDisplayAltitude)
393             {
394                 if (!isInitialized)
395                     Initialize(drawArgs);
396 
397                 if (NeedsUpdate)
398                     UpdateVertices();
399             }
400 
401         }
402 
403         public override void Render(DrawArgs drawArgs)
404         {
405             if (!isInitialized || drawArgs.WorldCamera.Distance < m_minimumDisplayAltitude || drawArgs.WorldCamera.Distance > m_maximumDisplayAltitude)
406             {
407                 return;
408             }
409 
410             try
411             {
412                 if (m_lineString != null)
413                     return;
414 
415                 int currentCull = drawArgs.Device.GetRenderState(RenderState.CullMode);
416                 drawArgs.Device.SetRenderState(RenderState.CullMode, Cull.None);
417 
418                 if (m_wallVertices != null)
419                 {
420                     drawArgs.Device.SetRenderState(RenderState.ZEnable, true);
421 
422                     if (m_texture != null && !m_texture.Disposed)
423                     {
424                         drawArgs.Device.SetTexture(0, m_texture);
425                         drawArgs.Device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.Modulate);
426                         drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Add);
427                         drawArgs.Device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture);
428                     }
429                     else
430                     {
431                         drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Disable);
432                     }
433 
434                     drawArgs.Device.VertexFormat = CustomVertex.PositionColoredTextured.Format;
435 
436                     drawArgs.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, m_wallVertices.Length - 2, m_wallVertices);
437 
438                     if (m_outline)
439                     {
440 
441                         drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Disable);
442                         drawArgs.Device.VertexFormat = CustomVertex.PositionColored.Format;
443                         drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineStrip, m_topVertices.Length - 1, m_topVertices);
444 
445                         if (m_bottomVertices != null)
446                             drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineStrip, m_bottomVertices.Length - 1, m_bottomVertices);
447 
448                         if (m_sideVertices != null)
449                             drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineList, m_sideVertices.Length / 2, m_sideVertices);
450 
451                     }
452                 }
453                 else
454                 {
455                     drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Disable);
456                     drawArgs.Device.VertexFormat = CustomVertex.PositionColored.Format;
457                     drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineStrip, m_topVertices.Length - 1, m_topVertices);
458                 }
459 
460                 drawArgs.Device.SetTransform(TransformState.World, drawArgs.WorldCamera.WorldMatrix);
461                 drawArgs.Device.SetRenderState(RenderState.CullMode, currentCull);
462             }
463             catch//(Exception ex)
464             {
465                 //Utility.Log.Write(ex);
466             }
467         }
468     }
469 }
RenderableLineString

使用方法:

 private void tspPolyline_Click(object sender, EventArgs e)
        {
            Point3d[] pts=new Point3d[5];
            Point3d pt1=new Point3d(0,0,0);
            Point3d pt2=new Point3d(0,10,8);
            Point3d pt3=new Point3d(0,20,5);
            Point3d pt4=new Point3d(0,30,4);
            Point3d pt5=new Point3d(0,40,2);
            pts[0]=pt1;
            pts[1]=pt2;
            pts[2]=pt3;
            pts[3]=pt4;
            pts[4]=pt5;
            RenderableLineString rend = new RenderableLineString("Hello", null, pts, Color.White);
            rend.IsOn = true;
            rend.RenderPriority = RenderPriority.Custom;
            mSceneControl.CurrentWorld.RenderableObjects.ChildObjects.Add(rend);
        }

 

原文地址:https://www.cnblogs.com/yhlx125/p/3959849.html