新缓动系统
时间:2023-08-20 14:07:32来源:哔哩哔哩

很久前提到过一个“如何绘制跨屏长条”的问题,当时的思路是:

A. 分析长条的开头节点/结尾节点是否在屏幕上;

B. 开头节点不在屏幕上 -> 使用屏幕底部对应DTime(变速时间)的插值节点替换“开头节点”;


(资料图)

C. 结尾节点不在屏幕上 -> 使用屏幕顶部对应DTime的插值节点替换“结尾节点”;

D. 绘制。

当需要绘制的跨屏长条是曲线长条时,上述的插值操作便会涉及到个人称之为“曲线拆分”的问题。

一、 曲线拆分问题

以下是个人对曲线拆分问题能想到的最简单的描述。

现有一条曲线A:(x1,y1)--<type1>--(x2,y2),即用类型为type1的曲线连接(x1,y1)和(x2,y2)两个点。在这条曲线途经的点中取一点(x3,y3),绘制曲线B:(x1,y1)--<type2>--(x3,y3)--<type3>--(x2,y2)。试问如何规定type2和type3,才能使曲线B与曲线A重合?

二、常规思路

如果type1、type2、type3代表的都是“直线线段”,曲线A和曲线B就一定重合。

因此,在谱面加载阶段通过插值法将曲线A转换为如下形式的折线段:

(x1,y1)--<Linear>--(x3,y3)--<Linear>--(x4,y4)······(xn,yn)--<Linear>--(x2,y2)

即可实现(对该折线段的)任意次无损拆分。

三、新缓动系统

目前,我们正在尝试利用GPU的并行计算能力来优化物件渲染,对于长条而言优势就是可以以极低的成本换取极高的缓动精度,但问题就是将物件信息上传到VRAM需要一定的成本。

进行这种非必需的优化讲求的就是一个极致。“转换为折线”这一过程存在着一定的精度损失,也会造成长条节点数量的暴增,相对应地GPU处理单根长条需要绘制多个梯形也存在着一定的额外开支()

为此,以下介绍一种不转换为折线也能完成曲线拆分的方案。

A. 根据缓动API的封装习惯,缓动曲线使用ratio表示:ratio∈[0,1],f(ratio)∈[0,1]

B. 初始状态提供如下几种缓动曲线:

Linear -> f(x) = x

InSine -> f(x) = sin( x*π/2 )

OutSine -> f(x) = 1 - sin( x*π/2 )

C. 取ratio=m的一点插值:

InSine type2 -> f(x) = sin( x*π/2m )

InSine type3 -> f(x) = sin( x*π/2(1-m) + m/(1-m) )

OutSine type2 -> f(x) = 1 - sin( x*π/2m )

OutSine type3 -> f(x) = 1 - sin( x*π/2(1-m) + m/(1-m) )

D. 传入的数据可以简化为x1、y1、x2、y2初始类型、头部ratio、结尾ratio七个。

设头部ratio=m,尾部ratio=n,曲线类型为InSine f(x)=sin(x*π/2),则先拉伸为原始曲线的1/(n-m)倍,再向左平移m/(n-m)单位长度,使新曲线g(x)满足g(0)=f(m)、g(1)=f(n),那么

InSine g(x) = sin( x*π/2(n-m) + m/(n-m) )

OutSine g(x) = 1 - sin( x*π/2(n-m) + m/(n-m) )

E. 验证:

头部ratio=0、尾部ratio=1 -> InSine g(x) = sin( x*π/2 ) -> 原始曲线

头部ratio≠0、尾部ratio=1 -> InSine g(x) = sin( x*π/2(1-m) + m/(1-m) ) -> type3

头部ratio=0、尾部ratio≠1 -> InSine g(x) = sin( x*π/2n ) -> type2

渲染曲线长条时,每根长条需传入左easetype、左x1、左x2、右easetype、右x1、右x2、y1、y2、ratio(y1)、ratio(y2)十个参数。

