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

相关文章

基于NURBS曲线的数据拟合算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1NURBS曲线基础 4.2 数据拟合原理 5.完整程序 1.程序功能描述        基于NURBS曲线的数据拟合算法,非均匀有理B样条(Non-Uniform Rational B-Splines,简称NURBS)曲线是一种强大的数学工具,广泛应用于计算机图形学、CAD/CA

几何内核开发-实现自己的NURBS曲线生成API

我去年有一篇帖子,介绍了NURBS曲线生成与显示的实现代码。 https://blog.csdn.net/stonewu/article/details/133387469?spm=1001.2014.3001.5501文章浏览阅读323次,点赞4次,收藏2次。搞3D几何内核算法研究,必须学习NURBS样条曲线曲面。看《非均匀有理B样条 第2版》这本书,学习起来,事半功倍。在《插件化算法研究平台

Android自定义系列——8.Path之贝塞尔曲线

贝塞尔曲线能干什么 贝塞尔曲线作用十分广泛,简单举几个的栗子: QQ小红点拖拽效果一些炫酷的下拉刷新控件阅读软件的翻书效果一些平滑的折线图的制作很多炫酷的动画效果 理解贝塞尔曲线的原理 一阶曲线原理: 一阶曲线是没有控制点的,仅有两个数据点(A 和 B),最终动态过程如下: (本文中贝塞尔曲线相关的动态演示图片来自维基百科)。一阶曲线其实就是前面讲解过的lineTo。 二阶曲线

简单了解ESD模型与TLP曲线

上文讲了ESD和EOS的区别,说实话远不止那些。今日再稍加深入的介绍ESD。 一 ESD原理 ESD-Electro Static Discharge静电放电,具有不同静电电位的物体互相靠近或者直接接触引起的电荷转移。正常情况下,物体内部的正负电荷是相等的,对外表现不带电。当任何两种不同材质的物体接触后再分离就会产生静电。当正负电荷逐渐累计到一定程度时,将与周围环境产生电位差,从而使电荷经由放

HarmonyOS-MPChart根据y轴刻度绘制渐变色曲线

本文是基于鸿蒙三方库mpchart(OpenHarmony-SIG/ohos-MPChart)的使用,自定义绘制方法,绘制一条颜色渐变的曲线。 mpchart本身的绘制功能是不支持颜色渐变的曲线的,只支持渐变色填充大块颜色。那么当我们的需求曲线根据y轴的刻度发生变化,就需要自定义绘制方法了。 从图中我们可以看到,左边的y轴是一个从底部到顶部颜色渐变的直线,从绿色渐变到红色,而且数据曲线根据

三次插值曲线--插值技术

三次插值曲线 1.1.三次样条曲线 三次样条曲线的基本思想是,在给定的一系列点(称为控制点或数据点)之间,通过一系列三次多项式曲线段来拟合这些点,使得整个曲线既平滑又准确地通过所有控制点。 1.1.1.数学定义 给定一组点 ( P_0, P_1, …, P_n ),其中 ( P_i = (x_i, y_i) ),( x_0 < x_1 < … < x_n )。三次样条曲线由以下性质定义:

PCL 三次样条插值(二维点)

一、简介 在插值计算中,最简单的分段多项式近似应该是分段线性插值,它由连接一组数据点组成,仅仅只需要将这些点一一用直线进行顺序相连即可。不过线性函数插值的缺点也很明显,就是在两个子区间变化的比较突兀,也就是没有可微性(不够光滑)。因此我们需要更为符合物理情况的一种曲线,一般来讲,三次多项式包含四个常数,它可以确保插值函数不仅在区间上连续可微,而且具有连续的二阶导数,这样就可以达到我们想要节点处

B样条曲线曲面--拟合技术

B样条曲线曲面 1.B样条曲线 B样条曲线(B-spline curve)是一种在计算机图形学和计算几何中广泛使用的参数曲线。它是贝塞尔曲线(Bezier curve)的一种推广,提供了更好的局部控制能力。B样条曲线由一组控制点(也称为控制顶点)和一组基函数(称为B样条基函数)定义。 1.1.B样条曲线的定义 给定一组 ( n + 1 ) 个控制点 ( P i ) 和一组节点( k n

PullBezierZoomView 一个具有贝塞尔曲线下拉效果的自定义view

该控件效果基于PullZoomView源码改动的而来,感谢Frank-Zhu的开源代码.该控件具有下拉放大背景图和贝塞尔曲线的效果. github:https://github.com/X-FAN/PullBezierZoomView 欢迎star 我主要写了一个自定义的贝塞尔曲线的效果的控件并整合到了Frank-Zhu的项目中的一个子项中. 这里面有个小数学知识的求解,因为效果要贝赛尔曲线

Bezier曲线曲面--拟合技术

Bezier曲线曲面–拟合应用 1.Bezier曲线 1.1.Bezier曲线的定义 给定一组控制点 P_0, P_1, …, P_n,其中 n 是曲线的阶数,Bezier曲线的参数方程可以表示为: B ( t ) = ∑ i = 0 n P i b i , n ( t ) , t ∈ [ 0 , 1 ] B(t) = \sum_{i=0}^{n} P_i b_{i,n}(t), \qua