可视化场景内部物体检测方法与流程

文档序号:30096218发布日期:2022-05-18 10:56阅读:99来源:国知局

1.本发明涉及可视化3d渲染技术领域,具体涉及一种可视化场景内部物体检测方法。


背景技术:

2.在目前的广告宣传中,主要是以二维平面图的方式展示商品。但是随着科技的进步尤其是3d建模技术的发展,使三维图像这种更能展示商品面貌的形式得以实现并推广使用。
3.three.js是一款3d制作工具,可以通过鼠标、键盘、拖拽等事件形成交互, 通过three.js可以实现全景视图,这些全景视图应用在房产、家装行业能够带来更直观的视觉体验。在电商行业利用three.js可以实现产品的3d效果,这样用户就可以360度全方位地观察商品了,带来更好的体验。但是现有的三维模型仅能够展示图像而不能对图形进行操作,不能很好的显示图形之间的连接关系,不利于推广使用。
4.公开于该背景技术部分的信息仅仅旨在加深对本发明总体背景技术的理解,而不应当被视为承认或以任何形式暗示该信息构成本领域技术人员所公知的现有技术。


技术实现要素:

5.本发明提供一种可视化场景内部物体检测方法,以解决对3d图形不方便操作的技术问题。
6.为解决上述技术问题,本发明采用如下技术方案:设计一种可视化场景内部物体检测方法,其特征在于,包括以下步骤:s1:建立能够被threejs引擎读取的可视化三维场景,该场景中包括需要移动的模型;s2:利用threejs引擎的raycaster对象的setfromcamera方法设置射线,该射线从屏幕中心指向鼠标点击的方向;s3:使用raycaster对象的intersectobject方法来遍历可视化场景内的模型判断是否有模型和当前射线相交;s4:返回和射线相交的模型并按照相交距离排序,距离最近的模型即为能够进行移动操作的模型。
7.进一步的,在步骤s2中,设置射线时需把点击屏幕的鼠标二维坐标转化为raycaster对象的setfromcamera方法需要的归一化坐标:获取鼠标在二维坐标系中距离左上角原点(0,0)的x轴的值clientx和距离原点的y轴的值clienty,二维坐标系的宽为width,高为height,则归一化坐标为mouse(mouse.x,mouse.y),其中,mouse.x = (clientx / width) * 2
ꢀ–ꢀ
1,mouse.y = (clienty / height) * 2 + 1。
8.进一步的,在步骤s4中,返回的模型组成一个数组,如果没有模型和射线相交,返回的是空数组,如果有和射线相交的模型,返回的数组内模型按照相交距离从近到远排序。
9.进一步的,在步骤s4中,利用intersectobject方法判断是否检测模型的子模型。
10.进一步的,在步骤s1中,建立可视化三维场景后需要进行初始化,以数组的形式保存从预设的全景点生成的场景模型,场景初始化、移动结束和旋转结束的时候计算出可移动点数组。
11.进一步的,在步骤s4中,返回的与射线相交的模型时去除保留的不可移动的模型。
12.进一步的,在步骤s4中,获取距离最近的模型时,首先点击画布发射射线并获取与该射线相交的第一个模型的位置向量m,遍历所有可移动的模型,逐个计算与m的距离,得到距离最短的点所在的模型即为执行移动操作的模型。
13.与现有技术相比,本发明的主要有益技术效果在于:1.本发明用于判断物体在可视化场景中是否符合移动的要求,如在当前场景中可以看到的家具就符合现实场景移动逻辑,比如墙体等就不符合移动的逻辑,将不符合移动逻辑的物体模型排除在外,以减少计算量,让符合移动的物体完成移动操作。
14.2.本发明使用射线遍历的方法,在threejs的框架下更容易操作,有助于三维图示的推广应用。
附图说明
15.图1为本发明检测方法的步骤流程图。
16.图2为本发明归一化坐标的示意图。
17.图3为本发明可视化场景的示意图。
18.图4为本发明可视化场景中射线的示意图。
具体实施方式
19.下面结合附图和实施例来说明本发明的具体实施方式,但以下实施例只是用来详细说明本发明,并不以任何方式限制本发明的范围。
20.以下实施例中所涉及或依赖的程序均为本技术领域的常规程序或简单程序,本领域技术人员均能根据具体应用场景做出常规选择或者适应性调整。
21.实施例一:一种可视化场景内部物体检测方法,参见图1,主要使用的是射线拾取,射线工具是threejs引擎的raycaster对象。raycaster对象接收4个参数,raycaster( origin, direction, near, far ),其中,origin:光线投射的起点向量,direction:被归一化的方向向量,near:近投射点,far:远投射点。另外,raycaster提供了setfromcamera( coords, camera )方法提供新的原点和方向向量来更新射线,其中,coords:归一化的鼠标二维坐标(方向坐标),camera:起点坐标(一般是相机的位置)。
22.首先,建立模型时将模型中相机的位置作为射线的起点,方向向量需要把点击屏幕的鼠标二维坐标转化为raycaster的setfromcamera方法需要的归一化坐标。参见图2,二维坐标系也就是屏幕坐标系,起点(0,0)在可视化场景画布的左上角,画布的宽是x轴,高是y轴。归一化坐标是标准设备坐标系里的坐标值,标准设备坐标系起点(0,0)在可视化场景的中心,左上角是(-1,1),右下角是(1,-1)。
23.屏幕坐标转换为归一化坐标的过程:首先,鼠标点击canvas画布(本实施例中承载模型的ui界面),获取到鼠标在屏幕
坐标系中距离左上角原点(0,0)的x轴的值clientx和距离原点的y轴的值clienty,canvas画布的宽为width,高为height。声明一个二维向量mouse = new three.vector2()来保存平面坐标,mouse.x = (clientx / width) * 2
ꢀ–ꢀ
1,mouse.y = (clienty / height) * 2 + 1,这样就得到了可供raycaster的setfromcamera方法使用的归一化坐标mouse。
24.模型建立以后,声明射线raycaster:let raycaster = new three.raycaster(),更新射线:raycaster.setfromcamera( mouse, camera )。此时射线从相机,也就是屏幕中心,向鼠标点击的方向发射,然后使用raycaster的intersectobject方法来遍历可视化场景内的模型判断是否有模型和当前射线相交。intersectobject方法返回所有与射线相交的模型,它是一个数组[],如果没有模型相交,返回的是空数组[],如果有相交的模型,数组内的模型按照相交距离从近到远排序[a,b,c,d,e]。参数为intersectobject(scene.children, true),scene.children是一个数组,即可视化场景中的所有模型物体,如果某个模型不需要参与检测,那也可以在这个数组中直接排除;第二个参数表示是否检测模型的后代,true表示是。模型都具有5个属性,point: 射线和模型相交的点的三维坐标,face: 射线和模型相交的三角面,faceindex: 射线和模型相交的三角面的索引,object: 和射线相交的模型对象,distance: 交点到相机的距离。
[0025]
然后,判断是否有和射线相交的模型,具体的,声明一个变量intersects保存返回的模型数据:let intersects = raycaster.intersectobject(scene.children, true),判断intersects是否是空数组:if ( intersects.length 》 0 ),length小于0表示当前射线和场景内的模型没有相交,大于0则表示有相交的模型。
[0026]
下面以房屋模型为例作进一步阐释,参见图3和图4,其中,预设的全景点就是可视化场景设定的移动位置,从模型中读取,并生成一个模型指它的位置。家具和墙体这两个模型是具有具体的名字的,这个名字可以预先设定,方便在射线拾取的时候识别是哪个模型。
[0027]
可视化场景初始化的时候会保存从预设的全景点生成的模型,保存在cubes中,cubes是数组,包含位置信息,位置信息在射线检测的时候会用到。场景初始化、移动结束和旋转结束的时候会计算出可移动点数组。初始化可移动数组为 views = [],用来保存可移动点。
[0028]
计算可移动点数组的方法:把场景中所有预设的全景点三维向量坐标转换为标准坐标系坐标,也就是射线raycaster的setfromcamera接收的归一化坐标参数,转换过程:以一个位置点a( 三维向量new three.vector3(x,y,z) )为例,先把a的坐标转换为屏幕坐标a1( 屏幕坐标-二维(x1,y1) ),再把a1转换为标准坐标系坐标a2(标准坐标系坐标-二维 new three.vector2(x2,y2)
ꢀ‑ꢀ
x2,y2值在-1到1之间)。a2就是射线可接收的参数。这个步骤在场景中位置点非常多的情况下计算量会非常大,这个时候可以判断a2的x2和y2值是否在-1到1之间,在这个区间,说明当前点在屏幕内,可以发射射线,不在-1到1之间说明当前点不在屏幕内,不发射射线,可以减少计算量。
[0029]
然后从相机点向每个全景点发射射线,根据与射线相交的模型来判断该点位是否可以移动。
[0030]
1. 遍历cubes获取全景点三维坐标;2.转换全景点三维坐标为标准坐标系坐标,用raycaster的setfromcamera方法以相机为起点向a2发射射线,再使用intersectobject方法获取到相交的模型数组
intersects = [a,b,c];3.遍历intersects,判断a,b,c的object的name属性以区别射线拾取到的物体,a.object是和射线相交的模型,a.object.name属性获取到模型的名字,墙和家具的名字是固定的,预设全景点指示模型的名字没有添加,所以是名字是空字符。name是空该模型就是指示点模型,name是家具的名字,该模型是家具,name是墙的名字,该模型就是墙。判断intersects 的过程要从第一个模型到指示点为止,如果指示点模型,也就是名字是空的模型之前没有出现墙的名字,那么a这个点就是可以移动的。默认移动方式是可穿透家具不可穿透墙壁。此时把a点保存到views中,views = [ a ]。
[0031]
4.遍历cubes结束之后就会得到所有可以移动的位置数据views。
[0032]
从可移动点数组views中求出距离最短的点作为移动点:首先点击画布的时候发射的射线可获取与射线相交的第一个模型的位置,也就是instersets的第一个模型的point属性,这个属性是一个三维向量m。遍历移动结束的时候计算得出的所有可移动点数组views,挨个计算views中的位置与m的距离,得到距离最短的点,执行移动方法完成移动。1. 鼠标点击画布,获取与射线相交的第一个模型的位置m(new three.vector3(x,yz))。2. 遍历views,如果views中没有数据[],就是没有可移动点,不执行移动方法。如果views中有一个数据[a],那么不用判断距离,直接执行移动方法移动到a点。如果views中有几个数据[a,b,c,d],需要遍历views,对比a,b,c,d到m的距离,方法是m.distanceto(a),对比距离最短的位置,得到最短距离的位置点并执行移动。
[0033]
上述可视化场景内部物体检测方法能够快速有效的判断物体在可视化场景中是否符合移动的要求,如在当前场景中可以看到的家具就符合现实场景移动逻辑,比如墙体等就不符合移动的逻辑,本发明将不符合移动逻辑的物体模型排除在外,以减少计算量,让符合移动的物体完成移动操作。
[0034]
上面结合附图和实施例对本发明作了详细的说明,但是,所属技术领域的技术人员能够理解,在不脱离本发明宗旨的前提下,还可以对上述实施例中的各个具体参数进行变更,或对相关方法步骤进行等同替代,从而形成多个具体的实施例,均为本发明的常见变化范围,在此不再一一详述。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1