卢晓阳 发表于 2023-9-29 15:19:05

WFP3D绘图

WPF本身不支持直接的3D绘图,但是它提供了一些用于实现3D效果的高级技术。如果你想要在WPF中进行3D绘图,你可以使用两种主要的方法:
[*]WPF 3D:这是一种在WPF应用程序中创建3D图形的方式。WPF 3D提供了一些基本的3D形状(如立方体、球体和锥体)以及一些用于控制3D场景和对象的工具(如相机、光源和材质)。
 在WPF中,3D对象模型的材质可以使用以下三种
[*]DiffuseMaterial:漫反射,反射场景光效果
[*]EmissiveMaterial:自发光,类似于电灯 
[*]SpecularMaterial:全反射,可以映射场景 贴图
在WPF中,一个3D模型的材质,就是决定模型看起来是什么样子的一种很重要的元素,如粗糙度、颜色、发光度等 WPF 3D对象模型光源如下AmbientLight:环境光-  提供环境光,会照亮所有的对象,而不考虑对象的位置或方向。DirectionalLight:平行光  -  它像远处的光源那样照亮(如太阳光),只具有一个Direction属性,没有位置信息,因此不直接投射到任何特定的对象上,而是照亮场景中的所有对象。PointLight:点光源 -  像近处的光源那样照亮,具有一个位置并从该位置投射光,场景中的对象是根据对象相对于光源的位置和距离而被照亮的。SpotLight:聚光灯  -  从PointLight继承,它的照亮方式与PointLight类似,但是它既具有位置又具有方向。相关属性   Color:灯光颜色   Direction:光线方向(平行光、聚光灯)   Position:光源坐标(点光源、聚光灯)   Range:灯光范围(点光源)   InnerConeAngle:内光柱照射角度(聚光灯)   OuterConeAngle:外光柱照射角度(聚光灯) 属性说明备注MeshGemetry3D网格标签 Positions点呈现3D图形的标签  Positions="0,0,0(x,y,z)     3,0,0      3,2,0      0,2,0" 一个面的4个点TraiangleIndices3 角形创建TriangleIndices ="0,3,2(第一组) 0,1,2(第二组)" 设置Positions的3个点组成一个三角行OrthographicCamera  正交相机(远近比例都一样-很少用) PerspectiveCamera    透视相机(近比例长远比例小,符合我们正常观察事物的视觉-常用) TextureCoordinates设置平面对象与3D对象的映射关系-用来解决平面设置背景图显示问题-如果不设置这个属性平面设置的背景图不显示TextureCoordinates="1,1 1,0 0,0 0,1"相机标签对象属性
属性说明备注Position相机的空间坐标(X,Y,Z)Position="100,100,100" 设置视角x,y,zLookDirection观察方向,向量,相机观察口朝向LookDirection="-2,-2,-2" 设置相机的观看视角-相机观察的方向FieldOfView(透视相机属性) / 视野范围,一个值FieldOfView="90" 设置相机与观看物体的距离,离得远观看物体区域范围大,离得近观看物体区域范围小Width(正交相机属性)(焦距),视野范围Width="50"UpDirection相机上方方向,控制相机观察口旋转UpDirection="0,1,0" (x, y,z)设置相机视口的旋转角度,斜着拍还是正着拍FarPlaneDistance远景距离,大于这个距离的场景不渲染FarPlaneDistance="1000" 设置相机远处景色的渲染范围,如果值设置的比较小,远处景色是模糊的NearPlaneDistance近景距离,小于这个距离的场景不渲染NearPlaneDistance="1" 设置相机近处的晶圆渲染范围,如果值越大,近处景色是模糊的 <Window.Triggers>
    <EventTrigger RoutedEvent="Window.Loaded">
      <BeginStoryboard>
            
            <Storyboard RepeatBehavior="Forever">
               
               
               
               
               
                <DoubleAnimation Duration="0:0:7"
                           Storyboard.TargetName="aar"
                           Storyboard.TargetProperty="Angle"
                           From="0"
                           To="360"/>
            </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
