Godot插值、贝塞尔曲线和Astar寻路

2024-04-08 00:20

本文主要是介绍Godot插值、贝塞尔曲线和Astar寻路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、插值

线性插值是采用一次多项式上进行的插值计算,任意给定两个值A和B,那么在A和B之间的任意值可以定义为:P(t) = A * (1 - t) + B * t,0 <= t <= 1。
数学中用于线性拟合,游戏应用可以做出跟随效果(宠物跟随、npc跟随)

const FOLLOW_SPEED = 4.0func _physics_process(delta):var mouse_pos = get_local_mouse_position()$Sprite2D.position = $Sprite2D.position.lerp(mouse_pos, delta * FOLLOW_SPEED)

在这里插入图片描述

二、贝塞尔

贝塞尔是插值的应用之一。贝塞尔曲线是为工业设计,是图形软件行业中的流行工具。不过在游戏中会出现曲线扭曲的情况,应用并不好。

1.二次贝塞尔:

我们首先使用 0 到 1 之间的值,在两个线段的每个顶点上逐步插值。当我们把 t 值从 0 变成 1 时,就得到了两个沿着线段移动的点。然后,我们插值 q0 和 q1,以获得沿着曲线移动的单点 r。

func _quadratic_bezier(p0: Vector2, p1: Vector2, p2: Vector2, t: float):var q0 = p0.lerp(p1, t)var q1 = p1.lerp(p2, t)var r = q0.lerp(q1, t)return r

在这里插入图片描述

2.三次贝塞尔

同理三个线段的时候称为三次贝塞尔曲线。

func _cubic_bezier(p0: Vector2, p1: Vector2, p2: Vector2, p3: Vector2, t: float):var q0 = p0.lerp(p1, t)var q1 = p1.lerp(p2, t)var q2 = p2.lerp(p3, t)var r0 = q0.lerp(q1, t)var r1 = q1.lerp(q2, t)var s = r0.lerp(r1, t)return s

在这里插入图片描述

三、Astar寻路

Astar算法是最广泛应用的寻路算法,它的特点是基于网格,而且可以快速的求解某个点到另一个点的最短有效路径。Godot种提供了算法的封装类可以直接使用。2D版本是AStar2D、AStarGrid2D。

1.思路

添加可以到达的位置
将可以行走的点两两连接,形成路径
通过其方法直接求取某个位置到目标位置的最短路径
让玩家或其他角色按照路径上点的顺序依次前进,直到到达目标位置
在这里插入图片描述

extends Node2Dvar astar = AStar2D.new() # 实例化func _ready():# 添加可以到达的位置astar.add_point(0,Vector2(0,0))astar.add_point(1, Vector2(0, 0))astar.add_point(2, Vector2(0, 1), 1) # 默认权重为 1astar.add_point(3, Vector2(1, 1))astar.add_point(4, Vector2(2, 0))# 在点之间创建连接,形成路径astar.connect_points(1, 2, false)astar.connect_points(2, 3, false)astar.connect_points(4, 3, false)astar.connect_points(1, 4, false)# 查询某两个位置之间的路径var res = astar.get_id_path(1, 4) # [1,4]

add_point()的时候传入了一个ID,可以将其想象为是一个唯一索引值,对点的标记。
get_id_path()方法获取的是两个对应ID的点之间的最短路径,返回的是包含路径经过的所有点的ID所组成的数组。
你也可以用get_point_path()方法直接获取两个点之间的最短路径,返回的额是包含所有经过的点数组。

2.应用

在Tilemap挂载方法(版本4.2.1):

extends TileMap@onready var astar_node: AStar2D = AStar2D.new()var map_size: Vector2i = get_used_rect().sizefunc _ready():# 遍历所有层,将可以寻路的tile加入Astar图的节点for layer in range(get_layers_count()):var cells = get_used_cells(layer)for cell in cells:var tileData = get_cell_tile_data(layer, cell)var nav = tileData.get_navigation_polygon(0)if nav == null:continuevar point_index = calculate_point_index(cell)astar_node.add_point(point_index, Vector2(cell.x, cell.y))# 移除有碰撞体的点for layer in range(get_layers_count()):var cells = get_used_cells(layer)for cell in cells:var tileData = get_cell_tile_data(layer, cell)var collision = tileData.get_collision_polygons_count(0)if collision <= 0:continuevar point_index = calculate_point_index(cell)if astar_node.has_point(point_index):astar_node.remove_point(point_index)# 连接图的节点for id in astar_node.get_point_ids():var cellPosition = Vector2i(astar_node.get_point_position(id))var relativeCells: Array[Vector2i] = [cellPosition + Vector2i.RIGHT,cellPosition + Vector2i.LEFT,cellPosition + Vector2i.DOWN,cellPosition + Vector2i.UP,			]for relativeCell in relativeCells:var relativeCellIndex = calculate_point_index(relativeCell)if is_outside_map_bounds(relativeCell):continueif astar_node.has_point(relativeCellIndex):astar_node.connect_points(id, relativeCellIndex, false)func calculate_point_index(point: Vector2i) -> int:return point.x + point.y * map_size.xfunc is_outside_map_bounds(point: Vector2i) -> bool:return point.x <0 || point.y < 0 || point.x >= map_size.x || point.y >= map_size.yfunc get_nav_path(startCellPosition: Vector2i, endCellPosition: Vector2i) -> PackedVector2Array:var navCellPath = astar_node.get_point_path(calculate_point_index(startCellPosition), calculate_point_index(endCellPosition))var localPath = PackedVector2Array()for cellPosition in navCellPath:localPath.push_back(map_to_local(Vector2i(cellPosition)))return localPath

