关于WPF 4.0中释放的WPF概念的解释

时间:2014-05-06 21:35:33

标签: wpf 3d 2d

任何人都可以在CompositionTarget_Rendering中指出点(0,0)引用的内容。我可以理解立方体围绕Y轴旋转,但我无法理解的是2D点0,0总是与旋转时立方体的同一角相关。在对象方面,我们有大立方体,小立方体,并且,根据我的不受欢迎,我们有一个交互式的按钮,但在一天结束时用作刷子(而不是3D感觉中的对象) 。我设想一个立方体站立并围绕垂直轴Y旋转的空间,但是按比例缩小的紫色立方体的放置如何相对于大立方体相同的相对位置,即大的一个特定的顶角。立方体。这本书说“来自Viewport2DVisual3D托管Button的Point(0,0) 映射到3D空间,绘制紫色立方体,Point3D位于3D空间

我感到很困惑,因为这句话意味着按钮位于2d层的某个位置(据说可能是3D空间),但按钮在任何地方都是用来“绘制”立方体的每一面。设想与2D图层和按钮相关的3D空间的最佳方法是什么?

了解为什么紫色小立方体围绕自身旋转也是一件好事,因为我只能看到触发器旋转大立方体,并且渲染事件将小立方体放置在固定位置而不旋转它。 / p>

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid Name="myGrid">
        <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>
                <ModelVisual3D x:Name="Container">
                    <Viewport2DVisual3D >
                        <Viewport2DVisual3D.Transform>
                            <Transform3DGroup>
                                <TranslateTransform3D OffsetX="1.5" />
                                <RotateTransform3D>
                                    <RotateTransform3D.Rotation>
                                        <AxisAngleRotation3D x:Name="rotationY" Axis="0,1,0" Angle="0" />
                                    </RotateTransform3D.Rotation>
                                </RotateTransform3D>
                            </Transform3DGroup>
                        </Viewport2DVisual3D.Transform>
                        <Viewport2DVisual3D.Geometry>
                            <MeshGeometry3D 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"/>
                        </Viewport2DVisual3D.Geometry>
                        <Viewport2DVisual3D.Material>
                            <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/>
                        </Viewport2DVisual3D.Material>
                        <Button Name="TestButton">
                            <Button.RenderTransform>
                                <ScaleTransform ScaleY="-1" />
                            </Button.RenderTransform>
                            Hello, 3D
                        </Button>
                    </Viewport2DVisual3D>
                </ModelVisual3D>
                <ModelUIElement3D>
                    <ModelUIElement3D.Transform>
                        <Transform3DGroup>
                            <ScaleTransform3D ScaleX="0.2" ScaleY="0.2" ScaleZ="0.2" />
                            <TranslateTransform3D x:Name="cube_translation" />
                        </Transform3DGroup>
                    </ModelUIElement3D.Transform>
                    <ModelUIElement3D.Model>
                        <GeometryModel3D>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <SolidColorBrush Color="Purple" />
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                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 Name="myStoryBoardY">
                    <DoubleAnimation
        Storyboard.TargetName="rotationY" 
        Storyboard.TargetProperty="Angle" 
        From="0" To="360" Duration="0:0:12" RepeatBehavior="Forever"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Window.Triggers>
</Window>

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        CompositionTarget.Rendering += CompositionTarget_Rendering;
    }

    static TimeSpan lastRenderTime = new TimeSpan();

    void CompositionTarget_Rendering(object sender, EventArgs e)
    {
        // Ensure we only do this once per frame
        if (lastRenderTime == ((RenderingEventArgs)e).RenderingTime)
            return;

        lastRenderTime = ((RenderingEventArgs)e).RenderingTime;

        GeneralTransform2DTo3D transform = TestButton.TransformToAncestor(Container);
        Point3D point = transform.Transform(new Point(0, 0));

        cube_translation.OffsetX = point.X;
        cube_translation.OffsetY = point.Y;
        cube_translation.OffsetZ = point.Z;
    }
}

1 个答案:

答案 0 :(得分:0)

这里的(0,0)指的是Button参考中的2D坐标。它是按钮的左上角。这里有6个不同的相同按钮的可视化,但似乎WPF假设真实的一个位于包含该按钮点的第一个三角形上。

在这种情况下,它实际上是第一张脸的第一个三角形。该面指向负Z方向(1,1,-1 1,-1,-1 -1,-1,-1 -1,1,-1)。

要实际看到这一点,您可以将相机设置为指向正方向,这样您就可以看到立方体的这个面:

<PerspectiveCamera Position="0,0,-10" LookDirection="0,0,1" FieldOfView="60"/>

将灯光设置为正方向:

<DirectionalLight Direction="-0.3,-0.4,0.5" />

删除triger以避免动画并用(27,12)替换(0,0)(它大约是按钮的中心)。

您应该看到脸部中间的红色立方体指向相机(Z面部)。

enter image description here

您也可以尝试删除第一个三角形(仅删除前3个三角形索引)。在这种情况下,红色立方体将移动到正Z面。