久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    游戲開發中的貝塞爾曲線,曲線和路徑

     海擁 2021-11-30

    游戲開發中的貝塞爾曲線,曲線和路徑


    貝塞爾曲線是自然幾何形狀的數學近似。我們使用它們來表示一條曲線,該曲線具有盡可能少的信息并具有很高的靈活性。

    與更抽象的數學概念不同,貝塞爾曲線是為工業設計而創建的。它們是圖形軟件行業中流行的工具。

    它們依賴于插值(我在上一篇文章中提過),結合了多個步驟以創建平滑曲線。為了更好地了解貝塞爾曲線的工作原理,讓我們從其最簡單的形式開始:二次貝塞爾曲線。

    二次貝塞爾曲線

    取三點,這是二次貝塞爾曲線起作用的最低要求:

    ../../_images/bezier_quadratic_points.png

    為了在它們之間繪制一條曲線,我們首先使用0到1范圍內的值,在由三個點組成的兩個線段的每個頂點的兩個頂點上逐步進行插值。這使我們在改變線段值時沿著線段移動兩個點的t從0到1。

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

    然后q0,我們進行插值并q1獲得r沿曲線移動的單個點。

    var r = q0.linear_interpolate(q1, t)
    return r
    

    這種類型的曲線稱為二次貝塞爾曲線。

    在這里插入圖片描述
    (圖片來源:維基百科)

    三次貝塞爾曲線

    在前面的示例的基礎上,我們可以通過在四個點之間進行插值來獲得更多控制。

    ../../_images/bezier_cubic_points.png

    我們首先使用的功能與四個參數取四點作為輸入, p0,p1,p2和p3:

    func _cubic_bezier(p0: Vector2, p1: Vector2, p2: Vector2, p3: Vector2, t: float):
    

    我們對每個點應用線性插值以將其減少到三個:

    var q0 = p0.linear_interpolate(p1, t)
    var q1 = p1.linear_interpolate(p2, t)
    var q2 = p2.linear_interpolate(p3, t)
    

    然后,我們將三點簡化為兩點:

    var r0 = q0.linear_interpolate(q1, t)
    var r1 = q1.linear_interpolate(q2, t)
    

    并給一個:

    var s = r0.linear_interpolate(r1, t)
    return s
    

    這是全部功能:

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

    結果將是在所有四個點之間插值的平滑曲線:

    在這里插入圖片描述

    (圖片來源:維基百科)

    注意

    三次貝塞爾曲線插值在3D中的效果相同,只是使用Vector3 代替Vector2。

    添加控制點

    以立方貝塞爾曲線為基礎,我們可以更改兩個點的工作方式以自由控制曲線的形狀。而是具有p0p1p2p3,我們將它們存儲為:

    • point0 = p0:是第一點,來源
    • control0 = p1 - p0:相對于第一個控制點的向量
    • control1 = p3 - p2:是相對于第二個控制點的向量
    • point1 = p3:是第二點,目的地

    這樣,我們有兩個點和兩個控制點,它們是相對于各個點的相對向量。如果您以前使用過圖形或動畫軟件,則可能看起來很熟悉:

    ../../_images/bezier_cubic_handles.png

    這就是圖形軟件如何向用戶顯示Bezier曲線,以及它們在Godot中的工作方式和外觀。

    Curve2D,Curve3D,路徑和Path2D

    有兩個包含曲線的對象:Curve3D和Curve2D(分別用于3D和2D)。

    它們可以包含多個點,從而可以使用更長的路徑。也可以將它們設置為節點:Path和Path2D(也分別用于3D和2D):

    ../../_images/bezier_path_2d.png

    但是,使用它們可能并不十分明顯,因此以下是Bezier曲線最常見用例的描述。

    評估

    僅評估它們可能是一種選擇,但是在大多數情況下,它不是很有用。 貝塞爾曲線的最大缺點是,如果以恒定速度從t = 0到t = 1遍歷它們,則實際插補將不會以恒定速度移動。 速度也是點p0,p1,p2和p3之間距離的插值,并且沒有數學上簡單的方法來以恒定速度遍歷曲線。

    讓我們用下面的偽代碼做一個簡單的例子:

    var t = 0.0
    
    func _process(delta):
        t += delta
        position = _cubic_bezier(p0, p1, p2, p3, t)
    

    在這里插入圖片描述

    如您所見,即使t以恒定速度增加,圓的速度(以每秒像素為單位)也會變化。這使得貝塞爾曲線難以在開箱即用的情況下使用。

    畫畫

    繪制貝塞爾曲線(或基于曲線的對象)是一種非常常見的用例,但這也不容易。在幾乎任何情況下,貝塞爾曲線都需要轉換為某種線段。但是,這通常很困難,而又不創建大量的代碼。

    原因是曲線的某些部分(特別是拐角)可能需要大量的點,而其他部分可能不需要:

    ../../_images/bezier_point_amount.png

    此外,如果兩個控制點都是0, 0(請記住它們是相對矢量),則貝塞爾曲線將只是一條直線(因此繪制大量的點將是浪費的)。

    在繪制貝塞爾曲線之前,需要進行細分。這通常通過遞歸或分而治之的功能來完成,該功能可以分割曲線,直到曲率量小于某個閾值為止。

    的曲線類通過提供這種 Curve2D.tessellate()函數(其接收可選stages的遞歸和角度tolerance參數)。這樣,基于曲線繪制對象就更容易了。

    遍歷

    曲線的最后一個常見用例是遍歷它們。由于前面提到的有關恒速的內容,這也很困難。

    為了使此操作更容易,需要將曲線烘焙到等距的點。這樣,它們可以通過常規插值進行近似(可以通過三次選項進一步改進)。為此,只需將Curve.interpolate_baked()方法與Curve2D.get_baked_length()一起使用 。第一次調用它們中的任何一個都會在內部烘焙曲線。

    然后,可以使用以下偽代碼完成恒速遍歷:

    var t = 0.0
    
    func _process(delta):
        t += delta
        position = curve.interpolate_baked(t * curve.get_baked_length(), true)
    

    然后,輸出將以恒定速度移動:

    在這里插入圖片描述

      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 国产精品欧美福利久久| 日夜啪啪一区二区三区| 亚洲av日韩在线资源| 手机看片日本在线观看视频| 日韩精品卡2卡3卡4卡5| 亚洲精品成人片在线观看精品字幕| 中文字幕在线精品人妻| 好吊妞国产欧美日韩免费观看| 男人扒开女人腿桶到爽免费 | 国产综合视频一区二区三区| 四虎成人精品无码| 国产超高清麻豆精品传媒麻豆精品 | 久久99热只有频精品6狠狠| 亚洲欧美牲交| 蜜桃臀无码AV在线观看| 337P日本欧洲亚洲大胆精品| 午夜性爽视频男人的天堂 | 精品中文字幕人妻一二| 欧美亚洲日韩国产人成在线播放 | 一区二区国产高清视频在线| 久久精品国产一区二区三区不卡 | 又大又粗欧美成人网站| 国产精品无码a∨麻豆| 少妇人妻在线视频| 国产精品中文字幕视频| 亚洲 另类 日韩 制服 无码| 免费A级毛片樱桃视频| 亚洲精品无码国产片| 国产萌白酱喷水视频在线观看| 在线国产精品中文字幕| 美女黄18以下禁止观看| 东北寡妇特级毛片免费| 最新亚洲av日韩av二区| 88国产精品欧美一区二区三区| 办公室强奷漂亮少妇视频| 成人综合婷婷国产精品久久| 国产成AV人片在线观看天堂无码 | 2020国产激情视频在线观看| 国产第一页浮力影院入口| 97久久超碰亚洲视觉盛宴| 亚洲AV少妇熟女猛男|