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

news2024/11/24 18:55:45

圆周运动

 贝塞尔曲线路径运动

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

// 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 为 0
	if (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.coloradmin.cn/o/2216151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件IO知识梳理及练习

1> 使用fread和fwrite完成两个文件的拷贝&#xff0c;要求源文件和目标文件由外界输入 #include <myhead.h> typedef struct sockaddr_in addr_in_t; typedef struct sockaddr addr_t; typedef struct sockaddr_un addr_un_t; int main(int argc, const char *argv[])…

使用OpenCV实现基于FisherFaces的人脸识别

引言 随着人工智能技术的发展&#xff0c;人脸识别已经成为日常生活中不可或缺的一部分。在众多的人脸识别算法中&#xff0c;FisherFaces 方法因其简单易用且具有良好的识别效果而备受青睐。本文将详细介绍如何使用Python和OpenCV库实现基于FisherFaces的人脸识别系统&#x…

Flink On kubernetes

Apache Flink 是一个分布式流处理引擎&#xff0c;它提供了丰富且易用的API来处理有状态的流处理应用&#xff0c;并且在支持容错的前提下&#xff0c;高效、大规模的运行此类应用。通过支持事件时间&#xff08;event-time&#xff09;、计算状态&#xff08;state&#xff09…

知道ip地址怎么看网络地址

在计算机网络的世界里&#xff0c;IP地址是设备之间通信的基础。然而&#xff0c;仅仅知道一个设备的IP地址并不足以完全理解它在网络中的位置和作用。网络地址&#xff0c;作为IP地址的一个重要组成部分&#xff0c;为我们提供了关于设备所属网络的更多信息。本文将深入探讨如…

从零开始搭建:基于在线教育系统源码的线上网校开发详解

本文将通过详细的技术分析&#xff0c;帮助你了解如何基于在线教育系统源码搭建线上网校&#xff0c;从而帮助你更好地构建稳定且高效的线上教育平台。 一、为什么选择在线教育系统源码&#xff1f; 在搭建线上网校时&#xff0c;使用成熟的在线教育系统源码是一个快速且高效…

【LwIP源码学习3】TCP协议栈分析——数据接收流程

前言 本文介绍代码在lwip的tcp_in.c文件中&#xff0c;主要介绍TCP协议栈中数据的接收流程。 正文 1、一个正常的TCP数据&#xff0c;首先会传入到 tcp_input(struct pbuf *p, struct netif *inp)函数&#xff0c;其中指针p指向传入的数据流。 2、从数据流中获取TCP头部 …

mysql的一点理解

1、mysql B树 B树非叶子结点中的key存储的是页的用户记录中最小/最大的主键值&#xff0c;之前不知道非叶子结点中的key存的是最小/最大&#xff0c;以为随便存的一个。 2、mysql范围查询 如果对多个列都进行范围查询&#xff0c;只有对索引最左边的那个列索引才生效。 比如…

字符串和字符数组

1.字符串和\0 c语言中有字符类型&#xff0c;但没有字符串类型&#xff0c;c语言中字符串就是由双引号引起来的一串字符&#xff0c;比如&#xff1a;“abcdef” 字符串常量在末尾隐藏了一个’\0’的转义字符&#xff0c;\0’是作为字符串的结束标志存在的 库函数printf与str…

隔离器“芯”实力,华普微荣获“2024年度硬核信号链芯片奖”

10月14日&#xff0c;由深圳市芯师爷科技有限公司和慕尼黑华南电子展携手主办&#xff0c;深圳市半导体行业协会支持的“第六届硬核芯生态大会暨颁奖典礼”&#xff0c;已于深圳国际会展中心&#xff08;宝安新馆&#xff09;成功举办。值此盛会之际&#xff0c;华普微受邀参会…

热成像人像算法呈现方式!

一、热红外成像技术 热红外成像技术利用物体发出的红外辐射进行成像&#xff0c;这种辐射与物体的温度有关。因此&#xff0c;热红外成像可以不受光照条件的影响&#xff0c;且在图像中&#xff0c;人体由于温度较高&#xff0c;通常会比背景显得更亮。 二、图像处理算法 阈…

Python爬虫必备的8大技巧,学习爬虫技巧必看!

想要快速学习爬虫&#xff0c;最值得学习的语言一定是Python&#xff0c;Python应用场景比较多&#xff0c;比如&#xff1a;Web快速开发、爬虫、自动化运维等等&#xff0c;可以做简单网站、自动发帖脚本、收发邮件脚本、简单验证码识别脚本。 爬虫在开发过程中也有很多复用的…

如何有效进行主机加固?深信达MCK提供答案

在数字化时代&#xff0c;企业面临的网络安全威胁日益严峻&#xff0c;尤其是勒索病毒等恶意软件的攻击&#xff0c;给企业带来了巨大的挑战。为了有效应对这些威胁&#xff0c;企业需要采取全面的网络安全防护措施&#xff0c;其中主机加固成为了关键的一环。深信达的MCK主机加…

【Arthas】【持续更新】三分钟掌握arthas常用查询命令,入门到实战

Arthas 一、下载和启动1、官网地址2、下载3、启动4、退出 二、常用命令1、dashboard&#xff1a;当前系统的实时数据面板2、profiler&#xff1a;监控进程的cpu\内存使用情况。细致到某个方法采集与生成报告查看 profiling 状态查看 profiler 自身的内存占用 3、thread&#xf…

GPT4o,GPTo1-preview, 拼

兄弟们GPT刚开的 需要上车的扣&#xff0c;工作用 大家一起PIN分摊点压力。 在当今数字化的时代&#xff0c;程序员这一职业已经从幕后走到了前台&#xff0c;成为推动科技进步和社会变革的关键力量。编写代码、解决问题、不断学习新技术&#xff0c;程序员们的日常充满了挑战与…

SpringMVC拦截器应用实例与优化

前言 本文将介绍如何使用SpringMVC的拦截器的基本使用 拦截器概念 SpringMVC拦截器&#xff08;Interceptor&#xff09;是一种动态拦截方法调用的机制&#xff0c;它能够在指定的方法调用前后执行预先设定的代码&#xff0c;甚至阻止原始方法的执行。拦截器在Spring MVC框架中…

利士策分享,美国“假旗”行动,是否成为了网络空间的阴霾?

利士策分享&#xff0c;美国“假旗”行动&#xff0c;是否成为了网络空间的阴霾? 在当今这个信息化时代&#xff0c;网络空间已经成为国家间竞争与合作的重要领域。然而&#xff0c;美国却频繁采取一种名为“假旗行动”的卑劣手段&#xff0c;污染全球网络空间&#xff0c;给世…

《最优化方法》

课件是学习的核心内容 这门课&#xff0c;作业自己交&#xff0c;但是老师不做记录&#xff0c;上课不点名&#xff0c; 不记录平时成绩。 第一章 最优化问题的概述 1.1 概述&#xff08;和考试内容无关&#xff0c;了解内容&#xff09; 例题1.1.1运输问题 数学模型&#x…

(37)使用MATLAB画出余弦波的频谱

文章目录 前言一、MATLAB仿真代码二、仿真结果画图 前言 首先使用MATLAB生成一段余弦信号&#xff0c;然后对其进行FFT变换&#xff0c;画出其频谱。 一、MATLAB仿真代码 代码如下&#xff1a; f [50, 100]; % 两个余弦波的频率 fs 1000; …

论文 | OpenICL: An Open-Source Framework for In-context Learning

主要内容&#xff1a; 2. 提供多种 ICL 方法&#xff1a; 3. 完整的教程&#xff1a; 4. 评估和验证&#xff1a; 背景&#xff1a; 随着大型语言模型 (LLM) 的发展&#xff0c;上下文学习 (ICL) 作为一种新的评估范式越来越受到关注。问题&#xff1a; ICL 的实现复杂&#xf…

springboot在线医疗问答平台

基于springbootvue实现的在线医疗问答平台 &#xff08;源码L文ppt&#xff09;4-088 4 系统设计 4.1 功能模块设计 在线医疗问答平台根据权限类型进行分类&#xff0c;主要可分为用户、医生和管理员三大模块。用户、医生模块主要实现了修改个人信息&#xff0c;查看…