Почему мое солнце (направленный свет) застревает при -90/90 вращении? - PullRequest
0 голосов
/ 27 апреля 2019

Я не могу понять, почему на Земле мое солнце блокируется на 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 голосов
/ 06 мая 2019

Эта проблема возникает только при использовании относительных поворотов.

Сделав шаг назад, могу ли я предложить вам использовать абсолютные вращения вместо относительных? В вашей текущей реализации вы будете страдать от кумулятивных ошибок округления с плавающей точкой; ваше солнце будет "дрейфовать" во время игры. Если вместо этого вы используете абсолютное вращение, вы гарантируете, что сохраняете верность игровому времени, исправляя свою проблему:

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);

В качестве сноски это также позволяет вам применять функцию времени, чтобы изменить поведение вашего солнца в будущем, а не быть линейным. Поэтому было бы легче заставить его делать такие вещи, как «всплывающее» и медленно перемещаться по центру неба, например, прежде чем быстро уйти вниз.

...