以下のようなコードでMeshの長さをあまり大きく変えないようにSplineMeshを作成しようとしています。
もととなるスプラインのポイントの間隔がメッシュに比べて大きい場合は複数に分割するようにしています。
GetTangentAtDistanceAlongSplineで求めたタンジェントにDivLengthをかけているのはネットでそのような例を見かけたからなのですが、正しいやり方ではないのかもとのスプラインと生成されたメッシュが微妙にずれてしまいます。
そこで質問なのですが、こういう場合のSetStartAndEndに渡すタンジェントの値はどのように求めればよいのでしょうか?
<br/>
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
{
for (int j = 0; j < Spline->GetNumberOfSplinePoints()-1; ++j) {
float d0 = Spline->GetDistanceAlongSplineAtSplinePoint(j);
float d1 = Spline->GetDistanceAlongSplineAtSplinePoint(j+1);
float d = d1 - d0;
int DivNum = FMath::RoundToInt(d / MeshLength);
if (DivNum <= 0) DivNum = 1;
float DivLength = d / DivNum;
TArray<UPrimitiveComponent*> SplineMeshes;
for (int i = 0; i < DivNum; ++i) {
USplineMeshComponent* SplineMesh = Cast< USplineMeshComponent >(UElpisEditorUtilityFunction::AddSceneComponent(this->RootComponent, USplineMeshComponent::StaticClass()));
SplineMesh->SetForwardAxis(ESplineMeshAxis::X);
SplineMesh->SetStaticMesh(GrindActor->GetSplineMeshObject());
FVector StartPos = Spline->GetLocationAtDistanceAlongSpline(d0+DivLength * i, ESplineCoordinateSpace::Local);
FVector StartTan = Spline->GetTangentAtDistanceAlongSpline(d0 + DivLength * i, ESplineCoordinateSpace::Local).GetSafeNormal()* DivLength;
FVector EndPos = Spline->GetLocationAtDistanceAlongSpline(d0+DivLength * (i + 1), ESplineCoordinateSpace::Local);
FVector EndTan = Spline->GetTangentAtDistanceAlongSpline(d0 + DivLength * (i + 1), ESplineCoordinateSpace::Local).GetSafeNormal()* DivLength;
SplineMesh->SetStartAndEnd(StartPos, StartTan, EndPos, EndTan);
<br/>
SplineMeshes.Add(SplineMesh);
}
}
}