ue4绘制线的三种方式

这篇具有很好参考价值的文章主要介绍了ue4绘制线的三种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一种方式,是用样条线,简明扼要,但是打包后就消失了。

	AActor* actor = world->SpawnActor< AActor>(ActorClass);
	actor->AttachToActor(this, FAttachmentTransformRules::KeepRelativeTransform);
	USplineComponent* splineComponent = this->GenerateSplineComponent(info, radius,actor);
	splineComponent->AttachToComponent(actor->GetRootComponent(), FAttachmentTransformRules::KeepRelativeTransform);
	TArray<FVector> posArray;
			USplineComponent* splineComponent = this->GenerateSplineComponent(posArray,actor);
	splineComponent->AttachToComponent(actor->GetRootComponent(), FAttachmentTransformRules::KeepRelativeTransform);

USplineComponent* MyActor::GenerateSplineComponent(TArray< FVector> posArray, AActor* actor)
{

TArray<FVector> posXYZArray;
USplineComponent* splineTrack = NewObject<USplineComponent>(actor, TEXT("Spline"));
splineTrack->RegisterComponent();
//设置样本条的颜色
splineTrack->SetUnselectedSplineSegmentColor(FLinearColor(0.0f, 0.0f, 1.0f));
//设置样条线的粗细或者宽度
splineTrack->ScaleVisualizationWidth = 70.0f;
splineTrack->SetSplineLocalPoints(posArray);
splineTrack->SetDrawDebug(true);
splineTrack->UpdateSpline();
splineTrack->SetHiddenInGame(false);

return splineTrack;

}

第二种方式是用ULineBatchComponent画线,这个是世界坐标系的,也就是说,即使父子节点,也不能用相对位置。好处是,是实体,可以从样条线中获取位置。关键就在于FSplinePositionLinearApproximation::Build()这个方法。这个方法有三个参数,第三个参数,可以在保持曲线不变的情况下,控制点的数量,这就很好了,比如,如果近处需要100个点,那么远处10个点就Ok了。

ULineBatchComponent* MyActor::GetBatchLineComponentFromSplineComponent(
AActor* parentActor,
USplineComponent* splineComponent)
{
if (nullptr == splineComponent)
{
return nullptr;
}
TArray< FSplinePositionLinearApproximation> outputSpline;
outputSpline.Empty();
FSplinePositionLinearApproximation::Build(splineComponent->SplineCurves, outputSpline);
int pointNumber = outputSpline.Num();
if ( 0 == pointNumber)
{
return nullptr;
}

ULineBatchComponent* lineBatchComponent = NewObject<ULineBatchComponent>(parentActor, TEXT("Line"));
lineBatchComponent->RegisterComponent();
TArray<FBatchedLine> batchLineArray;
batchLineArray.Empty();
for (int ptID = 0; ptID < pointNumber - 1; ptID++)
{
	
	FVector line_startPos = outputSpline[ptID].Position + _worldLocation;
	FVector line_endPos = outputSpline[ptID+1].Position + _worldLocation;

	FBatchedLine line = FBatchedLine(line_startPos, line_endPos, FLinearColor::Red, 0, 10, 0);
	batchLineArray.Add(line);
}
lineBatchComponent->BatchedLines.Empty();
lineBatchComponent->DrawLines(batchLineArray);

return lineBatchComponent;

}

void FSplinePositionLinearApproximation::Build(const FSplineCurves& InCurves, TArray< FSplinePositionLinearApproximation>& OutPoints, float InDensity)
{
OutPoints.Reset();

const float SplineLength = InCurves.GetSplineLength();
int32 NumLinearPoints = FMath::Max((int32)(SplineLength * InDensity), 2);

for (int32 LinearPointIndex = 0; LinearPointIndex < NumLinearPoints; ++LinearPointIndex)
{
	const float DistanceAlpha = (float)LinearPointIndex / (float)NumLinearPoints;
	const float SplineDistance = SplineLength * DistanceAlpha;
	const float Param = InCurves.ReparamTable.Eval(SplineDistance, 0.0f);
	OutPoints.Emplace(InCurves.Position.Eval(Param, FVector::ZeroVector), Param);
}

OutPoints.Emplace(InCurves.Position.Points.Last().OutVal, InCurves.ReparamTable.Points.Last().OutVal);

}

第三个方式就是用USplineMeshComponent,按照样条线的各段生成mesh就可以了。

void MyActor::GenerateSplineMeshComponentFromSplineComponent(AActor* parentActor, USplineComponent* splineComponent)
{
if (nullptr == splineComponent)
{
return ;
}
for (int i = 0; i < splineComponent->GetNumberOfSplinePoints() - 1; i++)
{
USplineMeshComponent* splineMesh = NewObject< USplineMeshComponent>(parentActor, TEXT(“SplineMesh” + i));
splineMesh->RegisterComponent();
splineMesh->AttachToComponent(parentActor->GetRootComponent(), FAttachmentTransformRules::KeepRelativeTransform);
splineMesh->SetStaticMesh(_splineStaticMesh);

	splineMesh->SetMobility(EComponentMobility::Type::Movable);
	FVector pointLocationStart, pointTangentStart, pointLocationEnd, pointTangentEnd;
	splineComponent->GetLocalLocationAndTangentAtSplinePoint(i, pointLocationStart, pointTangentStart);
	splineComponent->GetLocalLocationAndTangentAtSplinePoint(i + 1, pointLocationEnd, pointTangentEnd);

	splineMesh->SetStartAndEnd(pointLocationStart, pointTangentStart, pointLocationEnd, pointTangentEnd);
}

}文章来源地址https://www.toymoban.com/news/detail-401918.html

