球体的透明度不适用于我的立方体的所有侧面 - Helixtoolkit
Transparencyof Spheres not working on all sides of my Cube - Helixtoolkit
这里是第一个问题 - 希望我的格式设置正确。
因此,我试图在 Visual Studio 2015 年使用 Helix-Toolkit 在 WPF 中创建一个带有 512 个 LED(8x8x8)的 3D LED 立方体。我对 WPF 中的整个 3D 东西都不熟悉,所以我在这里可能会有一些误解.基本上我现在正在做的是:
- 我的 XAML 代码名称中有一个 ModelVisual3D "cube"。
- 我有一个运行了 512 次的循环 - 它创建了一个 SphereVisual3D 并设置了它的 Material
- 我将 LED 添加到我的 ModelVisual3D
我希望我的 LED 几乎是透明的,这样我可以看到立方体内部的 LED 何时亮起。这就是为什么我使用这个 Material:
DiffuseMaterial material = new DiffuseMaterial(new SolidColorBrush(Color.FromArgb(50,255,255,255)));
sphere.Material = material;
透明度还行。示例:透明度是 在立方体的 right/front 侧工作(按下按钮 'turns on' LED)。但它在立方体的左侧或背面不起作用。有人可以向我解释为什么吗?我觉得跟这个场景的光源有关。
正面透明度:
left side:
这是我的MainWindow.xaml:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
xmlns:h="http://helix-toolkit.org/wpf"
xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" x:Class="WpfApplication1.MainWindow"
mc:Ignorable="d"
Title="MainWindow" Height="720.268" Width="894.578"
xmlns:HelixToolkit="clr-namespace:HelixToolkit.Wpf;assembly=HelixToolkit.Wpf" >
<Grid>
<!-- Using the HelixToolkit -->
<HelixToolkit:HelixViewport3D x:Name="viewport" ZoomExtentsWhenLoaded="True" ShowFrameRate="True" ShowCoordinateSystem="True" Margin="0,0,0,45" ClipToBounds="False" InfiniteSpin="True">
<!-- Using the SunLight. Strange thing is: If I use the DefaultLight my Performance gets really bad -->
<HelixToolkit:SunLight Brightness="1" ShowLights="True">
</HelixToolkit:SunLight>
<!-- This ModelVisual3D Object should contain my LED cube -->
<ModelVisual3D x:Name="cube">
</ModelVisual3D>
</HelixToolkit:HelixViewport3D>
<!-- The button turns on a LED - for transparecy testing purpose -->
<Button Margin="377,650,386,0" Content="Push Me!" Click="Button_Click"/>
</Grid>
这是我的代码隐藏 Mainwindow.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using HelixToolkit.Wpf;
using System.Windows.Media.Media3D;
namespace WpfApplication1
{
/// <summary>
/// Creating LEDs
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//Create 512 LEDs
for (int x = 0; x < 7; x++)
{
for (int y = 7; y > 0; y--)
{
for(int z = 0; z < 7; z++)
{
addSphere(x, z, y);
}
}
}
}
public void addSphere(double x, double z, double y)
{
SphereVisual3D sphere = new SphereVisual3D(); //Creating new 'LED'
sphere.Radius = 0.25;
sphere.Center = new Point3D(x, y, z);
DiffuseMaterial material = new DiffuseMaterial(new SolidColorBrush(Color.FromArgb(50,255,255,255)));
sphere.Material = material;
sphere.BackMaterial = material;
//sphere.Fill = new SolidColorBrush(Colors.DarkBlue);
cube.Children.Add(sphere);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//Turns one LED red to test transparancy
SphereVisual3D model = cube.Children[60] as SphereVisual3D;
DiffuseMaterial material = new DiffuseMaterial(new SolidColorBrush(Color.FromArgb(255, 255, 0, 0)));
model.Material = material;
}
}
}
另一个奇怪的事情是,当我使用 "HelixToolkit:DefaultLights" 时,性能真的很差。 我的帧率为 0-2 fps。可能是什么原因?
尝试添加 SortingVisual3D
<h:HelixViewport3D ShowFrameRate="True" ShowTriangleCountInfo="True" ShowViewCube="True" >
<h:SunLight/>
<h:SortingVisual3D x:Name="view3d" Method="BoundingBoxCorners" SortingFrequency="30" CheckForOpaqueVisuals="True">
<h:GridLinesVisual3D x:Name="grid" Width="500" Length="500" MajorDistance="50" MinorDistance="10"/>
Add yours spheres here!
</h:SortingVisual3D>
</h:HelixViewport3D>
为了获得更好的性能,您应该减少球体上的三角形数量。
例如
sphere.ThetaDiv = 10;
sphere.PhiDiv = 10;
这里是第一个问题 - 希望我的格式设置正确。
因此,我试图在 Visual Studio 2015 年使用 Helix-Toolkit 在 WPF 中创建一个带有 512 个 LED(8x8x8)的 3D LED 立方体。我对 WPF 中的整个 3D 东西都不熟悉,所以我在这里可能会有一些误解.基本上我现在正在做的是:
- 我的 XAML 代码名称中有一个 ModelVisual3D "cube"。
- 我有一个运行了 512 次的循环 - 它创建了一个 SphereVisual3D 并设置了它的 Material
- 我将 LED 添加到我的 ModelVisual3D
我希望我的 LED 几乎是透明的,这样我可以看到立方体内部的 LED 何时亮起。这就是为什么我使用这个 Material:
DiffuseMaterial material = new DiffuseMaterial(new SolidColorBrush(Color.FromArgb(50,255,255,255)));
sphere.Material = material;
透明度还行。示例:透明度是 在立方体的 right/front 侧工作(按下按钮 'turns on' LED)。但它在立方体的左侧或背面不起作用。有人可以向我解释为什么吗?我觉得跟这个场景的光源有关。
正面透明度:
这是我的MainWindow.xaml:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
xmlns:h="http://helix-toolkit.org/wpf"
xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" x:Class="WpfApplication1.MainWindow"
mc:Ignorable="d"
Title="MainWindow" Height="720.268" Width="894.578"
xmlns:HelixToolkit="clr-namespace:HelixToolkit.Wpf;assembly=HelixToolkit.Wpf" >
<Grid>
<!-- Using the HelixToolkit -->
<HelixToolkit:HelixViewport3D x:Name="viewport" ZoomExtentsWhenLoaded="True" ShowFrameRate="True" ShowCoordinateSystem="True" Margin="0,0,0,45" ClipToBounds="False" InfiniteSpin="True">
<!-- Using the SunLight. Strange thing is: If I use the DefaultLight my Performance gets really bad -->
<HelixToolkit:SunLight Brightness="1" ShowLights="True">
</HelixToolkit:SunLight>
<!-- This ModelVisual3D Object should contain my LED cube -->
<ModelVisual3D x:Name="cube">
</ModelVisual3D>
</HelixToolkit:HelixViewport3D>
<!-- The button turns on a LED - for transparecy testing purpose -->
<Button Margin="377,650,386,0" Content="Push Me!" Click="Button_Click"/>
</Grid>
这是我的代码隐藏 Mainwindow.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using HelixToolkit.Wpf;
using System.Windows.Media.Media3D;
namespace WpfApplication1
{
/// <summary>
/// Creating LEDs
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//Create 512 LEDs
for (int x = 0; x < 7; x++)
{
for (int y = 7; y > 0; y--)
{
for(int z = 0; z < 7; z++)
{
addSphere(x, z, y);
}
}
}
}
public void addSphere(double x, double z, double y)
{
SphereVisual3D sphere = new SphereVisual3D(); //Creating new 'LED'
sphere.Radius = 0.25;
sphere.Center = new Point3D(x, y, z);
DiffuseMaterial material = new DiffuseMaterial(new SolidColorBrush(Color.FromArgb(50,255,255,255)));
sphere.Material = material;
sphere.BackMaterial = material;
//sphere.Fill = new SolidColorBrush(Colors.DarkBlue);
cube.Children.Add(sphere);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//Turns one LED red to test transparancy
SphereVisual3D model = cube.Children[60] as SphereVisual3D;
DiffuseMaterial material = new DiffuseMaterial(new SolidColorBrush(Color.FromArgb(255, 255, 0, 0)));
model.Material = material;
}
}
}
另一个奇怪的事情是,当我使用 "HelixToolkit:DefaultLights" 时,性能真的很差。 我的帧率为 0-2 fps。可能是什么原因?
尝试添加 SortingVisual3D
<h:HelixViewport3D ShowFrameRate="True" ShowTriangleCountInfo="True" ShowViewCube="True" >
<h:SunLight/>
<h:SortingVisual3D x:Name="view3d" Method="BoundingBoxCorners" SortingFrequency="30" CheckForOpaqueVisuals="True">
<h:GridLinesVisual3D x:Name="grid" Width="500" Length="500" MajorDistance="50" MinorDistance="10"/>
Add yours spheres here!
</h:SortingVisual3D>
</h:HelixViewport3D>
为了获得更好的性能,您应该减少球体上的三角形数量。 例如
sphere.ThetaDiv = 10;
sphere.PhiDiv = 10;