Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF半透明网格问题_C#_Wpf_Graphics_3d_Transparency - Fatal编程技术网

C# WPF半透明网格问题

C# WPF半透明网格问题,c#,wpf,graphics,3d,transparency,C#,Wpf,Graphics,3d,Transparency,我有一个相互叠在一起的截断金字塔网格 我的目标是将其反转,将其转换为球体近似。为此,我画了完全相同的东西,但Z轴颠倒了。它可以工作,除了背部是半透明的 这里我设置brush.Opacity=.3使半透明度问题更加明显 不幸的是,我在这个主题上所能找到的只是未能为单独的网格元素启用透明度,而不是将其删除。问题可能是由什么引起的?如何解决?以下是我绘制网格的代码摘录: public void Approximate() { group.Children.Clear(); So

我有一个相互叠在一起的截断金字塔网格

我的目标是将其反转,将其转换为球体近似。为此,我画了完全相同的东西,但Z轴颠倒了。它可以工作,除了背部是半透明的

这里我设置
brush.Opacity=.3
使半透明度问题更加明显

不幸的是,我在这个主题上所能找到的只是未能为单独的网格元素启用透明度,而不是将其删除。问题可能是由什么引起的?如何解决?以下是我绘制网格的代码摘录:

public void Approximate()
{
    group.Children.Clear();
    SolidColorBrush brush = new SolidColorBrush(Colors.Blue);
    DiffuseMaterial material = new DiffuseMaterial(brush);

    [...]

    for(int level = 0; level < level_number; level++)
    {
    GeometryModel3D model_front = new GeometryModel3D();
    model_front.Material = material;

    GeometryModel3D model_back = new GeometryModel3D();
    model_back.Material = material;

    [...]

    TruncatedPyramid pyramid1 = new TruncatedPyramid(bottom_points, top_points);
    pyramid1.Draw(model_front);
    group.Children.Add(model_front);

    TruncatedPyramid pyramid2 = new TruncatedPyramid(bottom_points, reverse_points);
    pyramid2.Draw(model_back);
    group.Children.Add(model_back);
    }
}
public void近似值()
{
group.Children.Clear();
SolidColorBrush笔刷=新的SolidColorBrush(Colors.Blue);
扩散材料=新扩散材料(刷子);
[...]
对于(int级别=0;级别<级别编号;级别++)
{
GeometryModel3D模型_front=新的GeometryModel3D();
型号\正面材料=材料;
GeometryModel3D模型_back=新的GeometryModel3D();
型号\背面材料=材料;
[...]
TruncatedPyramid1=新的TruncatedPyramid(底部点、顶部点);
金字塔1.绘图(前模型);
组。儿童。添加(前面的模型);
TruncatedPyramid2=新的TruncatedPyramid(底部的点,反向的点);
金字塔2.绘制(模型_后退);
group.Children.Add(model_back);
}
}
我在其中设置了窗口:

    <Viewport3D Name="myViewport" Margin="0,94,0,0" >

        <Viewport3D.Camera>
            <PerspectiveCamera  Position="10,10,10" LookDirection="-2,-2,-2" UpDirection="0,1,0" />
        </Viewport3D.Camera>

        <ModelVisual3D>
            <ModelVisual3D.Content>
                <DirectionalLight x:Name = "dirLightMain" Direction = "-1,-1,-1">
                </DirectionalLight>
            </ModelVisual3D.Content>
        </ModelVisual3D>

        <ModelVisual3D x:Name = "Wedge">
            <ModelVisual3D.Content>
                <Model3DGroup x:Name="group">

                </Model3DGroup>
            </ModelVisual3D.Content>

            <ModelVisual3D.Transform>
            [...]
            </ModelVisual3D.Transform>

        </ModelVisual3D>
    </Viewport3D>

[...]
我删除的代码显然运行良好,似乎与问题无关(计算网格点的函数和负责旋转组的类)


我的猜测是,正面具有某种与透明度相关的质量,尽管使用了相同的画笔,但背面仍然没有,但我对WPF不够熟悉,无法找到它。

我不使用WPFC,因此无法帮助您实际实现。无论如何,首先请看:

我认为你的问题是你的三角形渲染顺序错误。当你有更多的交叉层,这是不容易做到的顺序独立的方式像在上面的链接。但是,有更多的选择来解决这个问题:

  • Z排序

    您只需收集要渲染的所有三角形的列表,并按到摄影机的距离对它们进行排序。由于网格是自相交的,所以需要将所有相交的面划分为非相交的面,这是一件令人讨厌的事情,而且很难正确实现。完成后,按从后到前的顺序渲染三角形

  • (返回)光线跟踪

    将ender更改为光线跟踪技术。这些本机可以正确处理透明度。这里有一个例子:

  • 修复网格

    可以使用计算几何体通过从网格中删除所有内部面来修复网格。但对于自相交网格来说并不容易。完成后,您可以使用第一个链接中的方法


  • 对于复杂的网格,我会选择<强>>2>强,但是如果需要速度,那么<强>>3 < /强>是方法。

    < P>在Windows演示文稿中渲染半透明3D对象时出现的主要问题与假Z缓冲阻塞有关。具体地说,渲染透明曲面或多边形时,它会设置z缓冲区深度值,以阻止其后面的对象被渲染,即使它们应该通过透明层显示

    在带有C#的WPF中,z缓冲区是不可访问的。因此,在透明渲染期间无法禁用该选项。相反,我们必须最后渲染透明对象,以便它们在场景的其余部分上分层,并显示它们后面的对象

    例如:

    qModelGroup.Children.Add(qBackGeometry);
    qModelGroup.Children.Add(qOuterGeometry);
    
    请注意,透明的“外部几何体”层是最后添加的

    更新: 另一种方法是在WPF中使用
    发射材料
    镜面材料
    ,而不是
    扩散材料
    。这对我来说是一个复杂的问题