为什么我的太阳(定向光)在-90/90旋转时卡住?

时间:2019-04-27 08:02:28

标签: rotation unreal-engine4

我不知道为什么地球上的太阳将万向节锁定在90 *。

在.h文件中

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="World Environment")
ADirectionalLight *SunLight;

.cpp中我将太阳移到的地方

float p = totalRealTimeSecondsPerGameDay / DeltaTime;
float r = 360 / p;

FRotator newRot;
newRot.Pitch = r;
newRot.Roll = 0.0f;
newRot.Yaw = 0.0f;

SunLight->AddActorLocalRotation(newRot);

它的工作原理非常好.....直到达到90 *或-90 *。

我很迷路。

编辑:为了弄清楚这是一个奇怪的错误,或者我只是想丢失一些东西,我尝试将我的C ++复制到蓝图中以精确地复制该过程,并且它也停在90和-90之间。

我什至尝试使用Quats,因为通过搜索,我发现了很多建议。

FQuat quatRot = FQuat(newRot);
SunLight->AddActorLocalRotation(quatRot, false, 0, ETeleportType::None);

1 个答案:

答案 0 :(得分:0)

这是一个仅在使用相对旋转时发生的问题。

退后一步,我是否建议您使用绝对旋转而不是相对旋转?在当前的实现中,您将遭受累积的浮点舍入误差的困扰;您的太阳会“飘走”比赛时间。如果您改用绝对轮换方式,则可以保证您忠实于游戏时间,同时更正问题:

float gameDaysElapsed = GetWorld()->TimeSeconds / totalRealTimeSecondsPerGameDay;
float alpha;
FMath::Modf(gameDaysElapsed, alpha);

check(FMath::IsWithin(alpha, -SMALL_NUMBER, 1.f + SMALL_NUMBER));    
FRotator rot(alpha * 360.f, 0.f, 0.f);
SunLight->SetActorRotation(rot);

作为脚注,这还允许您应用时间函数,以改变太阳将来的行为方式,而不是线性的。因此,使它像“弹出”这样的动作并在快速弹出之前缓慢穿过天空中心会更容易。