none
能否在MeshGeometry3D上绘制线段? RRS feed

  • 问题

  • WPF提供了三维图形绘制的功能,数据给定是根据三维“面”的三角形三点坐标及连接关系而决定的,我想在生成的三维表面绘制一些线段,我该如何操作?

    2008年12月9日 9:13

答案

  • 那你就将你的MeshGeometry3D.Materail赋值为MaterialGroup,MaterialGroup里面可以包含多个DiffuseMaterial,MaterialGroup允许你对Materials分层:

    <GeometryModel3D.Material>
        <MaterialGroup>
            <DiffuseMaterial ... />
            <DiffuseMaterial ... />
        </MaterialGroup>
    </GeometryModel3D.Material>
    当WPF在表现Material的时候,第二个
    DiffuseMaterial在第一个DiffuseMaterial的上面显示。例如下面的Xaml代码,你可以试一下效果:
    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          WindowTitle="Mustached Face on a Cube"
          Title="Mustached Face on a Cube">
        <DockPanel>
            <ScrollBar Name="horz" DockPanel.Dock="Bottom" Orientation="Horizontal"
                       Minimum="-180" Maximum="180"
                       LargeChange="10" SmallChange="1" />

            <ScrollBar Name="vert" DockPanel.Dock="Right" Orientation="Vertical"
                       Minimum="-180" Maximum="180"
                       LargeChange="10" SmallChange="1" />

            <Viewport3D>
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <Model3DGroup>
                            <GeometryModel3D>
                                <GeometryModel3D.Geometry>
       
                                    <!-- Unit cube. -->
                                    <MeshGeometry3D
                                        Positions="-0.5  0.5  0.5,  0.5  0.5  0.5,
                                                   -0.5 -0.5  0.5,  0.5 -0.5  0.5,
                                                    0.5  0.5 -0.5, -0.5  0.5 -0.5,
                                                    0.5 -0.5 -0.5, -0.5 -0.5 -0.5,
                                                   -0.5  0.5 -0.5, -0.5  0.5  0.5,
                                                   -0.5 -0.5 -0.5, -0.5 -0.5  0.5,
                                                    0.5  0.5  0.5,  0.5  0.5 -0.5,
                                                    0.5 -0.5  0.5,  0.5 -0.5 -0.5,
                                                   -0.5  0.5 -0.5,  0.5  0.5 -0.5,
                                                   -0.5  0.5  0.5,  0.5  0.5  0.5,
                                                    0.5 -0.5 -0.5, -0.5 -0.5 -0.5,
                                                    0.5 -0.5  0.5, -0.5 -0.5  0.5"

                                        TriangleIndices=" 0  2  1,  1  2  3
                                                          4  6  5,  5  6  7,
                                                          8 10  9,  9 10 11,
                                                         12 14 13, 13 14 15
                                                         16 18 17, 17 18 19
                                                         20 22 21, 21 22 23"

                                        TextureCoordinates="0 0, 1 0, 0 1, 1 1,
                                                            0 0, 1 0, 0 1, 1 1,
                                                            0 0, 1 0, 0 1, 1 1,
                                                            0 0, 1 0, 0 1, 1 1,
                                                            0 0, 1 0, 0 1, 1 1,
                                                            0 0, 1 0, 0 1, 1 1" />
                                </GeometryModel3D.Geometry>
       
                                <GeometryModel3D.Material>
                                    <MaterialGroup>

                                        <!-- ImageBrush overlayed with... -->
                                        <DiffuseMaterial>
                                            <DiffuseMaterial.Brush>
                                                <ImageBrush
                    ImageSource="http://www.charlespetzold.com/PetzoldTattoo.jpg" />
                                            </DiffuseMaterial.Brush>
                                        </DiffuseMaterial>

                    <!-- 比如我绘制了某地方的三维地形,在某个位置处我要画一个圆圈什么的作为标志 -->
                                        <!-- DrawingBrush with drawing. -->
                                        <DiffuseMaterial>
                                            <DiffuseMaterial.Brush>

                    <DrawingBrush Viewbox="0 0 100 100" ViewboxUnits="Absolute">
                        <DrawingBrush.Drawing>
                            <GeometryDrawing Geometry="M 66 42 H 76
                                                       Q 90 42 90 30 Q 90 25 85 25
                                                       Q 80 25 80 30 Q 80 35 85 35
                                                       M 61 42 H 51
                                                       Q 37 42 37 30 Q 37 25 42 25
                                                       Q 47 25 47 30 Q 47 35 42 35">
                                <GeometryDrawing.Pen>
                                    <Pen Brush="Black" Thickness="3"
                                         StartLineCap="Round" EndLineCap="Round" />
                                </GeometryDrawing.Pen>
                            </GeometryDrawing>
                        </DrawingBrush.Drawing>
                   </DrawingBrush>
                                            </DiffuseMaterial.Brush>
                                        </DiffuseMaterial>
                                    </MaterialGroup>
                                </GeometryModel3D.Material>

                                <GeometryModel3D.Transform>
                                    <Transform3DGroup>
                                        <RotateTransform3D>
                                            <RotateTransform3D.Rotation>
                                                <AxisAngleRotation3D Axis="0 1 0"
                                                    Angle="{Binding ElementName=horz,
                                                                    Path=Value}" />
                                            </RotateTransform3D.Rotation>
                                        </RotateTransform3D>
                                        <RotateTransform3D>
                                            <RotateTransform3D.Rotation>
                                                <AxisAngleRotation3D Axis="1 0 0"
                                                    Angle="{Binding ElementName=vert,
                                                                    Path=Value}" />
                                            </RotateTransform3D.Rotation>
                                        </RotateTransform3D>
                                    </Transform3DGroup>
                                </GeometryModel3D.Transform>
                            </GeometryModel3D>

                            <!-- Light source. -->
                            <AmbientLight Color="White" />
                        </Model3DGroup>
                    </ModelVisual3D.Content>
                </ModelVisual3D>

                <!-- Camera. -->
                <Viewport3D.Camera>
                    <PerspectiveCamera Position="-2 2 4"
                                       LookDirection="2 -2 -4"
                                       UpDirection="0 1 0"
                                       FieldOfView="22.5" />
                </Viewport3D.Camera>
            </Viewport3D>
        </DockPanel>
    </Page>
    2008年12月15日 16:56

