CN110559660B - Unity3D场景中鼠标对物体的按面拖拽法及介质 - Google Patents
Unity3D场景中鼠标对物体的按面拖拽法及介质 Download PDFInfo
- Publication number
- CN110559660B CN110559660B CN201910711790.7A CN201910711790A CN110559660B CN 110559660 B CN110559660 B CN 110559660B CN 201910711790 A CN201910711790 A CN 201910711790A CN 110559660 B CN110559660 B CN 110559660B
- Authority
- CN
- China
- Prior art keywords
- camera
- dragged
- game object
- plane
- vector
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- A—HUMAN NECESSITIES
- A63—SPORTS; GAMES; AMUSEMENTS
- A63F—CARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
- A63F13/00—Video games, i.e. games using an electronically generated display having two or more dimensions
- A63F13/50—Controlling the output signals based on the game progress
- A63F13/52—Controlling the output signals based on the game progress involving aspects of the displayed game scene
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/01—Input arrangements or combined input and output arrangements for interaction between user and computer
- G06F3/048—Interaction techniques based on graphical user interfaces [GUI]
- G06F3/0484—Interaction techniques based on graphical user interfaces [GUI] for the control of specific functions or operations, e.g. selecting or manipulating an object, an image or a displayed text element, setting a parameter value or selecting a range
- G06F3/0486—Drag-and-drop
-
- A—HUMAN NECESSITIES
- A63—SPORTS; GAMES; AMUSEMENTS
- A63F—CARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
- A63F2300/00—Features of games using an electronically generated display having two or more dimensions, e.g. on a television screen, showing representations related to the game
- A63F2300/30—Features of games using an electronically generated display having two or more dimensions, e.g. on a television screen, showing representations related to the game characterized by output arrangements for receiving control signals generated by the game device
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Multimedia (AREA)
- Human Computer Interaction (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- User Interface Of Digital Computer (AREA)
- Processing Or Creating Images (AREA)
Abstract
本发明提供一种Unity3D场景中鼠标对物体的按面拖拽法,包括:1、创建一个平面游戏对象;2、将平面游戏对象放置于场景所在的平面与相机之间;3、在开始拖拽时,通过Unity内置的API获取鼠标所在的屏幕坐标,并在3维世界坐标中得到从相机发出经过所述屏幕坐标的射线;4、将射线的延长线与平面游戏对象的交点确定为目标位置,并计算目标位置;5、将被拖曳物体的位置变换成目标位置,则被拖曳物体就处于平面游戏对象上且在鼠标指针下,从而实现拖拽过程,只要平面游戏对象不与场景中其他物体相交,则被拖曳物体就不与其他物体重合。本发明还提供一种计算机可读存储介质,拖曳后避免被拖曳物体与场景中其他物体产生重合现象。
Description
技术领域
本发明涉及Unity3D技术领域,尤其涉及一种Unity3D场景中鼠标对物体的按面拖拽法及介质。
背景技术
目前在Unity3D场景中拖拽3D物体一般是物体与相机的视面平行,这样会导致被拖曳的物体在拖拽过程中容易和场景的其他物体发生重合,重合后会发生不好的视觉效果,影响用户体验,这是开发者不愿意让消费者看到的。为避免重合现象的发生,在使用Unity引擎拖拽物体时一般使用2种方法:
1、相机视面平行拖拽法:即被拖拽的物体是在一个与相机视面平行且与相机视面相隔一段距离x的拖曳面上拖拽,为了保证这个拖曳面上的任何一点不与场景中其他物体相重合,开发者经常需要调整x的数值,使该拖曳面处于相机视面和其他物体所在的平面之间,但由于相机视面需要考虑显示效果,不能够随意的更改角度,所以开发者只能根据经验慢慢去调整x的数值,但调整x的数值并不一定能给出满意的结果,调整起来比较困难,效率低下。
2、独立渲染融合法:设置一个新的相机b,相机b只渲染处于i层级(Layer)的物体,而原始相机a渲染除了i层级外的其他物体。当开发者需要让物体被拖拽时,将该物体的层级设置为i,此时它就能被相机b所渲染,而相机b所渲染出来的画面永远在相机a之上,所以即便在世界坐标空间(即3维坐标空间)中被拖拽物体与其他物体相互重合,但是由于相机a渲染的其他物体永远在下,相机b渲染的被拖拽物体永远在上,这样就不会发生重合现象了。但需要使用一个新的相机b单独拍摄被拖拽的物体,再与主相机a拍摄出来的图像进行融合,这样的做法操作和维护都比较麻烦。
发明内容
本发明要解决的技术问题之一,在于提供一种Unity3D场景中鼠标对物体的按面拖拽法,此拖曳法适合相机固定并且景深变化不大的场景中,在该场景下相机和场景中的物体之间手动设立一个被拖拽的面(平面游戏对象),由于这个面与场景中的物体不相交,所以当场景中被拖拽的物体在这个面上移动时,可以完全避免与场景中其他物体交叉碰撞产生重合的现象,也不用使用第二个相机单独拍摄被拖拽的物体。
本发明要解决的技术问题之一,是这样实现的:一种Unity3D场景中鼠标对物体的按面拖拽法,包括以下步骤:
步骤1、通过Unity3D引擎创建一个平面游戏对象;
步骤2、将所述平面游戏对象放置于场景所在的平面与相机之间;
步骤3、在开始拖拽场景中被拖曳的物体时,通过Unity内置的API获取鼠标所在的屏幕坐标,并在3维世界坐标中得到从相机发出经过所述屏幕坐标的射线;
步骤4、将该射线的延长线与平面游戏对象的交点确定为目标位置,并根据平面游戏对象的位置、相机所在的相机坐标和鼠标所在的屏幕坐标计算出该目标位置;
步骤5、获得目标位置后,将被拖曳的物体的位置变换成该目标位置,经过这个操作后被拖曳的物体的位置就在目标位置上,即该被拖曳的物体就处于平面游戏对象上,且在鼠标指针下,从而实现被拖曳的物体的拖拽过程,只要平面游戏对象不与场景中除被拖曳的物体以外的其他物体相交,则被拖曳的物体就不与其他物体重合。
进一步地,所述步骤4中平面游戏对象的位置、相机所在的相机坐标和鼠标所在的屏幕坐标计算出该目标位置,具体计算方法为:
将所述平面游戏对象命名为p,p具有两个关键属性:p.distance和p.normal,其中,p.distance表示与坐标原点的距离,p.normal表示朝向;设p的中心坐标为F,由p.normal和F确定一单位向量FG,设相机所在的相机坐标为C、鼠标所在的屏幕坐标为D,由C和D构成一单位向量CD,并由C和D确定出一条端点为C的射线r,r具有两个关键属性:r.origin及r.direction,其中,r.origin表示射线位置,即C的坐标,r.direction表示射线方向;
1)获取从相机到p的中心的距离向量CF:向量CF=p.distance*p.normal–r.origin;
2)将向量CF与向量FG进行点乘,获得向量CF在向量FG方向上的的长度dist,即线段CE的距离值;
3)将向量CD与向量FG进行点乘,获得向量CD与向量FG的比例值pn;
4)将线段CE的距离值除以比例值pn,获得C沿着射线方向r.direction到p的长度值x,即线段CH的距离值;
5)单位向量CD乘以x得到向量CH,再加上r.origin,获得最终拖拽的目标位置H,如果射线r与p平行,则射线r与p之间没有焦点,不能获得目标位置H。
进一步地,所述步骤2之后还包括:所述平面游戏对象为可视化界面,通过可视化界面观察确定平面游戏对象是否与场景中的物体相交,若相交,则通过编辑器进行编辑,从而调整平面游戏对象的位置,使得平面游戏对象与场景中的物体不相交;若不相交,则不调整平面游戏对象的位置。
进一步地,所述相机为透视相机,所述平面游戏对象与相机的视面平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致;所述平面游戏对象与相机的视面不平行时,平面游戏对象上被拖曳的物体位于靠近相机的视面区域,则拖曳时比拖曳前的尺寸大,平面游戏对象上被拖曳的物体位于远离相机的视面区域,则拖曳时比拖曳前的尺寸小。
进一步地,所述相机为正交相机,所述平面游戏对象与相机的视面平行或不平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致。
本发明要解决的技术问题之二,在于提供一种计算机可读存储介质,此介质适合相机固定并且景深变化不大的场景中,在该场景下相机和场景中的物体之间手动设立一个被拖拽的面(平面游戏对象),由于这个面与场景中的物体不相交,所以当场景中被拖拽的物体在这个面上移动时,可以完全避免与场景中其他物体交叉碰撞产生重合的现象,也不用使用第二个相机单独拍摄被拖拽的物体。
本发明要解决的技术问题之一,是这样实现的:一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:
步骤1、通过Unity3D引擎创建一个平面游戏对象;
步骤2、将所述平面游戏对象放置于场景所在的平面与相机之间;
步骤3、在开始拖拽场景中被拖曳的物体时,通过Unity内置的API获取鼠标所在的屏幕坐标,并在3维世界坐标中得到从相机发出经过所述屏幕坐标的射线;
步骤4、将该射线的延长线与平面游戏对象的交点确定为目标位置,并根据平面游戏对象的位置、相机所在的相机坐标和鼠标所在的屏幕坐标计算出该目标位置;
步骤5、获得目标位置后,将被拖曳的物体的位置变换成该目标位置,经过这个操作后被拖曳的物体的位置就在目标位置上,即该被拖曳的物体就处于平面游戏对象上,且在鼠标指针下,从而实现被拖曳的物体的拖拽过程,只要平面游戏对象不与场景中除被拖曳的物体以外的其他物体相交,则被拖曳的物体就不与其他物体重合。
进一步地,所述步骤4中平面游戏对象的位置、相机所在的相机坐标和鼠标所在的屏幕坐标计算出该目标位置,具体计算方法为:
将所述平面游戏对象命名为p,p具有两个关键属性:p.distance和p.normal,其中,p.distance表示与坐标原点的距离,p.normal表示朝向;设p的中心坐标为F,由p.normal和F确定一单位向量FG,设相机所在的相机坐标为C、鼠标所在的屏幕坐标为D,由C和D构成一单位向量CD,并由C和D确定出一条端点为C的射线r,r具有两个关键属性:r.origin及r.direction,其中,r.origin表示射线位置,即C的坐标,r.direction表示射线方向;
1)获取从相机到p的中心的距离向量CF:向量CF=p.distance*p.normal–r.origin;
2)将向量CF与向量FG进行点乘,获得向量CF在向量FG方向上的的长度dist,即线段CE的距离值;
3)将向量CD与向量FG进行点乘,获得向量CD与向量FG的比例值pn;
4)将线段CE的距离值除以比例值pn,获得C沿着射线方向r.direction到p的长度值x,即线段CH的距离值;
5)单位向量CD乘以x得到向量CH,再加上r.origin,获得最终拖拽的目标位置H,如果射线r与p平行,则射线r与p之间没有焦点,不能获得目标位置H。
进一步地,所述步骤2之后还包括:所述平面游戏对象为可视化界面,通过可视化界面观察确定平面游戏对象是否与场景中的物体相交,若相交,则通过编辑器进行编辑,从而调整平面游戏对象的位置,使得平面游戏对象与场景中的物体不相交;若不相交,则不调整平面游戏对象的位置。
进一步地,所述相机为透视相机,所述平面游戏对象与相机的视面平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致;所述平面游戏对象与相机的视面不平行时,平面游戏对象上被拖曳的物体位于靠近相机的视面区域,则拖曳时比拖曳前的尺寸大,平面游戏对象上被拖曳的物体位于远离相机的视面区域,则拖曳时比拖曳前的尺寸小。
进一步地,所述相机为正交相机,所述平面游戏对象与相机的视面平行或不平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致。
本发明具有如下优点:
1、本发明相对于相机视面平行拖拽法而言,本方法增加了独立的拖拽面,并且通过Unity编辑器的可视化功能达到了最大程度的减少被拖拽物体与其他物体重合的机会,并且只需增加一个简单算法即可避免对拖曳面调整困难和效率低下等缺点,代码量少,被拖拽物体不需要设置独立图层;
2、本发明相对于独立渲染融合法来说,本方法不需要独立摄像机拍摄被拖拽物体,无需做到独立渲染融合法的任何复杂操作即可避免不好的用户体验;另外,一般来说独立渲染融合法使用了2个相机,理论上来说就有2个视面,开发者可以将视面通过一定的角度重合来达到被拖拽物体近大远小的效果,因为2个面有一定的夹角导致面上的一点到另外一个面的垂直距离永远是不同的;而此效果在方法1上是不可实现的(被拖拽面和相机视面相互平行,面上点与点的垂直距离永远是相等的);而本方法因为添加了一个新的独立面,所以通过两个面(相机视面与独立面)夹角的调节也可以实现被拖拽物体的近大远小(放大或缩小)的效果。
附图说明
下面参照附图结合实施例对本发明作进一步的说明。
图1为本发明一种Unity3D场景中鼠标对物体的按面拖拽法执行流程图。
图2为本发明中相机与平面游戏对象在坐标系中的示意图(坐标原点位于平面游戏对象中)。
图3为本发明中相机与平面游戏对象在坐标系中的示意图(坐标原点不位于平面游戏对象中)。
图4为本发明中透视相机的可视区域二维示意图。
图5为本发明中正交相机的可视区域二维示意图。
具体实施方式
为使得本发明更明显易懂,现以一优选实施例,并配合附图作详细说明如下。
本发明的方法适合相机固定并且景深变化不大的场景中,在相机视面平行拖拽法的基础上,引入了一个独立的平面,该平面在场景的其他物体与相机之间,相当于一张白纸面向相机遮在其他物体面前,把两者区分开来,然后通过算法可以使得物体在拖拽时在屏幕空间下能在鼠标指针处,在世界坐标下能在独立的平面上不与其他物体重合。
如图1至图5所示,本发明的一种Unity3D场景中鼠标对物体的按面拖拽法,包括以下步骤:
步骤1、通过Unity3D引擎创建一个平面游戏对象(Plane GameObject),Unity可以运行由建模软件创建的任意3D模型。然而,也有一些可以直接在Unity创建的基本的对象类型,如立方体、球体、胶囊、圆柱体、平面和四边形。这些对象往往很有用(例如,plane是常用的是一个平坦的地面),但他们也提供了一个快速方法来创建占位符和原型用于测试目的。任何基本对象通过GameObject>3D Objec菜单对应的项添加到场景。Unity3D引擎可创建一个在局部坐标空间XZ平面上边长10单位的平面正方形;
步骤2、将所述平面游戏对象放置于场景所在的平面与相机之间,其目的是使平面游戏对象不与场景上的其他已有的物体重合,并且又在相机的视面范围内;所述平面游戏对象为可视化界面,通过可视化界面观察确定平面游戏对象是否与场景中的物体相交,若相交,说明若将被拖曳的物体拖曳到该平面游戏对象中,有可能会与其他物体发生重合现象,则需要通过编辑器进行编辑,从而调整平面游戏对象的位置,使得平面游戏对象与场景中的物体不相交;若不相交,说明若将被拖曳的物体拖曳到该平面游戏对象中,不会与其他物体发生重合现象,则不调整平面游戏对象的位置;由于平面游戏对象具有可视化功能,使得平面游戏对象在设计时就可以通过编辑器看到被拖拽物体的移动区间(即该平面游戏对象),避免预估带来的不准确问题导致的反复修改;
步骤3、开发者在开始拖拽场景中被拖曳的物体时,通过Unity内置的API获取鼠标所在的屏幕坐标(cam.ScreenPointToRay(Input.mousePosition),即鼠标在屏幕的准确点击位置,也就是鼠标的点击坐标),并在3维世界坐标中得到从相机发出经过所述屏幕坐标的射线;
步骤4、将该射线的延长线与平面游戏对象的交点确定为目标位置,并根据平面游戏对象的位置、相机所在的相机坐标和鼠标所在的屏幕坐标计算出该目标位置;具体计算方法为:
如图2和图3所示,将所述平面游戏对象命名为p,p具有两个关键属性:p.distance和p.normal,其中,p.distance表示与坐标原点(0,0,0)的距离,p.normal表示朝向(图2和图3的线段AB即为p的2维示意图);设p的中心坐标为F,由p.normal和F确定一单位向量FG,设相机所在的相机坐标为C、鼠标所在的屏幕坐标为D,由C和D构成一单位向量CD,并由C和D确定出一条端点为C的射线r,该射线的原点为相机坐标,方向为鼠标在屏幕上的点映射到3维世界的坐标和原点所形成的射线,r具有两个关键属性:r.origin及r.direction,其中,r.origin表示射线位置,即C的坐标,r.direction表示射线方向;
1)获取从相机到p的中心的距离向量CF:向量CF=p.distance*p.normal–r.origin;
2)将向量CF与向量FG进行点乘,获得向量CF在向量FG方向上的的长度dist,即线段CE的距离值,E为p上的点且CE⊥AB;
3)将向量CD与向量FG进行点乘,获得向量CD与向量FG的比例值pn;
4)将线段CE的距离值除以比例值pn,获得C沿着射线方向r.direction到p的长度值x,即线段CH的距离值,H为p上的目标位置,即最终被拖曳的物体要变换到的位置;
5)单位向量CD乘以x得到向量CH,再加上r.origin(C的坐标),获得最终拖拽的目标位置H,如果射线r与p平行,则射线r与p之间没有焦点,不能获得目标位置H。
其中,2)和3)是通过向量的点乘法公式得到的:
当向量a和向量b都是单位向量时,a与b点乘可得a到b的比例关系,即对3)的应用;
当非单位向量a和单位向量b时,a与b点乘能获得a在向量b方向上长度,即对2)的应用。
步骤5、获得目标位置H后,将被拖曳的物体(以下称作O)的位置(transform.position)设置为该目标位置H,经过这个操作以后o的位置就在H上,也就是说该被拖曳的物体o就处于平面游戏对象p上,且在鼠标指针下,从而实现被拖曳的物体的拖拽过程,只要平面游戏对象不与场景中除被拖曳的物体以外的其他物体相交,则被拖曳的物体就不与其他物体重合,这就避开了与场景其他物体相互重合的可能。
平面游戏对象与相机的视面平行或不平行的示意图均如图2所示,所述相机为透视相机,所述平面游戏对象与相机的视面平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致;所述平面游戏对象与相机的视面不平行时,平面游戏对象上被拖曳的物体位于靠近相机的视面区域,则拖曳时比拖曳前的尺寸大,平面游戏对象上被拖曳的物体位于远离相机的视面区域,则拖曳时比拖曳前的尺寸小,从而呈现近大远小的效果。
所述相机为正交相机,所述平面游戏对象与相机的视面平行或不平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致。
相机还有2种类型:一种是正交相机,没有进大远小的概念,因为正交相机在屏幕所发出的射线方向永远一致,一种叫透视相机,有近大远小的概念。当采用透视相机时,出现近大远小的效果,当采用正交相机时,前后大小不变。图4为透视相机的可视区域二维示意图,假设屏幕是E'F',那鼠标点在(6,0)处,那鼠标在屏幕6/18=1/3处的位置,当屏幕处于H'I'处的时候,鼠标就处于J'点,因为3H'J'=H'I',屏幕所看到的部分是A'E'F'这个区域,然后A'D'是屏幕所指的方向,处于相机的正前方,而相机视面一般说的就是在A'E'F'区域中任何与A'D'垂直的面,屏幕上的坐标其实指的就是A'E'F'区域中选择一个任意的距离n,并且与A'D'垂直的面,然后根据屏幕坐标和屏幕大小的比例算出一个点.这个点和相机所组成的射线就代表鼠标所指的方向。相机有个设定是视觉范围值,这个范围值叫fov,角E'A'F'就是透视相机的fov。图5为正交相机的可视区域二维示意图,是一个长方体,由于这个区域任意一个面的大小都是一样的,所以发出的射线永远和相机正前方朝向相同。
如图1至图5所示,本发明的一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:
步骤1、通过Unity3D引擎创建一个平面游戏对象(Plane GameObject),Unity可以运行由建模软件创建的任意3D模型。然而,也有一些可以直接在Unity创建的基本的对象类型,如立方体、球体、胶囊、圆柱体、平面和四边形。这些对象往往很有用(例如,plane是常用的是一个平坦的地面),但他们也提供了一个快速方法来创建占位符和原型用于测试目的。任何基本对象通过GameObject>3D Objec菜单对应的项添加到场景。Unity3D引擎可创建一个在局部坐标空间XZ平面上边长10单位的平面正方形;
步骤2、将所述平面游戏对象放置于场景所在的平面与相机之间,其目的是使平面游戏对象不与场景上的其他已有的物体重合,并且又在相机的视面范围内;所述平面游戏对象为可视化界面,通过可视化界面观察确定平面游戏对象是否与场景中的物体相交,若相交,说明若将被拖曳的物体拖曳到该平面游戏对象中,有可能会与其他物体发生重合现象,则需要通过编辑器进行编辑,从而调整平面游戏对象的位置,使得平面游戏对象与场景中的物体不相交;若不相交,说明若将被拖曳的物体拖曳到该平面游戏对象中,不会与其他物体发生重合现象,则不调整平面游戏对象的位置;由于平面游戏对象具有可视化功能,使得平面游戏对象在设计时就可以通过编辑器看到被拖拽物体的移动区间(即该平面游戏对象),避免预估带来的不准确问题导致的反复修改;
步骤3、开发者在开始拖拽场景中被拖曳的物体时,通过Unity内置的API获取鼠标所在的屏幕坐标(cam.ScreenPointToRay(Input.mousePosition),即鼠标在屏幕的准确点击位置,也就是鼠标的点击坐标),并在3维世界坐标中得到从相机发出经过所述屏幕坐标的射线;
步骤4、将该射线的延长线与平面游戏对象的交点确定为目标位置,并根据平面游戏对象的位置、相机所在的相机坐标和鼠标所在的屏幕坐标计算出该目标位置;具体计算方法为:
如图2和图3所示,将所述平面游戏对象命名为p,p具有两个关键属性:p.distance和p.normal,其中,p.distance表示与坐标原点(0,0,0)的距离,p.normal表示朝向(图2和图3的线段AB即为p的2维示意图);设p的中心坐标为F,由p.normal和F确定一单位向量FG,设相机所在的相机坐标为C、鼠标所在的屏幕坐标为D,由C和D构成一单位向量CD,并由C和D确定出一条端点为C的射线r,该射线的原点为相机坐标,方向为鼠标在屏幕上的点映射到3维世界的坐标和原点所形成的射线,r具有两个关键属性:r.origin及r.direction,其中,r.origin表示射线位置,即C的坐标,r.direction表示射线方向;
1)获取从相机到p的中心的距离向量CF:向量CF=p.distance*p.normal–r.origin;
2)将向量CF与向量FG进行点乘,获得向量CF在向量FG方向上的的长度dist,即线段CE的距离值,E为p上的点且CE⊥AB;
3)将向量CD与向量FG进行点乘,获得向量CD与向量FG的比例值pn;
4)将线段CE的距离值除以比例值pn,获得C沿着射线方向r.direction到p的长度值x,即线段CH的距离值,H为p上的目标位置,即最终被拖曳的物体要变换到的位置;
5)单位向量CD乘以x得到向量CH,再加上r.origin(C的坐标),获得最终拖拽的目标位置H,如果射线r与p平行,则射线r与p之间没有焦点,不能获得目标位置H。
其中,2)和3)是通过向量的点乘法公式得到的:
当向量a和向量b都是单位向量时,a与b点乘可得a到b的比例关系,即对3)的应用;
当非单位向量a和单位向量b时,a与b点乘能获得a在向量b方向上长度,即对2)的应用。
步骤5、获得目标位置H后,将被拖曳的物体(以下称作O)的位置(transform.position)设置为该目标位置H,经过这个操作以后o的位置就在H上,也就是说该被拖曳的物体o就处于平面游戏对象p上,且在鼠标指针下,从而实现被拖曳的物体的拖拽过程,只要平面游戏对象不与场景中除被拖曳的物体以外的其他物体相交,则被拖曳的物体就不与其他物体重合,这就避开了与场景其他物体相互重合的可能。
平面游戏对象与相机的视面平行或不平行的示意图均如图2所示,所述相机为透视相机,所述平面游戏对象与相机的视面平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致;所述平面游戏对象与相机的视面不平行时,平面游戏对象上被拖曳的物体位于靠近相机的视面区域,则拖曳时比拖曳前的尺寸大,平面游戏对象上被拖曳的物体位于远离相机的视面区域,则拖曳时比拖曳前的尺寸小,从而呈现近大远小的效果。
所述相机为正交相机,所述平面游戏对象与相机的视面平行或不平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致。
相机还有2种类型:一种是正交相机,没有进大远小的概念,因为正交相机在屏幕所发出的射线方向永远一致,一种叫透视相机,有近大远小的概念。当采用透视相机时,出现近大远小的效果,当采用正交相机时,前后大小不变。图4为透视相机的可视区域二维示意图,假设屏幕是E'F',那鼠标点在(6,0)处,那鼠标在屏幕6/18=1/3处的位置,当屏幕处于H'I'处的时候,鼠标就处于J'点,因为3H'J'=H'I',屏幕所看到的部分是A'E'F'这个区域,然后A'D'是屏幕所指的方向,处于相机的正前方,而相机视面一般说的就是在A'E'F'区域中任何与A'D'垂直的面,屏幕上的坐标其实指的就是A'E'F'区域中选择一个任意的距离n,并且与A'D'垂直的面,然后根据屏幕坐标和屏幕大小的比例算出一个点.这个点和相机所组成的射线就代表鼠标所指的方向。相机有个设定是视觉范围值,这个范围值叫fov,角E'A'F'就是透视相机的fov。图5为正交相机的可视区域二维示意图,是一个长方体,由于这个区域任意一个面的大小都是一样的,所以发出的射线永远和相机正前方朝向相同。
本发明的优点如下:
1、本发明相对于相机视面平行拖拽法而言,本方法增加了独立的拖拽面,并且通过Unity编辑器的可视化功能达到了最大程度的减少被拖拽物体与其他物体重合的机会,并且只需增加一个简单算法即可避免对拖曳面调整困难和效率低下等缺点,代码量少,被拖拽物体不需要设置独立图层;
2、本发明相对于独立渲染融合法来说,本方法不需要独立摄像机拍摄被拖拽物体,无需做到独立渲染融合法的任何复杂操作即可避免不好的用户体验;另外,一般来说独立渲染融合法使用了2个相机,理论上来说就有2个视面,开发者可以将视面通过一定的角度重合来达到被拖拽物体近大远小的效果,因为2个面有一定的夹角导致面上的一点到另外一个面的垂直距离永远是不同的;而此效果在方法1上是不可实现的(被拖拽面和相机视面相互平行,面上点与点的垂直距离永远是相等的);而本方法因为添加了一个新的独立面,所以通过两个面(相机视面与独立面)夹角的调节也可以实现被拖拽物体的近大远小(放大或缩小)的效果。
虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。
Claims (8)
1.一种Unity3D场景中鼠标对物体的按面拖拽法,其特征在于:包括以下步骤:
步骤1、通过Unity3D引擎创建一个平面游戏对象;
步骤2、将所述平面游戏对象放置于场景所在的平面与相机之间;
步骤3、在开始拖拽场景中被拖曳的物体时,通过Unity内置的API获取鼠标所在的屏幕坐标,并在3维世界坐标中得到从相机发出经过所述屏幕坐标的射线;
步骤4、将该射线的延长线与平面游戏对象的交点确定为目标位置,并根据平面游戏对象的位置、相机所在的相机坐标和鼠标所在的屏幕坐标计算出该目标位置;
步骤5、获得目标位置后,将被拖曳的物体的位置变换成该目标位置,经过这个操作后被拖曳的物体的位置就在目标位置上,即该被拖曳的物体就处于平面游戏对象上,且在鼠标指针下,从而实现被拖曳的物体的拖拽过程,只要平面游戏对象不与场景中除被拖曳的物体以外的其他物体相交,则被拖曳的物体就不与其他物体重合;
所述步骤4中平面游戏对象的位置、相机所在的相机坐标和鼠标所在的屏幕坐标计算出该目标位置,具体计算方法为:
将所述平面游戏对象命名为p,p具有两个关键属性:p.distance和p.normal,其中,p.distance表示与坐标原点的距离,p.normal表示朝向;设p的中心坐标为F,由p.normal和F确定一单位向量FG,设相机所在的相机坐标为C、鼠标所在的屏幕坐标为D,由C和D构成一单位向量CD,并由C和D确定出一条端点为C的射线r,r具有两个关键属性:r.origin及r.direction,其中,r.origin表示射线位置,即C的坐标,r.direction表示射线方向;
1)获取从相机到p的中心的距离向量CF:向量CF=
p.distance*p.normal–r.origin;
2)将向量CF与向量FG进行点乘,获得向量CF在向量FG方向上的长度dist,即线段CE的距离值;
3)将向量CD与向量FG进行点乘,获得向量CD与向量FG的比例值pn;
4)将线段CE的距离值除以比例值pn,获得C沿着射线方向r.direction到p的长度值x,即线段CH的距离值;
5)单位向量CD乘以x得到向量CH,再加上r.origin,获得最终拖拽的目标位置H,如果射线r与p平行,则射线r与p之间没有焦点,不能获得目标位置H。
2.根据权利要求1所述的一种Unity3D场景中鼠标对物体的按面拖拽法,其特征在于:所述步骤2之后还包括:所述平面游戏对象为可视化界面,通过可视化界面观察确定平面游戏对象是否与场景中的物体相交,若相交,则通过编辑器进行编辑,从而调整平面游戏对象的位置,使得平面游戏对象与场景中的物体不相交;若不相交,则不调整平面游戏对象的位置。
3.根据权利要求1所述的一种Unity3D场景中鼠标对物体的按面拖拽法,其特征在于:所述相机为透视相机,所述平面游戏对象与相机的视面平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致;所述平面游戏对象与相机的视面不平行时,平面游戏对象上被拖曳的物体位于靠近相机的视面区域,则拖曳时比拖曳前的尺寸大,平面游戏对象上被拖曳的物体位于远离相机的视面区域,则拖曳时比拖曳前的尺寸小。
4.根据权利要求1所述的一种Unity3D场景中鼠标对物体的按面拖拽法,其特征在于:所述相机为正交相机,所述平面游戏对象与相机的视面平行或不平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致。
5.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现以下步骤:
步骤1、通过Unity3D引擎创建一个平面游戏对象;
步骤2、将所述平面游戏对象放置于场景所在的平面与相机之间;
步骤3、在开始拖拽场景中被拖曳的物体时,通过Unity内置的API获取鼠标所在的屏幕坐标,并在3维世界坐标中得到从相机发出经过所述屏幕坐标的射线;
步骤4、将该射线的延长线与平面游戏对象的交点确定为目标位置,并根据平面游戏对象的位置、相机所在的相机坐标和鼠标所在的屏幕坐标计算出该目标位置;
步骤5、获得目标位置后,将被拖曳的物体的位置变换成该目标位置,经过这个操作后被拖曳的物体的位置就在目标位置上,即该被拖曳的物体就处于平面游戏对象上,且在鼠标指针下,从而实现被拖曳的物体的拖拽过程,只要平面游戏对象不与场景中除被拖曳的物体以外的其他物体相交,则被拖曳的物体就不与其他物体重合;
所述步骤4中平面游戏对象的位置、相机所在的相机坐标和鼠标所在的屏幕坐标计算出该目标位置,具体计算方法为:
将所述平面游戏对象命名为p,p具有两个关键属性:p.distance和p.normal,其中,p.distance表示与坐标原点的距离,p.normal表示朝向;设p的中心坐标为F,由p.normal和F确定一单位向量FG,设相机所在的相机坐标为C、鼠标所在的屏幕坐标为D,由C和D构成一单位向量CD,并由C和D确定出一条端点为C的射线r,r具有两个关键属性:r.origin及r.direction,其中,r.origin表示射线位置,即C的坐标,r.direction表示射线方向;
1)获取从相机到p的中心的距离向量CF:向量CF=
p.distance*p.normal–r.origin;
2)将向量CF与向量FG进行点乘,获得向量CF在向量FG方向上的长度dist,即线段CE的距离值;
3)将向量CD与向量FG进行点乘,获得向量CD与向量FG的比例值pn;
4)将线段CE的距离值除以比例值pn,获得C沿着射线方向r.direction到p的长度值x,即线段CH的距离值;
5)单位向量CD乘以x得到向量CH,再加上r.origin,获得最终拖拽的目标位置H,如果射线r与p平行,则射线r与p之间没有焦点,不能获得目标位置H。
6.根据权利要求5所述的一种计算机可读存储介质,其特征在于:所述步骤2之后还包括:所述平面游戏对象为可视化界面,通过可视化界面观察确定平面游戏对象是否与场景中的物体相交,若相交,则通过编辑器进行编辑,从而调整平面游戏对象的位置,使得平面游戏对象与场景中的物体不相交;若不相交,则不调整平面游戏对象的位置。
7.根据权利要求5所述的一种计算机可读存储介质,其特征在于:所述相机为透视相机,所述平面游戏对象与相机的视面平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致;所述平面游戏对象与相机的视面不平行时,平面游戏对象上被拖曳的物体位于靠近相机的视面区域,则拖曳时比拖曳前的尺寸大,平面游戏对象上被拖曳的物体位于远离相机的视面区域,则拖曳时比拖曳前的尺寸小。
8.根据权利要求5所述的一种计算机可读存储介质,其特征在于:所述相机为正交相机,所述平面游戏对象与相机的视面平行或不平行时,平面游戏对象上被拖曳的物体在拖曳时与拖曳前的尺寸一致。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910711790.7A CN110559660B (zh) | 2019-08-02 | 2019-08-02 | Unity3D场景中鼠标对物体的按面拖拽法及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910711790.7A CN110559660B (zh) | 2019-08-02 | 2019-08-02 | Unity3D场景中鼠标对物体的按面拖拽法及介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110559660A CN110559660A (zh) | 2019-12-13 |
CN110559660B true CN110559660B (zh) | 2022-05-17 |
Family
ID=68774378
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910711790.7A Active CN110559660B (zh) | 2019-08-02 | 2019-08-02 | Unity3D场景中鼠标对物体的按面拖拽法及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110559660B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111142669B (zh) * | 2019-12-28 | 2023-08-29 | 上海米哈游天命科技有限公司 | 二维界面到三维场景的交互方法、装置、设备及存储介质 |
CN112230837A (zh) * | 2020-11-03 | 2021-01-15 | 成都景中教育软件有限公司 | 一种三维动态几何系统中视角变换方法 |
CN112494928B (zh) * | 2020-12-10 | 2024-05-31 | 上海连尚网络科技有限公司 | 游戏场景控制方法和设备 |
CN112287065B (zh) * | 2020-12-30 | 2021-03-09 | 成都四方伟业软件股份有限公司 | 一种解决Unity3D大模型打点穿模问题的方法及装置 |
CN114816594B (zh) * | 2021-01-18 | 2023-08-08 | 中盈优创资讯科技有限公司 | 一种检测拓扑碰撞的方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104035562A (zh) * | 2014-06-18 | 2014-09-10 | 广州市久邦数码科技有限公司 | 一种三维立体桌面触摸事件的映射方法及系统 |
CN107492150A (zh) * | 2017-07-12 | 2017-12-19 | 浙江科澜信息技术有限公司 | 一种在三维球面实现拖动的方法 |
CN108228026A (zh) * | 2016-12-22 | 2018-06-29 | 达索系统公司 | 三维场景中对象的快速操纵 |
CN109799928A (zh) * | 2017-11-16 | 2019-05-24 | 清华大学深圳研究生院 | 投影触摸板中用户手指参数的获取方法和系统 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4515221B2 (ja) * | 2004-10-29 | 2010-07-28 | 任天堂株式会社 | ゲームプログラム |
US11221750B2 (en) * | 2016-02-12 | 2022-01-11 | Purdue Research Foundation | Manipulating 3D virtual objects using hand-held controllers |
-
2019
- 2019-08-02 CN CN201910711790.7A patent/CN110559660B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104035562A (zh) * | 2014-06-18 | 2014-09-10 | 广州市久邦数码科技有限公司 | 一种三维立体桌面触摸事件的映射方法及系统 |
CN108228026A (zh) * | 2016-12-22 | 2018-06-29 | 达索系统公司 | 三维场景中对象的快速操纵 |
CN107492150A (zh) * | 2017-07-12 | 2017-12-19 | 浙江科澜信息技术有限公司 | 一种在三维球面实现拖动的方法 |
CN109799928A (zh) * | 2017-11-16 | 2019-05-24 | 清华大学深圳研究生院 | 投影触摸板中用户手指参数的获取方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN110559660A (zh) | 2019-12-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110559660B (zh) | Unity3D场景中鼠标对物体的按面拖拽法及介质 | |
US8970586B2 (en) | Building controllable clairvoyance device in virtual world | |
US11490062B2 (en) | Information processing apparatus, information processing method, and storage medium | |
US11810248B2 (en) | Method for processing image data to provide for soft shadow effects using shadow depth information | |
US20080122839A1 (en) | Interacting with 2D content on 3D surfaces | |
Mori et al. | Efficient use of textured 3D model for pre-observation-based diminished reality | |
CN112184873B (zh) | 分形图形创建方法、装置、电子设备和存储介质 | |
CN111127623A (zh) | 模型的渲染方法、装置、存储介质及终端 | |
JP2012190428A (ja) | 立体映像視覚効果処理方法 | |
EP4246452A1 (en) | Three-dimensional point cloud densification device, three-dimensional point cloud densification method, and program | |
Wang et al. | Voge: a differentiable volume renderer using gaussian ellipsoids for analysis-by-synthesis | |
KR20110088995A (ko) | 3차원 모델 안에서 감시 카메라 영상을 시각화하기 위한 방법 및 시스템, 및 기록 매체 | |
CN116912387A (zh) | 纹理贴图的处理方法及装置、电子设备、存储介质 | |
Mori et al. | Detour light field rendering for diminished reality using unstructured multiple views | |
JP2017184136A (ja) | 情報処理装置、情報処理方法、情報処理システム及びプログラム | |
CN116647657A (zh) | 响应式视频画布生成 | |
Eskandari et al. | Diminished reality in architectural and environmental design: Literature review of techniques, applications, and challenges | |
CN111833428B (zh) | 一种可视域确定方法、装置及设备 | |
JP3309841B2 (ja) | 合成動画像生成装置および合成動画像生成方法 | |
CN115531877B (zh) | 一种虚拟引擎中距离测量的方法及其系统 | |
CN117197319B (zh) | 图像生成方法、装置、电子设备及存储介质 | |
JP2010231620A (ja) | 三次元cg画像編集方法、装置、プログラム、記録媒体 | |
US11627297B1 (en) | Method for image processing of image data for a two-dimensional display wall with three-dimensional objects | |
JP2002312810A (ja) | 合成動画像生成装置および合成動画像生成方法 | |
JP6487578B1 (ja) | プログラム、記録媒体、及び影描画方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information |
Address after: 350028 Jinshan Juyuan Industrial Park project a, No.18, West Third Ring Road, Jianxin Town, Cangshan District, Fuzhou City, Fujian Province Applicant after: Baobao Bus Co.,Ltd. Address before: Floor 15, building 3, area F, Fuzhou Software Park, 89 software Avenue, Gulou District, Fuzhou City, Fujian Province 350000 Applicant before: FUZHOU ZHIYONG INFORMATION TECHNOLOGY Co.,Ltd. |
|
CB02 | Change of applicant information | ||
GR01 | Patent grant | ||
GR01 | Patent grant |