C# WPF半透明网格问题
我有一个相互叠在一起的截断金字塔网格 我的目标是将其反转,将其转换为球体近似。为此,我画了完全相同的东西,但Z轴颠倒了。它可以工作,除了背部是半透明的 这里我设置C# WPF半透明网格问题,c#,wpf,graphics,3d,transparency,C#,Wpf,Graphics,3d,Transparency,我有一个相互叠在一起的截断金字塔网格 我的目标是将其反转,将其转换为球体近似。为此,我画了完全相同的东西,但Z轴颠倒了。它可以工作,除了背部是半透明的 这里我设置brush.Opacity=.3使半透明度问题更加明显 不幸的是,我在这个主题上所能找到的只是未能为单独的网格元素启用透明度,而不是将其删除。问题可能是由什么引起的?如何解决?以下是我绘制网格的代码摘录: public void Approximate() { group.Children.Clear(); So
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不够熟悉,无法找到它。我不使用WPF或C,因此无法帮助您实际实现。无论如何,首先请看:
对于复杂的网格,我会选择<强>>2>强,但是如果需要速度,那么<强>>3 < /强>是方法。 < P>在Windows演示文稿中渲染半透明3D对象时出现的主要问题与假Z缓冲阻塞有关。具体地说,渲染透明曲面或多边形时,它会设置z缓冲区深度值,以阻止其后面的对象被渲染,即使它们应该通过透明层显示 在带有C#的WPF中,z缓冲区是不可访问的。因此,在透明渲染期间无法禁用该选项。相反,我们必须最后渲染透明对象,以便它们在场景的其余部分上分层,并显示它们后面的对象 例如:
qModelGroup.Children.Add(qBackGeometry);
qModelGroup.Children.Add(qOuterGeometry);
请注意,透明的“外部几何体”层是最后添加的
更新:
另一种方法是在WPF中使用发射材料
或镜面材料
,而不是扩散材料
。这对我来说是一个复杂的问题