直线spline轨道splinemesh的缩放方法
技术领域
1.本发明涉及计算机技术技术领域,具体涉及一种直线spline轨道splinemesh的缩放方法。
技术背景
2.样条组件是一条可用于定义和使用位置数据的路径。可以让场景中的角色或其他组件沿样条线移动,或者沿着样条线放置一系列角色或其他组件。它们可以直接在蓝图视口和关卡编辑器中编辑,包括添加、删除、复制样条点,改变切线类型,甚至实现逐帧动画。
3.splinemesh是虚幻引擎的splinemeshcomponent,是可以根据组件属性,将保存的staticmesh模型按要求缩放拉伸成指定的形状。当前通过spline轨道工具生成的直线splinemesh无法顺利实现缩放,若强行进行缩放操作会导致splinemesh长度与spline轨迹不匹配。
技术实现要素:4.针对上述存在的拘束局限性,本发明提出了一种弧直线spline轨道splinemesh的缩放方法,通过组件生成方法由目标直线样条组件进行缩放后的样条组件生成缩放后的splinemesh组件,实现了直线splinemesh的缩放操作,并且缩放后的splinemesh组件与目标直线样条组件轨迹一致。
5.为实现上述目的,本发明采用了以下技术方案:
6.步骤1、获取目标直线的起始点数据与结束点数据并根据所述起始点数据及结束点数据获得第一样条线组件数据;
7.所述起始点数据为起始点actor对象,所述结束点数据为结束点actor对象;
8.步骤2、创建直线实现蓝图对象并将所述直线实现蓝图对象的世界位置设置为目标直线的起始点世界位置;
9.步骤3、根据目标缩放比例生成所述直线样条组件的所有点数据,获得第二直线样条组件数据;
10.步骤4、根据第二直线样条组件数据循环调用组件生成方法生成直线splinemesh组件;所述直线splinemesh组件为缩放后的splinemesh组件;
11.所述组件生成方法的具体实现步骤包括:
12.s1、创建splinemesh组件;
13.s2、调用addsplinemeshcomponent方法获得第一临时splinemesh组件;
14.s3、调用所述第一临时splinemesh组件的setstaticmesh方法,设置所述第一临时splinemesh组件的组件属性,得到第二临时splinemesh组件;
15.s4、调用所述第二临时splinemesh组件的setstartandend方法,设置第二临时splinemesh组件的起始点与结束点属性,得到生成splinemesh组件,并将所述生成splinemesh组件添加至所述splinemesh组件列表。
16.本发明与现有技术相对比,本发明提供的直线spline轨道splinemesh的缩放方法具有以下优点:
17.(1)实现了通过直线样条组件生成可缩放的splinemesh;
18.(2)缩放后的splinemesh组件与目标直线样条组件的开始点到结束点的轨迹一致。
19.上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其他目的、特征和优点能够更明显易懂,以下特举较佳实施例,并配合附图,详细说明如下。
附图说明
20.图1为本发明实施例提供的一种直线spline轨道splinemesh的缩放方法的流程图。
21.图2为本发明实施例提供的直线位置关系图。
22.图3为本发明实施例提供的组件生成方法addsplinemesh的实现步骤流程图。
具体实施方式
23.以下由特定的具体实施例说明本发明的实施方式,熟悉此技术的人士可由本说明书所揭露的内容轻易地了解本发明的其他优点及功效,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。为了进一步了解本发明,下面结合最佳实施例对本发明作进一步的详细说明。
24.如下为本发明实施例中涉及名词术语的解释:
25.spline:样条组件,即虚幻引擎的splinecomponent。
26.splinemesh:即虚幻引擎的splinemeshcomponent,可以根据组件属性将保存的staticmesh模型,按要求缩放拉伸成指定的形状;其主要属性有:静态网格体(staticmesh)、样条网格体。
27.actor:虚幻引擎中的数据类型。
28.下面结合前述名词术语具体介绍本发明的实现方式:
29.本发明的发明点是提供一种直线spline轨道splinemesh的缩放方法,用于通过组件生成方法由目标直线样条组件生成缩放后的splinemesh组件;
30.参考图1所示,所述方法包括以下步骤:
31.步骤1、获取目标直线的起始点数据与结束点数据;所述起始点数据为起始点actor对象,所述结束点数据为结束点actor对象;根据所述起始点数据及结束点数据获得第一样条线组件数据;
32.步骤2、创建直线实现蓝图对象并将所述直线实现蓝图对象的世界位置设置为目标直线的起始点世界位置;
33.步骤3、根据目标缩放比例splinemeshscale生成所述直线样条组件的所有点数据,获得第二直线样条组件数据;
34.步骤4、根据第二直线样条组件数据循环调用组件生成方法生成直线splinemesh
组件;所述直线splinemesh组件为缩放后的splinemesh组件。
35.作为一种实施例,步骤1包括以下步骤:
36.步骤11、获取目标直线的起始点actor对象与目标直线的结束点actor对象;
37.步骤12、调用getactorlocation方法获得所述起始点actor对象、所述结束点actor对象的世界位置,得到起始点世界位置startlocation及结束点世界位置endlocation;
38.步骤13、根据起始点世界位置startlocation及结束点世界位置endlocation生成第一样条线组件数据。
39.getactorlocation方法用于获得actor当前的世界位置,传入参数为目标actor对象,输出值为目标actor对象的世界位置,所述世界位置为fvector向量数据类型;步骤12中目标actor对象参数分别传入起始点actor对象、结束点actor对象,获得始点世界位置startlocation及结束点世界位置endlocation。
40.作为一种实施例,步骤2包括以下步骤:
41.步骤21、创建直线实现蓝图对象;
42.步骤22、调用setactorlocation方法,将所述直线实现蓝图对象的世界位置设置为所述起始点世界位置startlocation。
43.setactorlocation方法用于设置actor的世界位置,传入参数包括:目标actor、新位置参数、是否被挡住时停下(sweep参数)、是否传送物理状态(teleport参数);在步骤23中调用setactorlocation方法时,目标actor为默认当前actor(即所述直线实现蓝图对象)、新位置参数为所述起始点世界位置startlocation,sweep参数与teleport参数均为false。
44.作为一种实施例,步骤3包括以下步骤:
45.步骤31、调用clearsplinepoints方法清空所述第一直线样条组件数据中的所有点数据,得到第一临时样条组件数据;
46.步骤32、向所述第一临时样条组件数据中添加第一点世界位置,得到第二临时样条组件数据;所述第一点世界位置为上述步骤12中获得的起始点世界位置startlocation;
47.步骤33、向所述第二临时样条组件中添加第二点世界位置,得到第二直线样条组件数据。
48.步骤33中第二点世界位置通过以下方式获得:
49.(1)调用getactorlocation方法,传入目标直线结束点actor对象,获得结束点世界位置endloaction;
50.(2)计算起始点到结束点的直线向量vectorline,计算方法为:vectorline=endlocation-startlocation;
51.(3)根据目标缩放比例splinemeshscale计算相对向量secondvector,计算方法为:secondvector=vectorline/splinemeshscale;
52.(4)根据起始点世界位置startlocation与相对向量secondvector计算第二点世界位置secondlocation,计算方法为:secondlocation=startlocation+secondvectorstartlocation、endloaction、
vectorline、secondvector、secondlocation的位置关系如图2所示。
53.clearsplinepoints方法用于清空splinecomponent(样条组件)中的所有点数据;传入参数包括:目标样条组件对象(splinecomponent类型)、是否更新状态(布尔值);步骤31中调用clearsplinepoints方法时,目标样条组件对象参数传入所述第一直线样条组件数据,是否更新状态参数传入true。
54.向所述第一临时样条组件数据中添加第一点世界位置、向所述第二临时样条组件数据中添加第二点世界位置均通过addsplinepoint方法实现;
55.addsplinepoint方法用于向splinecomponent(样条组件)中添加点数据,传入参数包括:目标样条组件对象(splinecomponent类型)、点位置(fvector向量类型)、坐标空间(枚举值)、是否更新状态(布尔值);
56.步骤32中,向所述第一临时样条组件数据中添加第一点世界位置时,addsplinepoint方法的目标样条组件对象参数传入所述第一临时样条组件数据,点位置参数传入所述第一点世界位置,坐标空间参数传入“world”,是否更新状态参数传入true;
57.步骤33中,向所述第二临时样条组件数据中添加第二点世界位置时,addsplinepoint方法的目标样条组件对象参数传入所述第二临时样条组件数据,点位置参数传入所述第二点世界位置,坐标空间参数传入“world”,是否更新状态参数传入true。
58.作为一种实施例,步骤4包括以下步骤:
59.步骤41、创建splinemesh组件列表splinemeshcomplist并调用destroycomponent方法清空所述splinemesh组件列表;
60.步骤42、设置当前循环次数index、循环开始索引firstindex、循环结束索引lastindex;具体设置方法为:
61.当前循环次数index设置为1;循环开始索引firstindex设置为1;循环结束索引lastindex设置为所述第二直线样条组件数据的点数组元素数量减1;所述点数组元素数量通过调用getnumberofsplinepoints方法得到;
62.步骤43、循环调用组件生成方法addsplinemesh,直到当前循环次数等于循环结束索引lastindex时结束循环,得到直线splinemesh组件。
63.作为一种实施例,所述组件生成方法addsplinemesh用于根据目标直线或曲线的起始点与结束点生成splinemesh组件(splinemeshcomponent)并将生成的splinemesh组件保存至splinemesh组件列表中。
64.所述组件生成方法addsplinemesh的传入参数包括开始点序号(整型)、结束点序号(整型),返回值为生成的splinemesh组件。
65.步骤43中,addsplinemesh的开始点序号参数传入值为index-1,结束点序号参数传入值为index;index为所述当前循环次数。
66.参考图3所示,组件生成方法addsplinemesh包括以下步骤:
67.s1、创建splinemesh组件;
68.s2、调用addsplinemeshcomponent方法获得第一临时splinemesh组件firstlocalsplinemesh;
69.s3、调用firstlocalsplinemesh的setstaticmesh方法,设置所述第一临时splinemesh组件的组件属性,得到第二临时splinemesh组件secondlocalsplinemesh;
70.s4、调用secondlocalsplinemesh的setstartandend方法,设置第二临时splinemesh组件secondlocalsplinemesh的起始点与结束点属性,得到生成splinemesh组件localsplinemesh,并将localsplinemesh添加至所述splinemesh组件列表。
71.addsplinemeshcomponent方法的传入参数包括manualattachment(是否手动或自动附加组件,类型为布尔值)、relativetransform(组件的位置、旋转、缩放信息,类型为转换矩阵);其中relativetransform包括三个子参数:location(xyz位置)、rotation(pitch、raw、roll三轴旋转)、scale(xyz三轴缩放);addsplinemeshcomponent方法输出值为splinemesh组件;
72.s2中addsplinemeshcomponent方法的manualattachment参数传入false;location参数传入(0,0,0);rotation参数传入(0,0,0);scale参数传入(splinemeshscale,splinemeshscale,splinemeshscale),其中splinemeshscale为所述目标缩放比例。
73.setstaticmesh方法用于设置splinemesh组件使用的静态网格模型,传入参数为目标splinemesh组件对象及静态网格模型;
74.s3中setstaticmesh方法的目标splinemesh组件对象参数传入第一临时splinemesh组件firstlocalsplinemesh;静态网格模型参数传入预设静态网格模型。
75.setstartandend方法用于设置splinemesh组件的起始点与结束点属性,传入参数包括目标组件对象、开始点位置、开始点切线、结束点位置、结束点切线、是否更新组件状态;
76.s4中setstartandend方法各参数传入值说明如表1所示。
77.表1 setstartandend方法的参数传入值参数传入值目标组件对象secondlocalsplinemesh开始点位置localstartlocation开始点切线localstarttangent结束点位置localendlocation结束点切线localendtangent是否更新组件状态true
78.表1中,localstartlocation、localstarttangent、localendlocation、localendtangent的计算方法为:
79.调用getlocationandtangentatsplinepoint方法,该方法的目标对象参数传入所述第二直线样条组件数据,点序号参数传入所述组件生成方法的开始点序号参数,坐标空间参数传入“local”,得到的输出值分别为localstartlocation、localstarttangent;
80.调用getlocationandtangentatsplinepoint方法,该方法的目标对象参数传入所述第二直线样条组件数据,点序号参数传入所述组件生成方法的结束点序号参数,坐标空间参数传入“local”,得到的输出值分别为localendlocation、localendtangent。
81.作为一种实施例,本发明所述方法可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(asic)、通用计算机或任何其他类似硬件设备来实现。
82.本发明所述的方法可以软件程序的形式实施,所述软件程序可以通过处理器执行
以实现上文所述步骤或功能。同样地,所述软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,ram存储器,磁或光驱动器或软磁盘及类似设备。
83.另外,本发明所述方法的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
84.另外,本发明所述的方法的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本技术的方法和/或技术方案。而调用本发明所述方法的程序指令,可被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。
85.作为一种实施例,本发明还提供一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述的多个实施例的方法和/或技术方案。
86.需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本技术并不受所描述的动作顺序的限制,因为依据本技术,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本技术所必须的。
87.最后,需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
88.以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。