全部回复

  •  

    我觉得你可以试一下DiffuseMaterial,下面这段代码是我从MSDN拷贝过来的,注意黄色的那一部分,不知道是不是你想要的东西:

     

    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
      <DockPanel>
        <Viewbox>
          <Canvas Width="321" Height="201">

            <!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
            <Viewport3D ClipToBounds="True" Width="150" Height="150" Canvas.Left="0" Canvas.Top="10">

              <!-- Defines the camera used to view the 3D object. -->
              <Viewport3D.Camera>
                <PerspectiveCamera Position="0,0,2" LookDirection="0,0,-1" FieldOfView="60" />
              </Viewport3D.Camera>

              <!-- The ModelVisual3D children contain the 3D models -->
              <Viewport3D.Children>

                <!-- This ModelVisual3D defines the light cast in the scene. Without light, the 3D
                     object cannot be seen. Also, the direction of the lights affect shadowing. If desired,
                     you can create multiple lights with different colors that shine from different directions. -->
                <ModelVisual3D>
                  <ModelVisual3D.Content>
                    <DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
                  </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D>
                  <ModelVisual3D.Content>
                    <GeometryModel3D>

                      <!-- The geometry specifes the shape of the 3D plane. In this sample, a flat sheet is created. -->
                      <GeometryModel3D.Geometry>
                        <MeshGeometry3D
                         TriangleIndices="0,1,2 3,4,5 "
                         Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
                         TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
                         Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5 " />
                      </GeometryModel3D.Geometry>
                      <!-- The material specifies the material applied to the 3D object. In this sample a tiled drawing  
                           covers the surface of the 3D object.-->
                      <GeometryModel3D.Material>
                        <DiffuseMaterial>
                          <DiffuseMaterial.Brush>
                            <DrawingBrush Viewport="0,0,0.1,0.1" TileMode="Tile">
                              <DrawingBrush.Drawing>
                                <DrawingGroup>
                                  <DrawingGroup.Children>
                                    <GeometryDrawing Geometry="M0,0.1 L0.1,0 1,0.9, 0.9,1z"
                                      Brush="Gray" />
                                    <GeometryDrawing Geometry="M0.9,0 L1,0.1 0.1,1 0,0.9z"
                                      Brush="Gray" />
                                    <GeometryDrawing Geometry="M0.25,0.25 L0.5,0.125 0.75,0.25 0.5,0.5z"
                                      Brush="#FFFF00" />
                                    <GeometryDrawing Geometry="M0.25,0.75 L0.5,0.875 0.75,0.75 0.5,0.5z"
                                      Brush="Black" />
                                    <GeometryDrawing Geometry="M0.25,0.75 L0.125,0.5 0.25,0.25 0.5,0.5z"
                                      Brush="#FF0000" />
                                    <GeometryDrawing Geometry="M0.75,0.25 L0.875,0.5 0.75,0.75 0.5,0.5z"
                                      Brush="MediumBlue" />
                                  </DrawingGroup.Children>
                                </DrawingGroup>
                              </DrawingBrush.Drawing>
                            </DrawingBrush>
                          </DiffuseMaterial.Brush>
                        </DiffuseMaterial>
                      </GeometryModel3D.Material>
                      <!-- Apply a transform to the object. In this sample, a rotation transform is applied, rendering the
                           3D object rotated. -->
                      <GeometryModel3D.Transform>
                        <RotateTransform3D>
                          <RotateTransform3D.Rotation>
                            <AxisAngleRotation3D Axis="0,3,0" Angle="40" />
                          </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                      </GeometryModel3D.Transform>
                    </GeometryModel3D>
                  </ModelVisual3D.Content>
                </ModelVisual3D>
              </Viewport3D.Children>
            </Viewport3D>
          </Canvas>
        </Viewbox>
      </DockPanel>
    </Page>

     

    2008年12月9日 10:39
  • 我的意思是这样:比如我绘制了某地方的三维地形,在某个位置处我要画一个圆圈什么的作为标志,如何实现?

    2008年12月12日 4:41
  • 那你就将你的MeshGeometry3D.Materail赋值为MaterialGroup,MaterialGroup里面可以包含多个DiffuseMaterial,MaterialGroup允许你对Materials分层:

    <GeometryModel3D.Material>
        <MaterialGroup>
            <DiffuseMaterial ... />
            <DiffuseMaterial ... />
        </MaterialGroup>
    </GeometryModel3D.Material>
    当WPF在表现Material的时候,第二个
    DiffuseMaterial在第一个DiffuseMaterial的上面显示。例如下面的Xaml代码,你可以试一下效果:
    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          WindowTitle="Mustached Face on a Cube"
          Title="Mustached Face on a Cube">
        <DockPanel>
            <ScrollBar Name="horz" DockPanel.Dock="Bottom" Orientation="Horizontal"
                       Minimum="-180" Maximum="180"
                       LargeChange="10" SmallChange="1" />

            <ScrollBar Name="vert" DockPanel.Dock="Right" Orientation="Vertical"
                       Minimum="-180" Maximum="180"
                       LargeChange="10" SmallChange="1" />

            <Viewport3D>
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <Model3DGroup>
                            <GeometryModel3D>
                                <GeometryModel3D.Geometry>
       
                                    <!-- Unit cube. -->
                                    <MeshGeometry3D
                                        Positions="-0.5  0.5  0.5,  0.5  0.5  0.5,
                                                   -0.5 -0.5  0.5,  0.5 -0.5  0.5,
                                                    0.5  0.5 -0.5, -0.5  0.5 -0.5,
                                                    0.5 -0.5 -0.5, -0.5 -0.5 -0.5,
                                                   -0.5  0.5 -0.5, -0.5  0.5  0.5,
                                                   -0.5 -0.5 -0.5, -0.5 -0.5  0.5,
                                                    0.5  0.5  0.5,  0.5  0.5 -0.5,
                                                    0.5 -0.5  0.5,  0.5 -0.5 -0.5,
                                                   -0.5  0.5 -0.5,  0.5  0.5 -0.5,
                                                   -0.5  0.5  0.5,  0.5  0.5  0.5,
                                                    0.5 -0.5 -0.5, -0.5 -0.5 -0.5,
                                                    0.5 -0.5  0.5, -0.5 -0.5  0.5"

                                        TriangleIndices=" 0  2  1,  1  2  3
                                                          4  6  5,  5  6  7,
                                                          8 10  9,  9 10 11,
                                                         12 14 13, 13 14 15
                                                         16 18 17, 17 18 19
                                                         20 22 21, 21 22 23"

                                        TextureCoordinates="0 0, 1 0, 0 1, 1 1,
                                                            0 0, 1 0, 0 1, 1 1,
                                                            0 0, 1 0, 0 1, 1 1,
                                                            0 0, 1 0, 0 1, 1 1,
                                                            0 0, 1 0, 0 1, 1 1,
                                                            0 0, 1 0, 0 1, 1 1" />
                                </GeometryModel3D.Geometry>
       
                                <GeometryModel3D.Material>
                                    <MaterialGroup>

                                        <!-- ImageBrush overlayed with... -->
                                        <DiffuseMaterial>
                                            <DiffuseMaterial.Brush>
                                                <ImageBrush
                    ImageSource="http://www.charlespetzold.com/PetzoldTattoo.jpg" />
                                            </DiffuseMaterial.Brush>
                                        </DiffuseMaterial>

                    <!-- 比如我绘制了某地方的三维地形,在某个位置处我要画一个圆圈什么的作为标志 -->
                                        <!-- DrawingBrush with drawing. -->
                                        <DiffuseMaterial>
                                            <DiffuseMaterial.Brush>

                    <DrawingBrush Viewbox="0 0 100 100" ViewboxUnits="Absolute">
                        <DrawingBrush.Drawing>
                            <GeometryDrawing Geometry="M 66 42 H 76
                                                       Q 90 42 90 30 Q 90 25 85 25
                                                       Q 80 25 80 30 Q 80 35 85 35
                                                       M 61 42 H 51
                                                       Q 37 42 37 30 Q 37 25 42 25
                                                       Q 47 25 47 30 Q 47 35 42 35">
                                <GeometryDrawing.Pen>
                                    <Pen Brush="Black" Thickness="3"
                                         StartLineCap="Round" EndLineCap="Round" />
                                </GeometryDrawing.Pen>
                            </GeometryDrawing>
                        </DrawingBrush.Drawing>
                   </DrawingBrush>
                                            </DiffuseMaterial.Brush>
                                        </DiffuseMaterial>
                                    </MaterialGroup>
                                </GeometryModel3D.Material>

                                <GeometryModel3D.Transform>
                                    <Transform3DGroup>
                                        <RotateTransform3D>
                                            <RotateTransform3D.Rotation>
                                                <AxisAngleRotation3D Axis="0 1 0"
                                                    Angle="{Binding ElementName=horz,
                                                                    Path=Value}" />
                                            </RotateTransform3D.Rotation>
                                        </RotateTransform3D>
                                        <RotateTransform3D>
                                            <RotateTransform3D.Rotation>
                                                <AxisAngleRotation3D Axis="1 0 0"
                                                    Angle="{Binding ElementName=vert,
                                                                    Path=Value}" />
                                            </RotateTransform3D.Rotation>
                                        </RotateTransform3D>
                                    </Transform3DGroup>
                                </GeometryModel3D.Transform>
                            </GeometryModel3D>

                            <!-- Light source. -->
                            <AmbientLight Color="White" />
                        </Model3DGroup>
                    </ModelVisual3D.Content>
                </ModelVisual3D>

                <!-- Camera. -->
                <Viewport3D.Camera>
                    <PerspectiveCamera Position="-2 2 4"
                                       LookDirection="2 -2 -4"
                                       UpDirection="0 1 0"
                                       FieldOfView="22.5" />
                </Viewport3D.Camera>
            </Viewport3D>
        </DockPanel>
    </Page>
    2008年12月15日 16:56