首页> 中国专利> 一种基于VRML-JAVA的虚拟三维模型手动装配方法

一种基于VRML-JAVA的虚拟三维模型手动装配方法

摘要

一种基于VRML-JAVA的虚拟三维模型手动装配方法,依次有以下步骤:1)建立零件3D模型及其渲染模型;2)定义VRML装配模型;3)确定装配组及所含零件、零件个数:4)确定零件装配顺序:5)选择装配顺序正确的零件:6)动态调用零件节点:7)确定零件手动移动干涉范围:8)在VRML场景中三维方向手动移动零件:9)监听零件当前位置状态:10)确定零件装配位置正确:11)完成所有零件装配。可以克服对实物样件的依赖,有效地提高零件装配设计效益,具有异地协同手动装配零部件、碰撞干涉检测、装配正确信息提示以及增强零件外形真实感的功能;可以从任意方位观察、在三轴方向随意手动移动零件进行装配或拆卸。

著录项

  • 公开/公告号CN101620746A

    专利类型发明专利

  • 公开/公告日2010-01-06

    原文格式PDF

  • 申请/专利权人 深圳大学;

    申请/专利号CN200910109148.8

  • 发明设计人 娄燕;胡琳;张誉恒;

    申请日2009-07-29

  • 分类号G06T17/40;

  • 代理机构深圳市中知专利商标代理有限公司;

  • 代理人张皋翔

  • 地址 518060 广东省深圳市南山区南海大道3688号

  • 入库时间 2023-12-17 23:14:27

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-09-21

    未缴年费专利权终止 IPC(主分类):G06T19/00 授权公告日:20110914 终止日期:20150729 申请日:20090729

    专利权的终止

  • 2011-09-14

    授权

    授权

  • 2010-03-03

    实质审查的生效

    实质审查的生效

  • 2010-01-06

    公开

    公开

说明书

技术领域

本发明涉及零件模型装配,尤其是涉及一种基于VRML-JAVA的虚拟三维模型手动装配方法。

背景技术

在网络环境下对真实感增强的零件模型进行手动虚拟装配,为设计者提供具有交互性的三维虚拟场景,以便从任意方位观察和随意操纵装拆任何零件,是工程设计的重要环节之一。然而,在现有基于网络环境下的虚拟装配过程中,设计者只是对零件进行碰撞干涉检测,按零件装配顺序生成零件装配的动画演示,人机交互功能不强。有些虚拟零件装配模型无法达到真实模型外形,真实感不强,无法让设计者感受处于虚拟装配环境中;有些虚拟零件模型具有三维方向移动功能,但它是通过JAVA控制条控制移动零件模型,不能实现在虚拟场景中直接手动移动功能;有些虚拟零件模型具有手动移动功能,但不能实现三维方向的手动移动,也不能提示零件装配正确位置。

发明内容

本发明所要解决的技术问题是弥补上述现有技术的不足,设计一种基于VRML-JAVA的虚拟三维模型手动装配方法,这是一种在基于TCP/IP协议的网络中通过在用户端PC机配置JAVA和VRML表示文件后由设计者与设计环境以人机交互方式实现的手动装配方法,可以在网络环境下,实现机械三维零件模型异地协同虚拟装配。

本发明的技术问题通过以下技术方案予以解决。

这种基于VRML-JAVA的虚拟三维模型手动装配方法,依次有以下步骤:

1)建立零件3D模型及其渲染模型

包括以下子步骤:

1·1根据零件实际尺寸反求建立零件3D模型;

1·2利用UVW纹理坐标展开和烘焙技术处理,形成零件内外部纹理光照贴图,提高零件模型的真实感;

2)定义VRML装配模型

利用VRML自带外部接口将纹理3D模型转换成VRML格式模型,将纹理光照贴图图片和零件3D模型保存在一个文件夹里;

3)确定装配组及所含零件、零件个数

4)确定零件装配顺序

建立零件装配顺序错误信息提示,关键代码如下:

//定义一个标记点,赋予flag一个当前值0

int flag=0;

//定义零件装配顺序,建立顺序错误信息提示

public void int()

{this.add(b1);

 this.add(promt1,null)}

prompt1.setText(″错误!装配顺序出错!请先完成前面的装配步骤!″)

5)选择装配顺序正确的零件

如果选择零件的装配顺序正确,进入下一步骤;如果选择零件的装配顺序不正确,则重新选择零件;

