UE5.3 C++ 通过Spline样条实现三维连线,自己UV贴图。

一.制作了基于USplineComponent的画线插件,就是我们常说的样条线。

直接看怎么用,关于插件实现细节,后续会更新,看思路就行。通过ID,管理每一条线。移除删掉上一帧的线条Mesh。第一个点,是本身直接放过去。第二个点是使用AddSplinePoint放进去。让后算两个点的距离,通过材质参数集合,设置UV。最后生成三角形面构成线条。

void UDrawLineSubsystem::UpdateLinePath(int id,FVector First, FVector Second)
{
	int32 pointsNum = 2;
	if (pointsNum <= 1) return;
	
	int32 tmpPathID = id;
	if (LinePathMap.Find(tmpPathID))
	{
		ASplineActor* tmpFlightPath = *LinePathMap.Find(tmpPathID);
		tmpFlightPath->SetActorHiddenInGame(true);
		LinePathMap.Remove(tmpPathID);
		//删除旧的同序号航迹线
		tmpFlightPath->Destroy();
	}
	
	//	//生成轨迹线
	UClass* tmpSplineClass = LoadClass<ASplineActor>(nullptr, TEXT("/Script/Engine.Blueprint'/HMSLineSystem/Blueprints/BP_ConnectLine.BP_ConnectLine_C'"));
	ASplineActor* LinePathActor = Cast<ASplineActor>(GetWorld()->SpawnActor(tmpSplineClass));
	if (!LinePathActor)
	{
		UE_LOG(LogTemp, Error, TEXT("failed to spawn spline actor! UProject2444System::UpdateFlightPath"));
		return;
	}

	LinePathActor->DeleteSplinePointByIndex(1);
		if (!Georeference)
			InitialGeoreference();
		if (!Georeference) return;
	
		if (!First.IsZero())
		{
			//处理点位信息
			FVector tmpDataPosition = FVector(First);
			FVector tmpUELocation = Georeference->TransformLongitudeLatitudeHeightPositionToUnreal(tmpDataPosition);
			
			LinePathActor->SetActorLocation(tmpUELocation);
			First = tmpUELocation;
			//FTransform LocalTransform;
			//LocalTransform.SetLocation(tmpUELocation);
			//LinePathActor->AddSplinePoint(LocalTransform, EPointTransformMode::world);
		}
		if (!Second.IsZero())
		{
			//处理点位信息
			FVector tmpDataPosition = FVector(Second);
			FVector tmpUELocation = Georeference->TransformLongitudeLatitudeHeightPositionToUnreal(tmpDataPosition);

			FTransform LocalTransform;
			LocalTransform.SetLocation(tmpUELocation);
			LinePathActor->AddSplinePoint(LocalTransform, EPointTransformMode::world);
			Second = tmpUELocation;
		}
		LinePathActor->SplineMeshData.MeshSlice = 1;
		LinePathActor->SplineMeshData.FacesCount = 2;
		LinePathActor->SplineMeshData.EdgeLength = 200;
		LinePathActor->SplineMeshData.MeshMode = EMeshMode::BaseOnPoint;
		LinePathActor->SetAllPointsMode(ESplineMode::Curve);
		LinePathActor->SetAllPointsMode(LinePathActor->SplineMeshData.SplineMode);
		LinePathMap.Add(tmpPathID, LinePathActor);
		//TPADataMap.Add(tmpPathID, _TPAData);
	
	///Script/Engine.MaterialInstanceConstant'/Game/ZOthers/Other/Materials/M_Border_Anim_10.M_Border_Anim_10'
	//	//设置材质
		UMaterial* SplineMaterial;
		SplineMaterial = LoadObject<UMaterial>(nullptr, TEXT("/Script/Engine.Material'/Game/ZOthers/Other/Materials/Link.Link'"));
	//	switch (tmpPathID)
	//	{
	//	case 1:	SplineMaterial = LoadObject<UMaterial>(nullptr, FLIGHT_PATH_MATERIAL1); break;
	//	case 2:	SplineMaterial = LoadObject<UMaterial>(nullptr, FLIGHT_PATH_MATERIAL2); break;
	//	case 3:	SplineMaterial = LoadObject<UMaterial>(nullptr, FLIGHT_PATH_MATERIAL3); break;
	//	default:SplineMaterial = LoadObject<UMaterial>(nullptr, FLIGHT_PATH_MATERIAL1); break;
	//	}
		if (SplineMaterial)
			LinePathActor->SplineMeshMaterial = SplineMaterial;
	//
	//	//描绘航迹线
		if (!M_ParamCollection)
		{
			UMaterialParameterCollection* MPC = LoadObject<UMaterialParameterCollection>(nullptr, TEXT("/Script/Engine.MaterialParameterCollection'/Game/ZOthers/Other/Materials/1'"));
			M_ParamCollection = GetWorld()->GetParameterCollectionInstance(MPC);
		}
		if (!M_ParamCollection) return;

		double dis = FVector::Dist(First,Second);
		dis *= 0.01;
		if (id == int(DTypeIdPlatform::A))
		{
			M_ParamCollection->SetScalarParameterValue(FName("ATOB"), dis);
		}

		LinePathActor->CreateSplineMesh();
}

