WPF UI 3D 多轴 机械臂 stl 模型UI交互

1、三维插件环境调整

2、动态模型材质处理

3、动态模型鼠标交互

4、模型旋转基本思路

5、六轴机械臂节点旋转处理

6、更多HelixToolkit插件处理案例

7、快速对接Blender模型

鼠标交互(没有强调场景的变换)

鼠标命中测试(HitTest 不推荐)

平面对象加载

数据绑定(数据与动作)

环境配置与相关方法

模型准备:Blender/SolidWorks

模型导入

HelixToolkit更多案例

WPF UI 3D 多轴 机械臂 stl 模型UI交互

顶部控件多轴控制

ui

cs 复制代码
<StackPanel VerticalAlignment="Top">
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="1"/>
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="2"/>
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="3"/>
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="8"/>
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="9"/>
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="10"/>
</StackPanel>

ui后端

cs 复制代码
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    int index = int.Parse((sender as Slider).Tag.ToString());
    (((models[index].Transform as Transform3DGroup).Children[1] as RotateTransform3D)
        .Rotation as AxisAngleRotation3D).Angle = e.NewValue;
}

效果

2

3

4

5

多轴材质控制

ui

cs 复制代码
<h:HelixViewport3D Name="hv"
                   ShowViewCube="True"
                   ViewCubeWidth="100"
                   ViewCubeHeight="100"
                   ViewCubeHorizontalPosition="Left"
                   ViewCubeVerticalPosition="Top"
                   ViewCubeFrontText="前"
                   ViewCubeTopText="上"
                   
                   ShowCoordinateSystem="True"
                   CoordinateSystemLabelForeground="#5000"
                   CoordinateSystemHorizontalPosition="Left"
                   CoordinateSystemVerticalPosition="Bottom"
                   
                   RotateAroundMouseDownPoint="True"
                   MouseLeftButtonDown="HelixViewport3D_MouseLeftButtonDown" Margin="0,0,-344,-320"
                   >
    <!--========================HelixViewport3D对象的属性(必须在内容之前)==========================-->

    <h:HelixViewport3D.Background>
        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
            <GradientStop Color="#556" Offset="0"/>
            <GradientStop Color="#FF1D64FF" Offset="1"/>
        </LinearGradientBrush>
    </h:HelixViewport3D.Background>


    <!--相机-->
    <h:HelixViewport3D.Camera>
        <PerspectiveCamera Position="-1571, 4801, 3774"
                           LookDirection="2038, -5200, -2930"
                           FieldOfView="50"
                           UpDirection="-0.145, 0.372, 0.917"
                           FarPlaneDistance="10000"
                           NearPlaneDistance="1"/>
    </h:HelixViewport3D.Camera>
    <h:HelixViewport3D.RotateGesture>
        <MouseGesture MouseAction="LeftClick"/>
    </h:HelixViewport3D.RotateGesture>
    <h:HelixViewport3D.PanGesture>
        <MouseGesture MouseAction="RightClick"/>
    </h:HelixViewport3D.PanGesture>
    <!--========================HelixViewport3D对象的属性(结束)==========================-->


    <!--========================HelixViewport3D对象的内容(必须在属性配置之后)==========================-->

    <!--光源-->
    <!--<ModelVisual3D>
        <ModelVisual3D.Content>
            <Model3DGroup>
                <AmbientLight Color="White"/>
            </Model3DGroup>
        </ModelVisual3D.Content>
    
    
    
    </ModelVisual3D>-->
    <h:DefaultLights/>
    <!--网格线-->
    <h:GridLinesVisual3D Width="16000" Length="16000" Thickness="1"
                         Fill="#EEE" MinorDistance="100" MajorDistance="400"/>

    <!--模型-->
    <!--<ModelVisual3D x:Name="model">
        <ModelVisual3D.Content>
            <Model3DGroup>
                <GeometryModel3D> 
                    C#加载的一个stl模型文件
                </GeometryModel3D>
                
                <GeometryModel3D>
                    C#加载的一个stl模型文件
                </GeometryModel3D>
                
                <GeometryModel3D>
                    C#加载的一个stl模型文件
                </GeometryModel3D>
            </Model3DGroup>
        </ModelVisual3D.Content>
    </ModelVisual3D>-->
    
    
    <!--<ModelUIElement3D MouseLeftButtonDown="">
        <ModelUIElement3D.Model>
            <GeometryModel3D>
                C#加载的一个stl模型文件
            </GeometryModel3D>
        </ModelUIElement3D.Model>
    </ModelUIElement3D>-->

    <!--<ModelUIElement3D MouseLeftButtonDown="">
        <ModelUIElement3D.Model>
            <GeometryModel3D>
                C#加载的一个stl模型文件
            </GeometryModel3D>
        </ModelUIElement3D.Model>
    </ModelUIElement3D>-->

    <!--<ModelUIElement3D MouseLeftButtonDown="">
        <ModelUIElement3D.Model>
            <GeometryModel3D>
                C#加载的一个stl模型文件
            </GeometryModel3D>
        </ModelUIElement3D.Model>
    </ModelUIElement3D>-->

    <!--========================HelixViewport3D对象的内容(结束)==========================-->
