//xaml
<Window x:Class="WpfApp113.MainWindow"
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:WpfApp113"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid x:Name="myGrid">
<TextBlock Panel.ZIndex="1"
IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_000"/>
</TextBlock.RenderTransform>
(-1,-1,-1)
</TextBlock>
<TextBlock Panel.ZIndex="1"
IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_001"/>
</TextBlock.RenderTransform>
(-1,-1,1)
</TextBlock>
<TextBlock Panel.ZIndex="1"
IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_010"/>
</TextBlock.RenderTransform>
(-1,-1,-1)
</TextBlock>
<TextBlock Panel.ZIndex="1"
IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_011"/>
</TextBlock.RenderTransform>
(-1,1,1)
</TextBlock>
<TextBlock Panel.ZIndex="1"
IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_100"/>
</TextBlock.RenderTransform>
(1,-1,-1)
</TextBlock>
<TextBlock Panel.ZIndex="1"
IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_101"/>
</TextBlock.RenderTransform>
(1,-1,1)
</TextBlock>
<TextBlock Panel.ZIndex="1"
IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_110"/>
</TextBlock.RenderTransform>
(1,1,-1)
</TextBlock>
<TextBlock Panel.ZIndex="1"
IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_111"/>
</TextBlock.RenderTransform>
(1,1,1)
</TextBlock>
<Viewport3D Panel.ZIndex="0">
<Viewport3D.Camera>
<PerspectiveCamera Position="3,3,4"
LookDirection="-1,-1,-1"
FieldOfView="60"/>
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Direction="-0.3,-0.4,-0.5"/>
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelUIElement3D x:Name="Cube">
<ModelUIElement3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="rotationY"
Axis="0,1,0"
Angle="0"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</ModelUIElement3D.Transform>
<ModelUIElement3D.Model>
<GeometryModel3D x:Name="ob_cube">
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Orange"
x:Name="cubeBrush"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D x:Name="me_cube2"
Positions="1,1,-1 1,-1,-1 -1,-1,-1 -1,1,-1 1,1,1 -1,1,1 -1,-1,1
1,-1,1 1,1,-1 1,1,1 1,-1,1 1,-1,-1 1,-1,-1 1,-1,1
-1,-1,1 -1,-1,-1 -1,-1,-1 -1,-1,1 -1,1,1 -1,1,-1 1,1,1
1,1,-1 -1,1,-1 -1,1,1"
TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14
12 14 15 16 17 18 16 18 19 20 21 22 20 22 23"
TextureCoordinates="0,1 0,0 1,0 1,1 1,1 -0,1 0,-0 1,0 1,1 -0,1
0,-0 1,0 1,0 1,1 -0,1 0,-0 -0,0 1,-0 1,1 0,1
1,-0 1,1 0,1 -0,0"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
</ModelUIElement3D.Model>
</ModelUIElement3D>
</Viewport3D.Children>
</Viewport3D>
</Grid>
<Window.Triggers>
<EventTrigger RoutedEvent="Window.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="rotationY"
Storyboard.TargetProperty="Angle"
From="0"
To="360"
Duration="0:0:12"
RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Window.Triggers>
</Window>
//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.Media.Media3D;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp113
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
CompositionTarget.Rendering += CompositionTarget_Rendering;
}
static TimeSpan lastRenderTime = new TimeSpan();
private void CompositionTarget_Rendering(object sender, EventArgs e)
{
if (lastRenderTime == ((RenderingEventArgs)e).RenderingTime)
{
return;
}
lastRenderTime = ((RenderingEventArgs)e).RenderingTime;
GeneralTransform3DTo2D transform = Cube.TransformToAncestor(myGrid);
Point p = transform.Transform(new Point3D(-1, -1, -1));
t_000.X = p.X;
t_000.Y = p.Y;
p = transform.Transform(new Point3D(-1, -1, 1));
t_001.X = p.X;
t_001.Y = p.Y;
p = transform.Transform(new Point3D(-1, 1, -1));
t_010.X = p.X;
t_010.Y = p.Y;
p = transform.Transform(new Point3D(-1, 1, 1));
t_011.X = p.X;
t_011.Y = p.Y;
p = transform.Transform(new Point3D(1, -1, -1));
t_100.X = p.X;
t_100.Y = p.Y;
p = transform.Transform(new Point3D(1, -1, 1));
t_101.X = p.X;
t_101.Y = p.Y;
p = transform.Transform(new Point3D(1, 1, -1));
t_110.X = p.X;
t_110.Y = p.Y;
p = transform.Transform(new Point3D(1, 1, 1));
t_111.X = p.X;
t_111.Y = p.Y;
}
}
}