UE5 圆周运动、贝塞尔曲线运动、贝塞尔曲线点

ops/2024/10/20 17:59:19/

圆周运动

 贝塞尔曲线路径运动

 蓝图函数库创建贝塞尔曲线点

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"/*** */
UCLASS()
class CARTEST_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{GENERATED_BODY()public:UFUNCTION(BlueprintCallable, Category = "BezierCurve")static TArray<FVector> GenerateBezierCurvePoints(const FVector& P0, const FVector& P1, const FVector& P2, int32 NumPoints);};

// Fill out your copyright notice in the Description page of Project Settings.#include "MyBlueprintFunctionLibrary.h"TArray<FVector> UMyBlueprintFunctionLibrary::GenerateBezierCurvePoints(const FVector& P0, const FVector& P1,const FVector& P2, int32 NumPoints)
{TArray<FVector> CurvePoints;// 确保 NumPoints 大于 1,否则没有足够的点来生成曲线if (NumPoints < 2) {UE_LOG(LogTemp, Warning, TEXT("NumPoints 必须大于 1"));return CurvePoints;}// 创建临时点数组用于曲线生成TArray<FVector> TempPoints;for (int32 i = 0; i < NumPoints; i++){float t = static_cast<float>(i) / (NumPoints - 1);FVector Point = FMath::Lerp(FMath::Lerp(P0, P1, t), FMath::Lerp(P1, P2, t), t);TempPoints.Add(Point);}// 计算曲线总长度和各段长度float TotalLength = 0.0f;TArray<float> SegmentLengths;for (int32 i = 1; i < TempPoints.Num(); i++){float SegmentLength = FVector::Dist(TempPoints[i - 1], TempPoints[i]);SegmentLengths.Add(SegmentLength);TotalLength += SegmentLength;}// 防止 TotalLength 为 0if (TotalLength <= KINDA_SMALL_NUMBER){UE_LOG(LogTemp, Warning, TEXT("曲线总长度为 0"));CurvePoints.Add(P0); // 添加起点CurvePoints.Add(P2); // 添加终点return CurvePoints;}// 计算等距点CurvePoints.Add(P0); // 起点float SegmentTarget = TotalLength / (NumPoints - 1);float DistanceAccumulated = 0.0f;for (int32 i = 1; i < TempPoints.Num(); i++){DistanceAccumulated += SegmentLengths[i - 1];while (DistanceAccumulated >= SegmentTarget){float LerpAlpha = (SegmentTarget - (DistanceAccumulated - SegmentLengths[i - 1])) / SegmentLengths[i - 1];FVector Point = FMath::Lerp(TempPoints[i - 1], TempPoints[i], LerpAlpha);CurvePoints.Add(Point);DistanceAccumulated -= SegmentTarget;}}CurvePoints.Add(P2); // 终点return CurvePoints;
}

 

 


http://www.ppmy.cn/ops/127048.html

相关文章

python-docx -- 读取word文档中的文本

文章目录 word文档案例基于python-docx读取段落基于pywin32读取段落基于pywin32读取表格 word文档案例 需求&#xff1a; 读取所有的段落文本&#xff0c;并使用字典表示每一个段落&#xff1b;段落字典格式如下&#xff1a; {"type": "text","cont…

.net core 3.0 与 6.0 有哪些不同

.NET Core 3.0 和 .NET 6.0&#xff08;注意&#xff0c;从 .NET 5.0 开始&#xff0c;微软将 .NET Core 和 .NET Framework 合并为一个统一的 .NET 平台&#xff09;之间有许多重要的区别。这些区别包括性能改进、新功能、API 的变化以及对不同平台的支持。下面是一些主要的区…

网络爬虫-数美滑块验证码

仅供研究学习使用。 今天带来的是数美滑块验证码的逆向 目标站 --> 传送门 解决此类验证码 首先要解决滑动距离的判定 无论是使用selenium还是使用协议的方式来破解 都绕不开滑动距离的识别 滑动距离可以参考以前我博客上的方式&#xff0c;或者找一找开源的一些算法&am…

SpringBoot中的RedisTemplate对象中的setIfAbsent()方法有什么作用?

文章目录 原子性操作用于分布式锁可选的过期时间 setIfAbsent() 方法是 Redis 中用于设置一个键值对的命令&#xff0c;只有在该键不存在时才会设置成功。它通常用于实现分布式锁的逻辑 主要功能: 原子性操作 setIfAbsent() 是一个原子性操作&#xff0c;意味着在执行该操作的…

理解ES6中的Generator

Generator是ES6引入的一种特殊的函数&#xff0c;允许函数执行过程可以暂停和恢复&#xff0c;具有异步编程的优势。通过function*声明生成器函数&#xff0c;使用yield关键字来暂停函数执行&#xff0c;并通过next()方法来恢复执行。 特点与机制&#xff1a; 暂停执行&#…

基于FPGA的以太网设计(三)

通过前文介绍了RGMII接口时序我们可以知道&#xff0c;RGMII接口是在时钟信号的上升沿和下降沿均进行数据的传输&#xff0c;而FPGA则在时钟的单沿传输数据&#xff0c;因此我们需要编写代码将RGMII接口转换为GMII接口。 由于前面的介绍我们知道RTL8211默认工作在延时状态&…

【STM32】C语言复习以及底层寄存器映射

位操作 &运算 通过与一堆1111&#xff0c;来筛选想要的位并保留 通过与一堆0000&#xff0c;来将不想要的位置置0 110011011 111111000 |运算 通过或一堆1111&#xff0c;用来全置1 通过或一堆0000&#xff0c;来筛选想要的位 右移 2 >> 1&#xff1a;相当…

JSONArray根据指定字段去重

JSONArray dataList new JSONArray();这儿省略dataList 加数据的过程 dataList new JSONArray(dataList.stream().distinct().collect(Collectors.toList())); Set<String> timestamps new HashSet<>();根据时间字段去重 dataList dataList.stream().map(obj -…