6)动态调用零件节点

利用JAVA和VRML的EAI接口getNode()、getEventIn()函数,动态调用各零件节点,并动态加入零件节点和控制节点间的路由,关键代码如下:

//声明浏览方法

browser=Browser.getBrowser(this);

//定义浏览的实例parentFrame来找到VRML文件中parentNode节点的位置,以存放调用的模型

parentFrame=browser.getNode(″parentNode″);

partsFrame=browser.getNode(″parts″);

addEvent=(EventInMFNode)parentFrame.getEventIn(″addChildren″);

//调用VRML模型

Vrmlcode n=”Inline{url\”\”}”;

Trans l=browser.createVrmlFromString(vrmlcode n);

//给模型及其PlaneSensor节点动态添加路由

Browser.addRoute(Plane,”translation_changed”,Trans,”translation”);

7)确定零件手动移动干涉范围

确定各零件手动移动干涉长方体包围框,即确定长方体对角点坐标(x1,y1,z1)和(x2,y2,z2),关键代码如下:

Plane n=browser.create VrmlFormString(“DEF myPlane n PlaneSensor

{“+””+”maxPosition x1 y1 z1”+”mixPosition x2 y2 z2”});

8)在VRML场景中三维方向手动移动零件

在VRML场景中利用平面传感器planesensor{}实现三维方向手动移动零件,包括以下子步骤:

8·1由VRML的平面传感器节点实现X、Y轴手动移动零件;

8·2实现在z轴方向手动移动零件,需将零件节点和平面传感器节点绕X轴旋转90°,关键代码如下:

DEF plane_z Transform{};

//用于存放Z方向移动的零件

Children[DEF parts Transform{}];

//将plane_z的子坐标系旋转90°,包含PlaneSensor传感器以及parts零件节点在内

Rotation{1 0 0 1.571};

9)监听零件当前位置状态

利用JAVA的监听函数EventOutObserve()、callback()监听零件当前位置状态,反馈到控制平台,关键代码如下:

//定义监听函数

myObserver myOB=new myObserver();

myOB.init(browser,Trans 1[0],prompt3);

//定义对Trans1节点的监听方法

Trans 1[0].getEventOut(″translation″).advise    ((EventOutObserver)myOB,(Obj ect)prompt2);

//监听零件

class myObserver implements EventOutObserver{;

public void callback(EventOut who,double when,Object which){;

//定义tmp的数值类型并声明调用方法

Float tmp[]=((EventOutSFVec3f)

(_myTrans.getEventOut(″translation″))).getValue();

//通过对零件translation节点的监听,获取tmp数组的数组以实时显示零件的当前坐标

((Label)which).setText(″物体坐标:(″+DFormat.format(tmp[0])+″,″+DFormat.format(tmp[1])+″,″+DFormat.format(tmp[2])+″)″);

10)确定零件装配位置正确

当零件移动到指定正确位置后,反馈装配正确信息,同时消除零件节点和控制节点的路由,关键代码如下:

//通过零件的当前坐标判断零件是否装配正确

if(tmp[0]==0&&tmp[1]==0&&tmp[2]==0)

{showInfo.setText(″零件装配正确″);

//当零件装配正确时,赋予flag一个当前值+1的数值,使下一步装配得以进行

flag=1;

//当零件装配不正确时,返回至步骤8)手动移动零件,直至零件装配正确后,再进入下一步骤;

//删除当前零件PlaneSensor的路由,使零件固定在装配正确的位置上

browser.deleteRoute(Plane[0],″translation_changed″,Trans1[0],″translation″);

delEvent.setValue(n1);

addEvent.setValue(n2);

11)完成所有零件装配

当手动正确装配零件个数达到步骤3)确定的零件个数时,反馈装配操作完成信息,关键代码如下:

if(flag=n),其中n是步骤3)确定的零件个数;

{prompt1.setText(″装配已全部完成!″)}。

本发明与现有技术相比具有以下有益效果:

设计者采用本发明方法可以克服对实物样件的依赖,在与实际装配环境更加接近的网络环境下以人机交互方式实现机械三维零件模型异地协同手动虚拟装配,有效地提高零件装配设计效益,本发明方法具有异地协同手动装配零部件、碰撞干涉检测、装配正确信息提示,以及增强零件外形真实感的功能;设计者可以从任意方位观察、在三轴方向随意手动移动零件进行装配或拆卸。此外,本发明方法使用的虚拟三维模型手动装配系统,具有文件小,平台兼容性好的优点。

