Spherencyof Sphere不能在我的多维数据集的所有方面工作 - Helixtoolkit

时间:2016-04-01 12:18:06

标签: c# wpf xaml 3d helix-3d-toolkit

这里的第一个问题 - 希望我的格式正确。
因此,我正在尝试使用Visual Studio 2015中的Helix-Toolkit在WPF中创建具有512个LED(8x8x8)的3D LED立方体。我是WPF中的全部3D内容的新手,所以我可能在这里有一些误解。基本上我现在正在做的是:

  • 我的XAML代码名称为“cube”。我有一个ModelVisual3D。
  • 我有一个运行512次的循环 - 它创建一个SphereVisual3D并设置其材质
  • 我将LED添加到我的ModelVisual3D

我希望我的LED几乎是透明的,所以我可以看到立方体内部的LED亮起时。这就是我使用这种材料的原因:

 
DiffuseMaterial material = new DiffuseMaterial(new SolidColorBrush(Color.FromArgb(50,255,255,255)));
sphere.Material = material;
 

透明度是有效的。示例:透明度在多维数据集的右侧/前侧工作(按下“打开”按钮的按钮)。但它不在立方体的左侧或后侧。有人能解释一下为什么吗?我认为这与这个场景的光源有关。 正面透明度: Front-View transparent左侧:Left side non-transparent

这是我的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。可能是什么原因?

1 个答案:

答案 0 :(得分:1)

尝试添加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>

为了获得更好的性能,您应该减少球体上的三角形数量。 E.g。

        sphere.ThetaDiv = 10;
        sphere.PhiDiv = 10;