参数个数最好能控制在8个以内,那么x方向处理成类似Project SEKAI或者Chunithm的“定轨变宽”风格,就可以用位段将(左x1、左x2、左easetype)合并到一个float,(右x1、右x2、右easetype)同理。

通过在逻辑中固定屏幕底部y1和屏幕顶部y2,可以将y1和ratio(y1)合并为yr1:

yr1>1 : 该值表示y1、ratio(y1)=0

yr1≦1:该值表示ratio(y1),y1为逻辑中固定的屏幕底部y1

同理,y2和ratio(y2)也可以合并为yr2:

yr2>1 : 该值表示y2、ratio(y2)=1

yr2≦1:该值表示ratio(y2),y2为逻辑中固定的屏幕顶部y2

通过这样一轮合并,每根曲线长条的传参量便控制在了4个。

标签:

生活指南
  • 锅,从天而降?高空抛物者被采取刑事强制措施

    近日,江苏如皋市一名女子因家庭矛盾而高空抛物,被警方采取刑事强制措

  • 未来一周海南全岛多阵雨或雷阵雨 后期东半部局地有暴雨到大暴雨

    新海南客户端、南海网8月18日消息8月18日,海南省气象台发布未来一周天

  • 朝中社:朝鲜空军针对美军机警戒飞行

    据朝中社8月18日报道,朝鲜人民军总参谋部发言人发表声明称,17日,美

  • 【疾病科普】小脑萎缩的表现症状是什么?

    小脑萎缩是一种常见的神经系统疾病,它会导致小脑组织的退化和功能障碍

  • 多家上市公司称产品供不应求 三家为轮胎企业

    【多家上市公司称产品供不应求三家为轮胎企业】近日多家上市公司在互动

  • 海口“亮盔行动”首日查处12451起交通违法行为

    8月18日,海口公安交警、派出所、城市管理等多部门联动,在全市范围集

  • 男子考科三遇暴雨冒雨绕车一周 网友:这驾照终身难忘

    8月17日,广东佛山。男子科三考试遇暴雨,冒着大雨绕车一周检查车况。

  • 苹果Vision Pro头显新专利曝光,用液态透镜解决眼镜夹片痛点

    苹果公司近日申请了名为“带液态镜头的电子设备”,概述了未来可能的头

  • 7月销售暴跌,合景泰富转让资产降债

    为了降负债,合景泰富一天内卖掉了苏州、杭州的三个项目。8月15日晚间

  • 碧桂园首支境内债展期方案确定:“16碧园05”展期3年 每个账户先偿付10万

    碧桂园首支境内债的展期方案确定,对发行的“16碧园05”本金展期三年,

  • 嘉鼎国际集团(08153)发布一季度业绩 股东应占亏损451.1万港元 同比扩大27.68%

    智通财经APP讯,嘉鼎国际集团(08153)发布截至2023年6月30日止3个月的第

  • 25国驻华使节参访新疆纪事丨到底是什么美食,让墨西哥驻华使馆参赞寻到“家乡味”?

    央广网阿克苏8月17日消息(记者王晶)“这里的馕和伽师瓜干是我最喜欢

  • 男子为赚7000元试药 老婆要离婚,网友:这可真是赔了夫人又折“兵”

    【7000元药物实验引发阳痿】据报道,一名男子为了赚取7000元的报酬参与

  • 哈三联(002900)8月10日股东户数3.23万户,较上期增加1.92%

    近日哈三联披露,截至2023年8月10日公司股东户数为3 23万户,较7月20日

  • 戏“聚”孔孟之乡 共享文化盛宴

    戏“聚”孔孟之乡,共享文化盛宴。8月13日晚,由中国国家话剧院、山东

  • 恒志(关于恒志的基本详情介绍)

    大家好我是小蝌蚪,恒志,关于恒志的基本详情介绍很多人还不知道,那么

  • 民生
    • 蓄势法(关于蓄势法简述)

    • 县域商业三年行动计划实施

    • 深圳分区暴雨红色预警信号生效中 全市进入紧急防御状态!

    • 岁月无声吉他谱弹唱_岁月无声吉他谱