如何使用 WPF 绘制 3D 圆形

如何使用wpf绘制 圆形,而不是一个 圆形面,这样可以用来绘制同心圆,如下图:

img


使用代码,绘制出来时,是一个圆形面,我只想要圆形边,这种情况是不是不能这样使用纹理就能得到,应该改变思路。有没有其他思路

 private void drawCircleDemo(int r = 1, int n = 100)
        {
            int e;
            double segmentRad = Math.PI / 2 / (n + 1);

            mesh.Positions = new Point3DCollection();
            mesh.TriangleIndices = new Int32Collection();

            for (e = -n; e <= n; e++)
            {
                double r_e = r * Math.Cos(segmentRad * e);
                double y_e = r * Math.Sin(segmentRad * e);

                for (int s = 0; s <= (4 * n + 4 - 1); s++)
                {
                    double z_s = r_e * Math.Sin(segmentRad * s) * (-1);
                    double x_s = r_e * Math.Cos(segmentRad * s);
                    mesh.Positions.Add(new Point3D(x_s, y_e, z_s));
                }
            }
            mesh.Positions.Add(new Point3D(0, r, 0));
            mesh.Positions.Add(new Point3D(0, -1 * r, 0));

            for (e = 0; e < 2 * n; e++)
            {
                for (int i = 0; i < (4 * n + 4); i++)
                {
                    mesh.TriangleIndices.Add(e * (4 * n + 4) + i);
                    mesh.TriangleIndices.Add(e * (4 * n + 4) + i + (4 * n + 4));
                    mesh.TriangleIndices.Add(e * (4 * n + 4) + (i + 1) % (4 * n + 4) + (4 * n + 4));

                    mesh.TriangleIndices.Add(e * (4 * n + 4) + (i + 1) % (4 * n + 4) + (4 * n + 4));
                    mesh.TriangleIndices.Add(e * (4 * n + 4) + (i + 1) % (4 * n + 4));
                    mesh.TriangleIndices.Add(e * (4 * n + 4) + i);
                }
            }

            for (int i = 0; i < (4 * n + 4); i++)
            {
                mesh.TriangleIndices.Add(e * (4 * n + 4) + i);
                mesh.TriangleIndices.Add(e * (4 * n + 4) + (i + 1) % (4 * n + 4));
                mesh.TriangleIndices.Add((4 * n + 4) * (2 * n + 1));
            }

            for (int i = 0; i < (4 * n + 4); i++)
            {
                mesh.TriangleIndices.Add(i);
                mesh.TriangleIndices.Add((i + 1) % (4 * n + 4));
                mesh.TriangleIndices.Add((4 * n + 4) * (2 * n + 1) + 1);
            }
        }

xaml 代码
<Viewport3D>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <Model3DGroup>
                        <GeometryModel3D>
                            <!-- Geometry -->
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D x:Name="mesh" />
                            </GeometryModel3D.Geometry>
                            <!-- Foreground brushes -->
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <SolidColorBrush Color="Blue"></SolidColorBrush>
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                        </GeometryModel3D>
                        <!-- Lighting -->
                        <AmbientLight Color="White" />
                    </Model3DGroup>
                </ModelVisual3D.Content>
            </ModelVisual3D>
            <!-- Camera -->
            <Viewport3D.Camera>
                <PerspectiveCamera Position="0,0,-8" UpDirection="0,1,0" LookDirection="0,0,1" FieldOfView="45" NearPlaneDistance="0.125"/>
            </Viewport3D.Camera>
        </Viewport3D>

img

这是一种使用WPF绘制3D圆形的方法:
主要思路是:

  1. 计算出圆周上等间距的点的坐标
  2. 将这些点连接成三角形,构成圆面的网格
  3. 在上下端面填充两个三角形作为端盖
    关键的代码步骤包括:
  4. 计算出圆周上点的坐标,存储到Positions集合中(第18-44行)
  5. 计算三角形索引,存储到TriangleIndices集合中,构成圆柱侧面(第48-86行)
  6. 计算上下端面三角形索引,构成端盖(第76-100行)
  7. 在XAML中,使用MeshGeometry绑定这两个集合,组成一个GeometryModel,渲染出来就是一个圆柱体
  8. 添加照明和相机,即可在Viewport3D中显示出这个3D圆形
    这种方法可以很灵活地控制圆形的半径、段数等参数,从而绘制出不同形式的3D圆形。可以作为绘制同心圆等图形的基础。