</h:HelixViewport3D>


<StackPanel VerticalAlignment="Top">
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="1"/>
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="2"/>
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="3"/>
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="8"/>
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="9"/>
    <Slider Minimum="0" Maximum="360" Value="0" ValueChanged="Slider_ValueChanged" Tag="10"/>
</StackPanel>
cs 复制代码
/*stl文件*/
string[] model_files = System.IO.Directory.GetFiles($"{Environment.CurrentDirectory}/3D_Models");

ModelImporter importer = new ModelImporter();

//Model3DGroup group = new Model3DGroup();
foreach (var file in model_files)
{
    ModelUIElement3D mui = new ModelUIElement3D();
    // 关键的模型文件解析过程=》     GemotryModel3D
    var mg = importer.Load(file);
    var geo = mg.Children[0] as GeometryModel3D;

    geo.Material = NormalMaterial(Brushes.White);
    geo.BackMaterial = NormalMaterial(Brushes.White);

    mui.Model = geo;

    // 这里想办法添加鼠标动作
    //mui.MouseLeftButtonDown += (a, b) =>
    //{
    //    geo.Material = NormalMaterial(Brushes.Green);
    //    geo.BackMaterial = NormalMaterial(Brushes.Green);
    //};

    mui.MouseLeftButtonDown += Mui_MouseLeftButtonDown;

    //if (file.IndexOf("LINK1_CAD") > -1)
    //{
    //    RotateTransform3D rt = new RotateTransform3D();
    //    rt.Rotation = new AxisAngleRotation3D(new Vector3D(0, 0, 1), 0);
    //    rt.CenterX = 0;
    //    rt.CenterY = 0;
    //    rt.CenterZ = 0;
    //    mui.Transform = rt;

    //    currentMUI = mui;
    //}

    this.hv.Children.Add(mui);

    models.Add(mui);
}

//this.model.Content = group;
SetTransform();
相关推荐
ZC跨境爬虫17 小时前
跟着 MDN 学 HTML day_17:媒体与 Web Audio API 自动播放指南——策略、检测与最佳实践
前端·笔记·ui·html·音视频·媒体
冬奇Lab18 小时前
一天一个开源项目(第66篇):awesome-design.md - 让 AI 助你打造像素级 UI 的设计规范
人工智能·ui·设计规范
小姑爷18 小时前
微信4.1.5.16 UI树“消失”?UIAutomation实战复现+AI驱动RPA落地方案
人工智能·ui·微信
地平线开发者19 小时前
挑战杯“揭榜挂帅”|机器人领域·地平线赛题发布!共探智慧环卫清扫车新未来
人工智能·机器人
2601_9579648720 小时前
48V系统轻型巡检机器人锂电池完整设计方案要求(工业级智能巡检平台标准)【浩博电池】
人工智能·机器人
jerryinwuhan21 小时前
人工智能工程技术(智能机器人应用)基于赛教融合的项目递进式课程体系
人工智能·机器人
秋の本名21 小时前
第一章 鸿蒙生态架构与开发理念
华为·wpf·harmonyos
zdr尽职尽责21 小时前
UI同步屏幕自适应
ui
hoiii1871 天前
基于STM32的扫地机器人源码工程
stm32·单片机·机器人