游戏开发中的插补

举报
海拥 发表于 2021/11/27 16:34:46 2021/11/27
【摘要】 🌊 作者主页:海拥🌊 简介:🏆CSDN全栈领域优质创作者、🥇HDZ核心组成员、🥈蝉联C站周榜前十🌊 粉丝福利:粉丝群 每周送六本书,不定期送各种小礼品@TOC 插补插值是图形编程中非常基本的操作。熟悉它是很好的,以扩大您作为图形开发人员的视野。基本思想是要从A过渡到B。A值t表示中间的状态。例如,如果t为0,则状态为A。如果t为1,则状态为B。介于两者之间的是插值。在两个实数(浮...

🌊 作者主页:海拥
🌊 简介:🏆CSDN全栈领域优质创作者、🥇HDZ核心组成员、🥈蝉联C站周榜前十
🌊 粉丝福利:粉丝群 每周送六本书,不定期送各种小礼品

@TOC

插补

插值是图形编程中非常基本的操作。熟悉它是很好的,以扩大您作为图形开发人员的视野。

基本思想是要从A过渡到B。A值t表示中间的状态。

例如,如果t为0,则状态为A。如果t为1,则状态为B。介于两者之间的是插值。

在两个实数(浮点数)之间,通常将简单插值描述为:

interpolation = A * (1 - t) + B * t

通常简化为:

interpolation = A + (B - A) * t

这种插值的名称是“线性的”,它以恒定速度将一个值转换为另一个值。因此,当您了解线性插值法时,您会知道他们是在指这个简单的公式。

还有其他类型的插值,此处将不介绍。推荐的后续内容是Bezier页面。

向量插值
向量类型(Vector2和Vector3)也可以插值,它们带有方便的函数来实现 Vector2.linear_interpolate()和Vector3.linear_interpolate()。

对于三次插值,还有Vector2.cubic_interpolate()和Vector3.cubic_interpolate(),它们执行Bezier样式插值。

这是使用插值从A点到B点的简单伪代码:

func _physics_process(delta):
    t += delta * 0.4

    $Sprite.position = $A.position.linear_interpolate($B.position, t)

它将产生以下运动:

在这里插入图片描述

变换插值

也可以插值整个变换(确保它们具有统一的比例尺,或者至少具有相同的非统一比例尺)。为此,可以使用函数Transform.interpolate_with()。

这是将猴子从Position1转换为Position2的示例:

../../_images/interpolation_positions.png

使用以下伪代码:

var t = 0.0

func _physics_process(delta):
    t += delta

    $Monkey.transform = $Position1.transform.interpolate_with($Position2.transform, t)

再次,它将产生以下运动:

在这里插入图片描述

平滑运动

可以使用插值来平滑移动,旋转等。这是鼠标使用平滑运动跟随圆的示例:

const FOLLOW_SPEED = 4.0

func _physics_process(delta):
    var mouse_pos = get_local_mouse_position()

    $Sprite.position = $Sprite.position.linear_interpolate(mouse_pos, delta * FOLLOW_SPEED)

外观如下:

在这里插入图片描述

这对于使摄像机移动,跟随您的盟友(确保它们保持在一定范围内)以及许多其他常见的游戏模式非常有用。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。