这篇关于Godot插值、贝塞尔曲线和Astar寻路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/884082

相关文章

PR曲线——一个更敏感的性能评估工具

在不均衡数据集的情况下,精确率-召回率(Precision-Recall, PR)曲线是一种非常有用的工具,因为它提供了比传统的ROC曲线更准确的性能评估。以下是PR曲线在不均衡数据情况下的一些作用: 关注少数类:在不均衡数据集中,少数类的样本数量远少于多数类。PR曲线通过关注少数类(通常是正类)的性能来弥补这一点,因为它直接评估模型在识别正类方面的能力。 精确率与召回率的平衡:精确率(Pr

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

Matlab中BaseZoom()函数实现曲线和图片的局部放大

BaseZoom工具下载链接: 链接:https://pan.baidu.com/s/1yItVSinh6vU4ImlbZW6Deg?pwd=9dyl 提取码:9dyl 下载完之后将工具包放置合适的路径下,并在matlab中“设置路径”中添加相应的路径; 注:可以先运行如下图片中的语句,看看是否报错;如果报如下错误,说明matlab未安装“Image Processing Toolbox”工

动画插值器Interpolation

插值器定义: 用于修改一个动画过程中的速率,可以定义各种各样的线性或非线性变化函数,比如匀速.加速.减速等。 说白了(也就是通俗的说):其实就是一个 时间的函数,用来 定义了动画的变化律 系统的插值器: 在Android中所有的插值器都是Interpolator 的子类,下面是几种插值器: AccelerateDecelerateInterolator  先加速后减速,

基于yolov8的包装盒纸板破损缺陷测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的包装盒纸板破损缺陷检测系统是一种高效、智能的解决方案,旨在提高生产线上包装盒纸板的质量检测效率与准确性。该系统利用YOLOv8这一前沿的深度学习模型,通过其强大的目标检测能力,能够实时识别并标记出包装盒纸板上的各种破损缺陷,如划痕、撕裂、孔洞等。 在系统中,首先需对包含破损缺陷的包装盒纸板图像进行数据采集和标注,形成训练数据集。随后,利用这些数据进行模型训练,使

基于yolov8的NEU-DET钢材缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的NEU-DET钢材缺陷检测系统是一种创新的解决方案,旨在通过深度学习技术实现对钢材表面缺陷的自动检测和识别。该系统利用YOLOv8算法,该算法以其高效、准确和实时检测的特点著称。 NEU-DET数据集为该系统提供了丰富的训练资源,涵盖了热轧带钢的六种典型表面缺陷,包括轧制氧化皮、斑块、开裂、点蚀表面、内含物和划痕,每种缺陷均有大量样本,确保了模型的全面性和准确性

图像插值算法参考博客

1. 最近邻插值法(nearest_neighbor) - wancy - 博客园 (cnblogs.com)https://www.cnblogs.com/wancy/p/15068519.html 2. 双线性插值法(bilinear interpolation) - wancy - 博客园 (cnblogs.com)https://www.cnblogs.com/wancy/p/15212

基于yolov8的电动车佩戴头盔检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的电动车佩戴头盔检测系统利用了YOLOv8这一先进的目标检测模型,旨在提高电动车骑行者的安全意识,减少因未佩戴头盔而导致的交通事故风险。YOLOv8作为YOLO系列的最新版本,在检测速度和精度上均进行了优化,特别适用于处理复杂场景中的小目标检测。 该系统通过收集并标注包含电动车骑行者图像的数据集,对YOLOv8模型进行训练,使其能够准确识别骑行者是否佩戴头盔。在实

图片识别 中图片压缩和放大算法,最近邻插值,双线性插值

由于在神经网络中,输入的张量大小必须相同,但是图片大小不一定相同,我们需要对图片进行压缩和放大。     图像的缩放很好理解,就是图像的放大和缩小。传统的绘画工具中,有一种叫做“放大尺”的绘画工具,画家常用它来放大图画。当然,在计算机上,我们不 再需要用放大尺去放大或缩小图像了,把这个工作交给程序来完成就可以了。下面就来讲讲计算机怎么来放大缩小图象;在本文中,我们所说的图像都是指点阵图, 也

基于yolov8的西红柿缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的西红柿缺陷检测系统是一个利用深度学习技术的创新项目,旨在通过自动化和智能化的方式提高西红柿缺陷检测的准确性和效率。该系统利用YOLOv8目标检测算法,该算法以其高效性和准确性在目标检测领域表现出色。YOLOv8不仅继承了YOLO系列模型的优势,还引入了新的骨干网络、Anchor-Free检测头以及优化后的损失函数,这些改进使得模型在复杂环境下的检测性能更加优越。