二.材质参数集合在C++使用

材质参数需要的头文件

#include "Materials/MaterialParameterCollection.h"
#include "Materials/MaterialParameterCollectionInstance.h"

材质参数集合,它的改动,在上面的代码里。它在材质里的如下图,只设置了V的平铺,没设置U的平铺。

	UMaterialParameterCollectionInstance* M_ParamCollection;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/972705.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[qt5学习笔记]Application Example示例程序源码解析

开发环境问题 vs2022下直接打开ui、ts文件失败 解决办法如下图&#xff0c; 设置designer独立运行。估计是嵌入运行存在些许bug。 同理&#xff0c;ts编辑工具linguist也存在这个问题。 qrc rc的编辑嵌入编辑都正常&#xff0c;但分离式更稳定可靠。 qt creator编译失败 原…

Ubuntu 系统 LVM 逻辑卷扩容教程

Ubuntu 系统 LVM 逻辑卷扩容教程 前言 在 Linux 系统中&#xff0c;LVM&#xff08;Logical Volume Manager&#xff09;是一种逻辑卷管理工具&#xff0c;允许管理员动态调整磁盘空间&#xff0c;而无需重启系统。 本文将详细介绍如何使用 LVM 扩容逻辑卷&#xff0c;以实现…

Javascript网页设计实例:通过JS实现上传Markdown转化为脑图并下载脑图

功能预览 深度与密度测试 对于测试部分&#xff0c;分别对深度和密度进行了测试&#xff1a; 注意&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;只实现了识别Markdown中的#代表的层级&#xff0c;所以不能使用其余标识符&#xff0…

什么是tomcat

什么是tomcat Tomcat 是由Apache软件基金会开发的一个开源的轻量级Web服务器&#xff0c;主要用于部署和运行Java Servlet和JavaServer Pages (JSP) 技术构建的Web应用。以下是关于Tomcat的一些关键点&#xff1a; Java Web应用容器&#xff1a;Tomcat作为Servlet容器&#x…

一.AI大模型开发-初识机器学习

机器学习基本概念 前言 本文主要介绍了深度学习基础&#xff0c;包括机器学习、深度学习的概念&#xff0c;机器学习的两种典型任务分类任务和回归任务&#xff0c;机器学习中的基础名词解释以及模型训练的基本流程等。 一.认识机器学习 1.人工智能和机器学习 人工智能&am…

Redis未授权访问漏洞原理

redis未授权访问漏洞 目录 redis未授权访问漏洞一、Redis介绍二、redis环境安装三、漏洞原理四、漏洞复现4.1 webshell提权4.2redis写入计划任务反弹shell4.3 ssh key免密登录4.4 Redis基于主从复制的RCE方式 五、Redis加固建议 一、Redis介绍 Redis&#xff0c;全称为Remote …

什么是网络安全?网络安全防范技术包括哪些?

伴随着互联网的发展&#xff0c;它已经成为我们生活中不可或缺的存在&#xff0c;无论是个人还是企业&#xff0c;都离不开互联网。正因为互联网得到了重视&#xff0c;网络安全问题也随之加剧&#xff0c;给我们的信息安全造成严重威胁&#xff0c;而想要有效规避这些风险&…

使用VSCODE开发C语言程序

使用vscode配置C语言开发环境 一、安装VSCODE 1、下载vscode ​ 从官方网站&#xff08;https://code.visualstudio.com/Download&#xff09;上&#xff0c;下载windows版本的vscode 2、安装vscode ​ 下载完毕后&#xff0c;按照提示进行安装即可&#xff08;尽可能不要安…

