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

鼠标交互(没有强调场景的变换)
鼠标命中测试(HitTest   不推荐)
平面对象加载

数据绑定(数据与动作)   
 

环境配置与相关方法  
模型准备:Blender/SolidWorks
模型导入
HelixToolkit更多案例

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

顶部控件多轴控制

ui

<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后端

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

<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>
/*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();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/765110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Profibus转Modbus网关在智能化水处理系统优化改造的应用

一、背景 在现代水处理行业中&#xff0c;智能化系统的应用已经成为提高效率和降低成本的关键。特别是在水厂中&#xff0c;罐内压载水处理系统的自动化和监控对于保障水质安全至关重要。而在这一过程中需要将水泵、阀门、传感器等设备连接到中控系统上。 二、方案 在控制器与…

SpringBoot + 虚拟线程,性能炸裂!

一、什么是虚拟线程 虚拟线程是Java19开始增加的一个特性&#xff0c;和Golang的携程类似&#xff0c;一个其它语言早就提供的、且如此实用且好用的功能&#xff0c;作为一个Java开发者&#xff0c;早就已经望眼欲穿了。 二、虚拟线程和普通线程的区别 “虚拟”线程&#xf…

C语言+ MSSQL技术开发的 PACS系统源码:CT后处理技术之仿真内镜CTVE

C语言 MSSQL技术开发的 PACS系统源码&#xff1a;CT后处理技术之仿真内镜CTVE 仿真内窥镜VE VE是利用医学影像作为原始数据&#xff0c;融合图像处理、计算机图形学、科学计算可视化、虚拟现实技术&#xff0c;模拟传统光学内镜的一种技术。 又叫做腔内重建技术&#xff0c;是…

海参海胆数据集:探索现实世界水下图像增强的创新之旅(目标检测)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 在当今…

Nginx(http配置、https配置)访问Spring Boot 项目

前文 记录一下在linux服务器下配置nginx中nginx.conf文件代理访问springboot项目 1. spring boot.yml配置 其他mysql,redis,mybatis等之类的配置就不一一列出了 # 自定义配置 为了等下验证读取的配置文件环境 appName: productserver:port: 8083 # 应用服务 WEB 访问端口s…

我做了个C++算法学习网站,从语法到算法再到数据结构,全方位为算法竞赛小伙伴护航

哈喽&#xff0c;各位小伙伴大家好&#xff0c;我是大李。 最近半个月&#xff0c;我做了个《C算法宝典》并更新了40多篇教程&#xff0c;目前还在更新中&#xff0c;内容从语法到算法和数据结构&#xff0c;全方位为算法竞赛小伙伴护航。 温馨提示&#xff1a;如果你或你的朋…

PDF一键转PPT文件!这2个AI工具值得推荐,办公必备!

PDF转换为PPT文件&#xff0c;是职场上非常常见的需求&#xff0c;过去想要把PDF文件转换为PPT&#xff0c;得借助各种文件转换工具&#xff0c;但在如今AI技术主导的大背景下&#xff0c;我们在选用工具时有了更多的选择&#xff0c;最明显的就是基于AI技术打造的AI格式转换工…

Android 如何通过代码实时设置EditTextView光标

背景&#xff1a;换肤框架下&#xff0c;QA进行深色浅色切换说输入框光标颜色没有改变&#xff0c;转UI结果UI说需要修改&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 本来有方法可以设置&#xff0c;但是 设置后未生效。重新进入该页面才生效&#xff01;&a…

C++——list类用法指南

一、list的介绍 1、list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 2、list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素 …

在昇腾服务器上使用llama-factory对baichuan2-13b模型进行lora微调

什么是lora微调 LoRA 提出在预训练模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新&#xff0c;从而减少适配下游任务所需要训练的参数。 环境准备 这次使用到的微调框架是llama-factory。这个框架集成了对多种模型进行各种训练的代码&#xff0c;少量修改就可使用。 …

matplotlib mplot3d模块在Ubuntu 10.04中的问题与解决方法

在 Ubuntu 10.04 系统上使用 matplotlib 的 mplot3d 模块可能会遇到一些问题&#xff0c;主要涉及到库的安装和版本兼容性。Ubuntu 10.04 是一个比较老旧的版本&#xff0c;官方已经不再提供支持&#xff0c;这可能会导致一些库的版本较低&#xff0c;不支持最新的功能或修复。…

Flask 数据创建时出错

当我们在使用 Flask 创建数据时遇到错误&#xff0c;可能有多种原因&#xff0c;包括代码错误、数据库配置问题或依赖项错误。具体情况我会总结成一篇文章记录下&#xff0c;主要是归类总结一些常见的解决方法和调试步骤&#xff0c;帮助大家解决问题&#xff1a; 1、问题背景 …

自己分析的逆向案例八——中国新烟商盟登录密码加密

网址&#xff1a;会员登录 - 新商盟 登陆界面分析&#xff0c;找到登录接口&#xff0c;跟栈分析。 没有异步&#xff0c;也没有webpack,很简单的跟栈 打上断点&#xff0c;逐步网上找&#xff0c;找到$ajax老朋友 上面就有对密码加密的部分&#xff0c;是一个RSA加密。 b 被…

Git Flow 工作流学习要点

Git Flow 工作流学习要点 Git Flow — 流程图Git Flow — 操作指令优点&#xff1a;缺点&#xff1a;Git Flow 分支类型Git Flow 工作流程简述关于 feature 分支关于 Release 分支关于 hotfix 分支 总结 Git Flow — 流程图 图片来源&#xff1a;https://nvie.com/posts/a-succ…

三维家:SaaS的IT规模化降本之道|OceanBase 《DB大咖说》(十一)

OceanBase《DB大咖说》第 11 期&#xff0c;我们邀请到了三维家的技术总监庄建超&#xff0c;来分享他对数据库技术的理解&#xff0c;以及典型 SaaS 场景在数据库如何实现规模化降本的经验与体会。 庄建超&#xff0c;身为三维家的技术总监&#xff0c;独挑大梁&#xff0c;负…

分文件编译(简单学生系统)

定义学生基本信息 ①输出所有学生信息 ②删除某个学生后&#xff0c;输出所有学生信息 ③修改某个学生信息后&#xff0c;输出所有学生信息 ④查找某个学生的信息 main.c #include"k11*.h" int main(int argc, const char *argv[]) {struct student p[4]{{"…

注意!年龄越大,社交圈子越窄?其实这是老人的理性选择!数学家告诉你:何时该跳槽,何时该坚守!你必须知道的三个智慧:让你的人生更加精彩!

我们到底应该在什么情况下探索新事物&#xff0c;什么情况下专注于已有的东西呢&#xff1f;本质上来说&#xff0c;这个问题就是在询问&#xff0c;你究竟应该耗费精力去探索新的信息&#xff0c;还是专注从既有的信息中获取收获&#xff1f; 有人采访了临终的老人&#xff0c…

51单片机外部中断(按键识别)

欢迎入群共同学习交流 时间记录&#xff1a;2024/7/2 一、电路原理图 51单片机包含INT0、INT1两个外部中断接口 二、知识点介绍 1.中断寄存器位介绍 &#xff08;1&#xff09;TCON定时控制寄存器&#xff0c;位0&#xff08;IT0&#xff09;中断INT0请求信号选择位&#x…

win11电源设置

把钩子去掉以后 win11的电脑关机才有用 否则&#xff0c;关机了&#xff0c;电脑也实际上一直在运行

边缘计算网关在现代工业企业中的作用-天拓四方

随着工业4.0时代的到来&#xff0c;数字化转型已经成为工业企业发展的必然趋势。在这一过程中&#xff0c;边缘计算网关以其独特的优势&#xff0c;正逐渐成为工业企业实现智能化、高效化运营的关键技术。 边缘计算网关是一种部署在网络边缘的设备&#xff0c;它集成了计算、存…