附图说明

图1是本发明具体实施方式的流程图;

图2是本发明的具体实施方式的手压阀的3D示意图;

图3是图2手压阀的填料的3D模型;

图4是图2手压阀的填料压盖的3D模型;

图5是图2手压阀的压盖螺母的3D模型;

图6是图5的压盖螺母的光照纹理渲染图;

图7是带有光照纹理的压盖螺母的3D示意图;

图8是图4的填料压盖装配顺序正确的提示实时显示;

图9是图4的填料压盖装配顺序错误的提示实时显示;

图10是图4的填料压盖手动移动时的坐标实时显示。

具体实施方式

下面对照附图并结合手压阀的具体手动装配对本发明作进一步的说明。这种手压阀需要手动装配的零件共有15个,按照装配顺序是弹簧座、弹簧、阀杆、填料、填料压盖、压盖螺母、托架、螺钉1、销钉1、螺钉2、销钉2、套筒、小轴、开口销和手柄。下面以其中的填料、填料压盖和压盖螺母为例,具体说明虚拟三维模型手动装配。

如图1所示的一种手压阀的虚拟三维模型手动装配方法,步骤如下:

1)建立手压阀零件3D模型及其渲染模型。

根据手压阀的实际尺寸,建立手压阀各个零件的3D模型及其装配模型,图3~5分别是填料、填料压盖和压盖螺母的3D模型;然后进行UVW纹理坐标展开,利用烘焙技术形成如图6的压盖螺母的带有纹理和光照的渲染图片,再将零件内外部贴图融合在所述图片上,实现零件内外部纹理光照同时贴图成如图7的带有纹理的压盖螺母,以增强零件模型的真实感;

2)定义VRML装配模型

利用VRML自带外部接口实现手压阀纹理3D模型转换成VRML格式模型,同时将手压阀光照纹理贴图图片和手压阀零件3D模型放在一个文件夹里;

3)确定手压阀手动装配零件及零件个数

通过具体零部件实际个数确定手压阀手动装配零件个数为如下15个:a弹簧座;b弹簧;c阀杆;d填料;e填料压盖;f压盖螺母;g托架;h螺钉1;i销钉1;j螺钉2;k销钉2;l套筒;m小轴;n开口销;o手柄;

4)确定手压阀手动装配15个零件的装配顺序

根据拆卸法和具体零部件结合分析确定手压阀的装配顺序如下:a→b→c→d→e→f→g→h→i→j→k→l→m→n→o,关键代码如下:

//定义一个标记点,赋予flag一个当前值0

int flag=0;

//定义零件装配顺序,建立顺序错误信息提示

public void int()

{this.add(a1);

 this.add(b2);

 this.add(promt1,null)}

 this.add(promt2,null)}

prompt1.setText(″错误!装配顺序出错!请先完成前面的装配步骤!″)

5)选择装配顺序正确的零件

如果选择零件的装配顺序正确,进入下一步骤;如果选择零件的装配顺序不正确,则重新选择零件;如进行e填料压盖零件装配时,图8为装配顺序正确选择填料压盖的提示实时显示。装配顺序正确,进入下一步骤装配;而图9为装配顺序错误选择压盖螺母的提示实时显示。装配顺序错误,则重新选择零件;

6)动态调用零件节点

利用JAVA和VRML的EAI接口getNode()、getEventIn()函数,动态调用手压阀各零件节点,并动态加入造型节点和控制节点间的路由,其中压盖螺母动态添加的关键代码如下:

//声明压盖螺母浏览方法

browser=Browser.getBrowser(this);

//定义浏览的实例parentFrame来找到VRML文件中parentNode节点的位置,以存放调用的压盖螺母模型

parentFrame=browser.getNode(″parentNode″);

partsFrame=browser.getNode(″parts″);

addEvent=(EventInMFNode)parentFrame.getEventIn(″addChildren″);

//调用压盖螺母VRML模型

vrmlcode6=″Inline{url\″yglm.wrl\″}″;

tj=browser.createVrmlFromString(vrmlcode6);

Plane6=browser.createVrmlFromString(″DEF myPlane6 PlaneSensor{″+″offset 0-8 0″+″maxPosition 0 0 0″+″minPosition 0-8 0}″);

//定义压盖螺母Transform节点用于存放零件