</Window.Triggers>
<Grid>
   
   
    <Viewport3D>
      
      
      <Viewport3D.Camera>
            
            
            
            
            
            
            
            <PerspectiveCamera Position="100,100,100"
                   LookDirection="-2,-2,-2"
                   FieldOfView="90"
                   UpDirection="0,1,0"
                   FarPlaneDistance="1000"
                   NearPlaneDistance="1">
            </PerspectiveCamera>
            
            
            
      </Viewport3D.Camera>
      
      
      <ModelVisual3D>
            
            <ModelVisual3D.Content>
               
                <Model3DGroup>
                  
                  
                  
                     
                  
                  
                  
                     
                  
                  
                  
                  
                     
                  
                  
                  
                  
                  
                  <SpotLight Color="Orange" InnerConeAngle="100"
               OuterConeAngle="40"
               Position="50,50,50"
               Direction="-1,-1,-1"/>
                </Model3DGroup>
            </ModelVisual3D.Content>
      </ModelVisual3D>
      
      
      <ModelUIElement3D>
            <ModelUIElement3D.Model>
               
                <GeometryModel3D>
                  
                  
                  <GeometryModel3D.Material>
                        <MaterialGroup>
                           
                           
                           
                           
                           
                            <DiffuseMaterial>
                              <DiffuseMaterial.Brush>
                                    <ImageBrush ImageSource="Arrow.png"/>
                              </DiffuseMaterial.Brush>
                            </DiffuseMaterial>
                           
                           
                           
                        </MaterialGroup>
                  </GeometryModel3D.Material>
                  
                  <GeometryModel3D.Geometry>
                        
                        
                        
                        
                        <MeshGeometry3D Positions="0,0,0   3,0,0      3,2,0      0,2,0"
                                 TriangleIndices="0,2,3 0,1,2"
                                        TextureCoordinates="1,1 1,0 0,0 0,1"/>
                        
                        
                        
                  </GeometryModel3D.Geometry>
                </GeometryModel3D>
            </ModelUIElement3D.Model>
      </ModelUIElement3D>
      
      
      <ModelUIElement3D>
            <ModelUIElement3D.Model>
               
                <GeometryModel3D>
                  
                  
                  <GeometryModel3D.Material>
                        <MaterialGroup>
                           
                           
                           
                            <DiffuseMaterial Brush="Red"/>
                           
                           
                           
                           
                           
                        </MaterialGroup>
                  </GeometryModel3D.Material>
                  
                  <GeometryModel3D.Geometry>
                        
                        
                        
                        <MeshGeometry3D Positions="3,2,1   3,2,0      3,0,0      3,0,1"
                      TriangleIndices="0,3,1    1,3,2"/>
                  </GeometryModel3D.Geometry>
                </GeometryModel3D>
            </ModelUIElement3D.Model>
      </ModelUIElement3D>
      
      
      <ModelUIElement3D>
            
            <ModelUIElement3D.Transform>
               
                <Transform3DGroup>
                  
                  <RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
                        
                        <RotateTransform3D.Rotation>
                           
                            <AxisAngleRotation3D Axis="1,0,0" Angle="-90"/>
                        </RotateTransform3D.Rotation>
                  </RotateTransform3D>
                  <RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
                        <RotateTransform3D.Rotation>
                           
                            <AxisAngleRotation3D Axis="0,1,0" x:Name="aar"/>
                        </RotateTransform3D.Rotation>
                  </RotateTransform3D>
                </Transform3DGroup>
            </ModelUIElement3D.Transform>
            
            <ModelUIElement3D.Model>
               
                <GeometryModel3D x:Name="gm">
                  
                  <GeometryModel3D.Material>
                        
                        <DiffuseMaterial>
                            <DiffuseMaterial.Brush>
                              <ImageBrush ImageSource="Earth.jpg"/>
                            </DiffuseMaterial.Brush>
                        </DiffuseMaterial>
                  </GeometryModel3D.Material>
                </GeometryModel3D>
            </ModelUIElement3D.Model>
      </ModelUIElement3D>
    </Viewport3D>
</Grid>  后台关于3D地球的代码
public MainWindow(){    InitializeComponent();    // 绑定加载事件    this.Loaded += MainWindow_Loaded;}/// /// 窗体加载/// /// /// private void MainWindow_Loaded(object sender, RoutedEventArgs e){    this.gm.Geometry = this.SetEarth(180, 180, 50);}/// /// 生成三维地球算法/// 圆弧的计算公式/// /// 纬度方向切多少份/// 精度方向切多少份/// 地球半径/// private MeshGeometry3D SetEarth(int numx, int numz, double r = 3){    MeshGeometry3D mesh = new MeshGeometry3D();    double dTh = 2 * Math.PI / numx;    double dPhi = Math.PI / numz;    double X(double th, double phi) => r * Math.Sin(phi) * Math.Cos(th);    double Y(double th, double phi) => r * Math.Sin(phi) * Math.Sin(th);    double Z(double phi) => r * Math.Cos(phi);    // Make the points.    for (int i = 0; i
页: [1]
查看完整版本: WFP3D绘图