到了这里,关于ue4绘制线的三种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4/5样条线学习(一):基础的样条线使用

    目录 效果展示: 制作: 组件 逻辑 注:按住alt拉轴可以拉出多一个点 第一步我们创建一个蓝图,命名为BP_Sline: 之后我们开始找组件,输入bill,我们可以看见下面这些,我们要的是第一个,这个的目的是为了让你更好的看到样条线的根组件在哪: 然后将这个发到根组件替

    2024年02月15日
    浏览(36)
  • UE4/5样条线学习(二):样条网格体组件的使用

    目录 效果展示: 制作:         前面的步骤和之前的UE4/5样条线学习(一):基础的样条线使用_多方通行8的博客-CSDN博客是一样的。         创建一个actor蓝图,然后一个公告板组件,只不过这里我们要使用的是样条网格体组件。  然后选择模型:最好自然是一个水

    2024年02月16日
    浏览(27)
  • UE4物体随着样条线(Spline)运动

    一定要经过起止点,若干个控制点用于控制曲线弯曲的方向,最终形成一条 光滑的曲线 。 由于贝塞尔曲线点太多了不好控制,一般每四个点做一次贝塞尔曲线。得到的若干段相邻贝塞尔曲线的连接点需要共线且距离相同,即为 C1连续 (一阶连续可导)。 得到数学表达式如

    2024年02月11日
    浏览(35)
  • UE4样条线移动,玩家只需要控制旋转

    1.创建Actor并命名为“A_Spline” 2.创建Pawn并命名为“P1” 3以上创建的蓝图类可以使用自己的命名!!!!! 第二步:给P1写上蓝图 1.我们首先给P1写蓝图 2.在输入映射中设置一个事件Yaw 3.为鼠标的X轴,数值为1 4.如图写上刚刚设置的输入事件 第三步:给A_Spline写上蓝图 1.添加一

    2023年04月09日
    浏览(42)
  • 在UE4蓝图中利用样条线组件(Spline)生成道路

    在场景中添加道路常用的有两种 一种是在三方建模软件(3Dmax Maya 等)建好后导入到UE中 第二种是在地形模式(Landscape)下设置地形的起伏形成道路或者做个 另一个还有“顶点绘制”,这个是给模型附加两种材质,再根据模型的顶点分布,显示一个隐藏一个,进而实现道路的

    2023年04月09日
    浏览(34)
  • UE4:使用样条生成随机路径,并使物体沿着路径行走

    参考自:样条函数 - 馒头and花卷 - 博客园 三次样条(cubic spline)插值 - 知乎 B-Spline(三)样条曲线的性质 - Fun With GeometryFun With Geometry 个人理解的也不是非常深,但是大概要知道的就是样条具有局部特性,每一个区间的曲线只与该区间两端端点的位置和斜率有关。 参考自:ue4

    2023年04月26日
    浏览(37)
  • 测量鼠标DPI的三种方法,总有一种适合你

    DPI(dots per inch)代表每英寸点数,是一种用于各种技术设备(包括打印机)的测量方法,但对于鼠标来说,指的是鼠标在桌面上移动1英寸的距离的同时,鼠标光标能够在屏幕上移动多少“点”。 许多游戏鼠标都有按钮,可以让你在玩游戏时动态切换DPI,但如果你不知道鼠标

    2024年01月16日
    浏览(30)
  • canvas绘制图片的三种方法(图文示例)

    查看专栏目录 canvas示例教程100+专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重要的帮助。 如何使用canvas来绘制图片呢?这里有三种方法。 d

    2024年01月16日
    浏览(37)
  • Flask的一种启动方式和三种托管方式

    Flask 支持使用原生的 app.run() 方法来启动应用程序。这种方法是最简单、最基本的启动方式,适用于开发环境和小型应用程序。 以上代码定义了一个简单的 Flask 应用程序,其中一个路由 / 映射到了一个名为 hello_world() 的视图函数。在最后一行,我们通过 app.run() 方法启动了应

    2024年02月06日
    浏览(25)
  • UE4 几种常见的项目优化方式

    当屏幕某一块像素被多盏灯光所影响,那么也会拖慢帧率,可以打开灯光复杂度视图进行查看,屏幕上越红的地方灯光复杂度越高,尝试降低灯光半径可以解决: 有时候我们并不知道目标模型的材质应该使用多大尺寸的贴图,对远处物体赋予过大尺寸的贴图会造成带宽的浪费

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包