Trans6=browser.createVrmlFromString(vrmlcode);

vrmlcode=″DEF yglmTrans Transform{translation 0-8 0}″;

//给压盖螺母模型及其PlaneSensor节点动态添加路由

Browser.addRoute(Plane6,”translation_changed”,Trans6,”translation”);

7)确定零件手动移动干涉范围

根据手压阀各零件尺寸、结构确定手压阀各零件手动移动干涉长方体包围框范围,确定长方体对角点坐标(x1,y1,z1)和(x2,y2,z2),其中填料的手动移动范围是根据其实际尺寸确定长方体对角点坐标,其关键代码如下:

//(x1,y1,z1)=(-18,0,0),(x2,y2,z2)=(-22,0,0)

Plane1=browser.createVrmlFromString(″DEF myPlane1 PlaneSensor{″+″offset-18 0 0″+″maxPosition-18 0 0″+″minPosition-22 0 0}″);

8)在VRML场景中三维方向手动移动零件

在VRML场景中利用平面传感器planesensor{}实现三维方向手动移动零件,包括以下子步骤:

8·1由VRML的平面传感器节点实现X、Y轴手动移动压盖螺母零件;

8·2实现在z轴方向手动移动压盖螺母零件,需将零件节点和平面传感器节点绕X轴旋转90°,其中关键代码如下:

DEF plane_z Transform{}

//用于存放压盖螺母

Children[DEF parts Transform{}];

//将plane_z的子坐标系旋转90°,包含压盖螺母的PlaneSensor传感器以及其零件节点在内。

Rotation{1 0 0 1.571};

9)监听零件当前位置状态

利用JAVA的监听函数EventOutObserve()、callback()监听零件当前位置状态,反馈到控制平台,图10是填料压盖手动移动时的坐标实时显示,其关键代码如下:

//定义填料压盖监听函数

myObserver5myOB5=new myObserver5();

myOB5.init(browser,Trans6[0],prompt8);

Trans6[0].getEventOut(″translation″).advise    ((EventOutObserver)myOB5,(Object)prompt2);

//定义对Trans6节点的监听方法

Trans6[0].getEventOut(″translation″).advise    ((EventOutObserver)myOB,(Object)prompt6);

//监听填料压盖

server5implements EventOutObserver

{EventInSFVec3f trans;

float[]tmpTrans;

Node_myTrans;

DecimalFormat DFormat;

Label showInfo;

public void init(Browser browser,Node myTrans,Label lbl)

{_myTrans=myTrans;

//数值格式化

DFormat=new DecimalFormat(″##0.#″);

showInfo=lbl;}

public void callback(EventOut who,double when,Obj ect which){

//定义tmp的数值类型并声明调用方法

Float tmp[]=((EventOutSFVec3f)

(_myTrans.getEventOut(″translation″))).getValue();

//通过对填料压盖translation节点的监听,获取tmp数组的数组以实时显示零件的当前坐标

((Label)which).setText(″物体坐标:(″+DFormat.format(tmp[1])+″,″+DFormat.format(tmp[0])+″,″+DFormat.format(tmp[2])+″)″);

10)确定零件装配位置正确

当手压阀零件移动到指定正确位置,包括零件间的面面配合位置、轴孔配合位置、面面平齐位置后,反馈装配正确信息,同时消除零件节点和控制节点的路由,关键代码如下:

//通过压盖螺母的当前坐标判断压盖螺母是否装配正确

if(tmp[0]==0&&tmp[1]==0&&tmp[2]==0)

{showInfo.setText(″压盖螺母装配正确″);

b6.setBackground(Color2);

//当压盖螺母装配正确时,赋予flag一个当前值+1的数值,使下一步装配得以进行

flag=6;

//删除当前压盖螺母PlaneSensor的路由,使压盖螺母固定在装配正确的位置上

browser.deleteRoute

(Plane5[0],″translation_changed″,Trans6[0],″translation″);

delEvent.setValue(ft1);

addEvent.setValue(ft2);

11)完成所有零件装配

当手动正确装配零件个数达到步骤3)确定的零件个数15时,反馈装配操作完成信息,关键代码如下:

if(dlag=n),其中n是步骤3)确定的零件个数;

{prompt1.setText(″装配已全部完成!″)}。

以上内容是结合具体的实例实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下做出若干等同替代或明显变型,而且性能或用途相同,则应当视为属于本发明由所提交的权利要求书确定的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号