在 WPF 中旋转 3D 立方体 [英] Rotate 3D cube in WPF

查看:53
本文介绍了在 WPF 中旋转 3D 立方体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 WPF 中使用 XAML 代码制作了一个 3D 立方体,如下所示:

I make a 3D cube in WPF with the XAML code like this:

<Viewport3D Name="viewport3D1">
            <Viewport3D.Camera>
                <PerspectiveCamera x:Name="camMain" Position="6 5 4" LookDirection="-6 -5 -4">
                </PerspectiveCamera>
            </Viewport3D.Camera>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <DirectionalLight x:Name="dirLightMain" Direction="-1,-1,-1">
                    </DirectionalLight>
                </ModelVisual3D.Content>
            </ModelVisual3D>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <GeometryModel3D>
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D x:Name="meshMain"
                                Positions="0 0 0  1 0 0  0 1 0  1 1 0  0 0 1  1 0 1  0 1 1  1 1 1"
                                TriangleIndices="2 3 1  2 1 0  7 1 3  7 5 1  6 5 7  6 4 5  6 2 0  2 0 4  2 7 3  2 6 7  0 1 5  0 5 4">
                            </MeshGeometry3D>
                        </GeometryModel3D.Geometry>
                        <GeometryModel3D.Material>
                            <DiffuseMaterial x:Name="matDiffuseMain">
                                <DiffuseMaterial.Brush>
                                    <SolidColorBrush Color="Red"/>
                                </DiffuseMaterial.Brush>
                            </DiffuseMaterial>
                        </GeometryModel3D.Material>
                    </GeometryModel3D>
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>

然后是我的窗口的构造函数,我想围绕轴 OX、OY、OZ 应用旋转,我认为应该这样做:

Then is constructor of my window, I want to apply rotations around axis OX, OY, OZ which I think is supposed to be done like this:

RotateTransform3D myRotateTransform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 2, 0), 1));
        meshMain.Transform=myRotateTransform;
        // etc...

似乎我没有将变换应用于 XAML 的正确节点,在我的情况下,什么是实现变换的正确方法?

It seems I don't apply transform to proper node of XAML, what it the right way to effect transform in my case?

推荐答案

你需要给你的 ModelVisual3D 一个名称,MeshGeometry3D 没有 转换 属性与模型一样.您还需要访问 AxisAngleRotation3D 对象以设置 Angle 属性.

You need to give your ModelVisual3D a name, MeshGeometry3D does not have a Transform Property where as the Model does. You also need to have access to your AxisAngleRotation3D object in order to set the Angle property.

<ModelVisual3D x:Name="MyModel">
....

编辑为 CodeBehind 方法添加了更多代码

Edit added more code for CodeBehind method

public partial class MainWindow : Window
{
    AxisAngleRotation3D ax3d;
    public MainWindow()
    {
        InitializeComponent();

        ax3d = new AxisAngleRotation3D(new Vector3D(0, 2, 0), 1);
        RotateTransform3D myRotateTransform = new RotateTransform3D(ax3d);
        MyModel.Transform = myRotateTransform;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        ax3d.Angle += 1 ;
    }
}

尽管在这种情况下,我认为您最好在 Xaml 中实现您的转换.

Though in this case I think you would be better off implementing your Transform in the Xaml.

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Viewport3D Name="viewport3D1">
            <Viewport3D.Camera>
                <PerspectiveCamera x:Name="camMain" Position="6 5 4" LookDirection="-6 -5 -4">
                </PerspectiveCamera>
            </Viewport3D.Camera>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <DirectionalLight x:Name="dirLightMain" Direction="-1,-1,-1">
                    </DirectionalLight>
                </ModelVisual3D.Content>
            </ModelVisual3D>
            <ModelVisual3D x:Name="MyModel">
                <ModelVisual3D.Content>
                    <GeometryModel3D>
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D x:Name="meshMain" 
                                Positions="0 0 0  1 0 0  0 1 0  1 1 0  0 0 1  1 0 1  0 1 1  1 1 1" 
                                TriangleIndices="2 3 1  2 1 0  7 1 3  7 5 1  6 5 7  6 4 5  6 2 0  2 0 4  2 7 3  2 6 7  0 1 5  0 5 4">
                            </MeshGeometry3D>
                        </GeometryModel3D.Geometry>
                        <GeometryModel3D.Material>
                            <DiffuseMaterial x:Name="matDiffuseMain">
                                <DiffuseMaterial.Brush>
                                    <SolidColorBrush Color="Red"/>
                                </DiffuseMaterial.Brush>
                            </DiffuseMaterial>
                        </GeometryModel3D.Material>
                    </GeometryModel3D>
                </ModelVisual3D.Content>
                <ModelVisual3D.Transform>
                    <RotateTransform3D>
                        <RotateTransform3D.Rotation>
                            <AxisAngleRotation3D x:Name="rotate" Axis="0 2 0"/>
                        </RotateTransform3D.Rotation>
                    </RotateTransform3D>
                </ModelVisual3D.Transform>
            </ModelVisual3D>
        </Viewport3D>
        <Slider Height="23" HorizontalAlignment="Left" 
                Margin="12,12,0,0" Name="slider1"
                VerticalAlignment="Top" Width="187" 
                Maximum="360"
                Value="{Binding ElementName=rotate, Path=Angle}" />

    </Grid>
</Window>

此外,在此示例中,您可以通过设置其 Angle 属性来更改 CodeBehind 中的 AxisAngleRotation3D:

Also with this example you can change your AxisAngleRotation3D in the CodeBehind by setting its Angle Property:

rotate.Angle +=1;

这篇关于在 WPF 中旋转 3D 立方体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