UE4实现贝塞尔曲线,独创算法

UE4中贝塞尔曲线的简单实现

最近研究了下贝塞尔曲线的原理,闲着无事就在UE4里面做了一下,效果还不错,给大家分享出来.
首先我们都知道贝塞尔曲线计算公式是不断递归找到对应的曲线点.
话不多说,直接上代码.
我们先在UE4创建一个C++的Actor类.
然后我们开始吧.
前文提示,在看下列代码前请先了解下贝塞尔曲线的原理和计算方法,不然会看懵逼!

//头文件
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Berzier.generated.h"

UCLASS()
class TCPSERVER_API ABerzier : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ABerzier();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;
	//我们的贝塞尔曲线函数
	UFUNCTION(BlueprintCallable)
	TArray<FVector2D> BerzierCurve(TArray<FVector2D> src);

	


};

// Fill out your copyright notice in the Description page of Project Settings.


#include "Berzier.h"

// Sets default values
ABerzier::ABerzier()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick		.bCanEverTick	=	true	;

}

// Called when the game starts or when spawned
void ABerzier::BeginPlay()
{
	Super					:: BeginPlay()				;
	
}

// Called every frame
void ABerzier::Tick(float DeltaTime)
{
	Super					:: Tick(DeltaTime)			;


}

TArray<FVector2D> ABerzier::BerzierCurve(TArray<FVector2D> src)
{
	//不存在1阶
	if	(	src.Num()<1		)
	{
			return			src							;
	}
	//-----------------------------t的分布步数------------------------------------
	const float				step = 0.01					;
	//---------------------------------------------------------------------------
	//	-----------------------------返回值-----------------------------------------
	TArray<FVector2D>		res							;
	//	----------------------------------------------------------------------------

	//	---------------------------2阶 一条直线------------------------------------
	if (	src	.Num()==1	)
	{
		for (float t=0	;	t<1	;	t+=step)
		{
			res.Add(src[0])								;
		}
			return			res							;
	}
	//	--------------------------------------------------------------------------


	//-----------------------------------3阶 及以上-----------------------------------------

	//---------------------------src1是起点到最后一个点的上一个点-----------------------------
	TArray<FVector2D>		src1						;
	//-------------------------------------------------------------------------------------

	//---------------------------src2是从第二个点到最后一个点---------------------------------
	TArray<FVector2D>		src2						;
	//--------------------------------------------------------------------------------------

	//---------------------------对src1,src2赋值 --------------------------------------------
	for (int32 i=0;i<src.Num()-1;i++)
	{
		src1				.Add(src[i])				;
		UE_LOG(LogTemp, Warning, TEXT("==%s\t"),*src1[i].ToString());
	}
	for (int32 j = 0; j < src.Num(); j++)
	{
		src2				.Add(src[j])				;
		UE_LOG(LogTemp, Warning, TEXT("==%s\t"), *src2[j].ToString());
	}
		src2				.RemoveAt(0)				;
	//---------------------------------------------------------------------------------------

	//----------------------------递归调用所有的点--------------------------------------------
		TArray<FVector2D>	pln1=BerzierCurve(src1)		;

		TArray<FVector2D>	pln2=BerzierCurve(src2)		;
	//---------------------------------------------------------------------------------------
	for (float t=0;t<1;t+=step)
	{

		
		FVector2D	tmp									;
		//-------------------------------------应用贝塞尔曲线算法------------------------------
		tmp					=	(
								(1.0	- t)
									*
								pln1[FMath::RoundToInt(1.0 / step * t)] 
								)
							+	(
								t
									* 
								pln2[FMath::RoundToInt(1.0 / step * t)]
								)						;
		//------------------------------------------------------------------------------------
		//--------------------最终得到的点就是贝塞尔曲线上的点的位置了-----------------------
		res					.	Add	(tmp)				; 
		//--------------------------------------------------------------------------------
	}
		return					res						;
	//-----------------------------------------------------------------------------------
}


完成后我们转到蓝图:
派生一个从我们上面这个类的子类.然后打开构造函数,我们开始!
先构建两个Tarray,第一个是我们的贝塞尔曲线中的构造点,第二个是通过计算得到曲线点.
然后我们开始写蓝图
大致思路就是这样了.

然后就可以查看效果了

可以自己拖动效果了

大家自己试试吧
https://www.bilibili.com/video/BV17f4y1h7sm 这是我的B站视频演示链接.
好了,今天的分享到此为止了,等我下次再分享一波.曲率的计算方式.可以随心所欲的生成不同的曲线.有了结果会第一时间发在b站

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 我可以为你提供一些关于使用C语言实现贝塞尔曲线算法用来平滑多边形的建议。首先,你需要确定要用贝塞尔曲线绘制多边形的顶点。然后,定义一个函数来计算贝塞尔曲线的坐标,并使用循环来更新坐标。最后,通过把坐标连接起来,就可以得到一个平滑的多边形。 ### 回答2: 贝塞尔曲线是一种平滑曲线算法,可以用于在计算机图形学中绘制平滑的曲线。在C语言中,可以使用贝塞尔曲线算法实现对多边形的平滑处理。 首先,我们需要定义一个数据结构来表示多边形,可以使用数组或链表来存储多边形的顶点坐标。然后,我们需要实现贝塞尔曲线算法的核心部分。 贝塞尔曲线的计算涉及到多个控制点和插值点的计算。在C语言中,可以使用二维数组或结构体数组来存储这些点的坐标。通过计算贝塞尔曲线的控制点,可以得到对应的插值点,从而绘制出平滑的曲线。 在实现贝塞尔曲线算法时,可以使用递归的方式来进行计算。通过递归,我们可以将贝塞尔曲线的计算分解为多个小的计算步骤。首先,我们需要计算出插值点的坐标,并将其存储在一个数组中。然后,根据插值点的计算结果,再次调用计算函数,直到达到我们预期的精度或迭代次数。 最后,将计算出的插值点坐标转换为平滑的多边形。可以使用线段连接插值点来绘制曲线,或者根据插值点来调整多边形的顶点坐标。 总结来说,通过使用C语言实现贝塞尔曲线算法,我们可以对多边形进行平滑处理。这需要定义数据结构来存储多边形的顶点坐标,并实现贝塞尔曲线算法的计算部分。最后,将计算出的插值点转换为平滑的多边形。 ### 回答3: 贝塞尔曲线是一种平滑曲线,可以通过给定的控制点来绘制曲线。使用C语言实现贝塞尔曲线算法可以用来平滑多边形的边缘,增加其美观性。 贝塞尔曲线算法实现过程如下: 1. 首先定义需要绘制贝塞尔曲线的控制点。根据需要平滑的多边形边缘形状,选择适当数量的控制点。 2. 确定绘制曲线的分割段数,即在曲线上选择的离散点数量。 3. 根据控制点之间的位置关系,使用贝塞尔曲线算法计算每个分割段上的点坐标。 4. 在C语言中,可以使用循环结构和数学函数来实现这种计算。 5. 将计算得到的点坐标连接起来,即可绘制出平滑曲线多边形的边缘。 贝塞尔曲线算法的关键在于计算每个点的坐标,主要涉及到点的插值和权重计算。C语言提供了诸如 pow()、sqrt()、sin() 等数学函数来辅助实现这些计算。通过迭代计算控制点和分割段之间的点,可以得到平滑曲线多边形的边缘。 使用C语言实现贝塞尔曲线算法可以增加多边形的美观性,使其边缘更加平滑和流畅。这在图形处理、游戏开发、界面设计等领域都有广泛应用。因此,学习和使用贝塞尔曲线算法是C语言程序员的一项重要技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值