WPF中嵌入3D模型通用结构

背景:wpf本身有提供3D的绘制,但是自己通过代码描绘出3D是比较困难的。3D库helix-toolkit支持调用第三方生成的模型,比如Blender这些,所以在wpf上使用3D就变得非常简单。这里是一个通过helix-toolkit库调用第三方生成的3d模型的样例:

1、安装NuGet包:HelixToolkit.Wpf

2、xaml界面中设置相机和光源等参数

引入helix-toolkit命名空间:xmlns:ht="http://helix-toolkit.org/wpf"

<ht:HelixViewport3D
    Name="viewport"
    DefaultCamera="{Binding ElementName=viewport, Path=Camera}"
    MouseDown="Viewport_MouseDown"
    ShowCoordinateSystem="True">
            <ht:HelixViewport3D.Camera>
            <PerspectiveCamera
                FieldOfView="80"
                LookDirection="-100,-100,-100"
                Position="100,100,100"
                UpDirection="0,0,1">
                <!--<PerspectiveCamera.Transform>
    <RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
        <RotateTransform3D.Rotation>
            <AxisAngleRotation3D Axis="0,0,1" Angle="0"/>
        </RotateTransform3D.Rotation>
    </RotateTransform3D>
</PerspectiveCamera.Transform>-->
            </PerspectiveCamera>
        </ht:HelixViewport3D.Camera>

        <ht:HelixViewport3D.RotateGesture>
            <MouseGesture MouseAction="LeftClick" />
        </ht:HelixViewport3D.RotateGesture>
        <ht:HelixViewport3D.PanGesture>
            <MouseGesture MouseAction="RightClick" />
        </ht:HelixViewport3D.PanGesture>

        <!--  光源  -->
        <ModelVisual3D>
            <ModelVisual3D.Content>
                <Model3DGroup>
                    <!--  环境光:提亮整体的环境亮度  -->
                    <AmbientLight Color="#999" />
                    <!--  点光源:光影层次感  -->
                    <PointLight Position="100,0,100" Color="#DDD" />
                </Model3DGroup>
            </ModelVisual3D.Content>
        </ModelVisual3D>

</ht:HelixViewport3D>

3、Code_behind设置点开页面就选择3d模型

public partial class My3D : UserControl
{
    public My3D()
    {
        InitializeComponent();

        // 加载外部3D模型文件
        Model3DGroup modelGroup = null;
        var openFileDialog = new Microsoft.Win32.OpenFileDialog()
        {
            Filter = "3D模型文件 (*.obj, *.stl, *.ply)|*.obj;*.stl;*.ply"
        };
        if (openFileDialog.ShowDialog() == true)
        {
            var importer = new ModelImporter();
            modelGroup = importer.Load(openFileDialog.FileName);
        }

        // 将加载的模型添加到Viewport3D中
        if (modelGroup != null)
        {
            var modelVisual = new ModelVisual3D();
            modelVisual.Content = modelGroup;
            viewport.Children.Add(modelVisual);
        }
    }


    private void Viewport_MouseDown(object sender, MouseButtonEventArgs e)
    {
        Point mousePos = e.GetPosition(viewport);

        // 执行拾取操作
        HitTestResult hitTestResult = VisualTreeHelper.HitTest(viewport, mousePos);
        if (hitTestResult != null && hitTestResult.VisualHit is ModelVisual3D)
        {
            // 获取点击到的ModelVisual3D对象
            ModelVisual3D clickedVisual = (ModelVisual3D)hitTestResult.VisualHit;

            // 进一步处理点击到的物体
            // 例如,获取其名称、执行相应的操作等
            MessageBox.Show("点击到了物体");
        }
        else
        {
            MessageBox.Show("没有点击到什么啊");
        }
    }
}

--方法Viewport_MouseDown中判断有没有点击中了我们自己导入的模型

相关推荐

  1. WPF嵌入3D模型通用结构

    2024-04-07 14:24:02       35 阅读
  2. wpf 实现3D按钮

    2024-04-07 14:24:02       54 阅读
  3. WPF实现简单的3D图形

    2024-04-07 14:24:02       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-07 14:24:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-07 14:24:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-07 14:24:02       87 阅读
  4. Python语言-面向对象

    2024-04-07 14:24:02       96 阅读

热门阅读

  1. 【2023年软考架构师】案例真题回忆版

    2024-04-07 14:24:02       35 阅读
  2. vite配置postcss

    2024-04-07 14:24:02       35 阅读
  3. AI创业蓝海:十大领域解锁未来商机

    2024-04-07 14:24:02       30 阅读
  4. docker用来解决什么问题

    2024-04-07 14:24:02       41 阅读
  5. vue3项目中使用getCurrentInstance获取实例和dom的问题

    2024-04-07 14:24:02       30 阅读
  6. Linux 系统调用

    2024-04-07 14:24:02       36 阅读
  7. 前2个月湖南外贸进出口总值810.6亿元

    2024-04-07 14:24:02       35 阅读
  8. MyBatis实战:如何将拼接的SQL打印到日志

    2024-04-07 14:24:02       37 阅读
  9. 24双非考研哈尔滨工程大学计算机(@程程笔记)

    2024-04-07 14:24:02       71 阅读
  10. [Pytorch][缘来如此]:PyTorch中的广播机制

    2024-04-07 14:24:02       31 阅读
  11. 【软设】知识点速记3

    2024-04-07 14:24:02       30 阅读
  12. 播放器的音视频不同步问题:ffplay

    2024-04-07 14:24:02       32 阅读