轴承故障特征—SHAP 模型 3D 可视化

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…

ComfyUI多功能插件安装-Comfy UI Manager

原生ComfyUI中的节点内容较少&#xff0c;在使用过程中所需要的很多实用插件没有 可以安装 Comfy UI Manager 以帮助我们更高效率的使用ComfyUI&#xff08;Comfy UI Manager 也相当于一个节点&#xff0c;但是可以管理、更新其他实用节点&#xff09; ComfyUI是由Dr.Lt.Data开…

PET-SQL:基于大模型的两阶段Text2SQL方法

一. 背景 论文: PET-SQL: A Prompt-Enhanced Two-Round Refinement of Text-to-SQL with Cross-consistency 二. 算法介绍 2.1 主要流程 PET-SQL这篇文章提出了一种创新的基于大型语言模型的Text2SQL方法&#xff0c;该方法将SQL生成过程分为两个不同的阶段。在第一阶段&am…

大模型开发实战篇4:多模态之图片识别

多模态的定义 在人工智能领域&#xff0c;模态指的是数据的不同形式或类型&#xff0c;例如文本、图像、音频、视频等。多模态则意味着模型能够处理和理解多种不同模态的数据。 大模型的多模态指的是那些能够处理和理解多种模态数据的大型人工智能模型。这些模型通常基于深度…

力扣 跳跃游戏 II

贪心算法&#xff0c;存下每一步的最远&#xff0c;去达到全局的最小跳跃次数。 题目 从题中要达到最少次数&#xff0c;肯定是每一步尽可能走远一点。但注意j被限制了范围&#xff0c;这种不用想每一步遍历时肯定选最大的num[i]&#xff0c;但要注意&#xff0c;题中是可以到…

goland无法debug项目

1、其实个原因是因为正在使用的Delve调试器版本太旧&#xff0c;无法兼容当前的Go语言版本1.2。Delve是Go语言的一个调试工具&#xff0c;用于提供源码级别的调试功能。Go语言每隔一段时间会发布新版本&#xff0c;而相应的调试器Delve也可能会更新以提供新的特性或修复已知问题…

SpringAI系列 - ToolCalling篇(二) - 如何设置应用侧工具参数ToolContext(有坑)

目录 一、引言二、集成ToolContext示例步骤1: 在`@Tool`标注的工具方法中集成`ToolConext`参数步骤2:`ChatClient`运行时动态设置`ToolContext`参数三、填坑一、引言 在使用AI大模型的工具调用机制时,工具参数都是由大模型解析用户输入上下文获取的,由大模型提供参数给本地…

​实在智能与宇树科技、云深科技一同获评浙江省“人工智能服务商”、 “数智优品”​等荣誉

近日&#xff0c;浙江省经信厅正式公布《2024 年浙江省人工智能应用场景、应用标杆企业、人工智能服务商及 “数智优品” 名单》。 实在智能获评浙江省“人工智能服务商”&#xff0c;核心产品 “实在 Agent 智能体” 入选 “数智优品”。一同获此殊荣的还有宇树科技、云深处科…

【云安全】云原生-Docker(六)Docker API 未授权访问

Docker API 未授权访问 是一个非常严重的安全漏洞&#xff0c;可能导致严重的安全风险。 什么是 Docker API &#xff1f; Docker API 是 Docker 容器平台提供的一组 RESTful API&#xff0c;用于与 Docker 守护程序进行通信和管理 Docker 容器。通过 Docker API&#xff0c;…

open-webui安装

docker安装openwebui 拉取镜像 docker pull ghcr.io/open-webui/open-webui:maindocker images启动 docker run -d -p 8346:8080 --name open-webui ghcr.io/open-webui/open-webui:maindocker ps查看端口占用 lsof -i:8346访问地址 http://ip:port http://127.0.0.1:8346

在ubuntu上用Python的openpyxl模块操作Excel的案例

文章目录 安装模块读取Excel数据库取数匹配数据和更新Excel数据 在Ubuntu系统的环境下基本职能借助Python的openpyxl模块实现对Excel数据的操作。 安装模块 本次需要用到的模块需要提前安装(如果没有的话) pip3 install openpyxl pip3 install pymysql在操作前&#xff0c;需…

SOME/IP--协议英文原文讲解8

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2 Speci…