답변:
0에서 pi까지의 문제와 관련하여 일반적으로 X를 배율로 스케일하면됩니다. 예:
y = sin(x * pi / worldWidth)
그러나 이것은 아마도 당신이 찾고있는 곡선을 얻지 못합니다. 파라 메트릭 형식을 사용해야합니다.
t = 0 -> pi over the course of a day
y = sin(t) -> goes from 0 up to 1 at noon, then down to 0 again
x = (1-cos(t))/2 -> starts at 0 goes up to 1 by sundown.
Y에 대한 sin과 X에 대한 cos의 조합은 타원을 추적합니다.
지미가 말했듯이 타원이 아마도이 동작에 더 적합 할 것입니다. 여기에 관심이있는 사람들을 위해 좀 더 자세하게 구현하는 방법에 대한 아이디어가 있습니다.
시간이 걸리다
우선 게임 세계에서 시간을 추적하는 변수가 필요합니다. 원하는 방식으로 구현할 수 있지만 다음은 예입니다. hours0에서 24까지 다양한 변수를 사용합니다 (24에 도달하면 다시 0으로 줄 바꿈).
실생활과는 달리, 나는 하루가 0 시간에 시작하고 밤은 12 시간에 시작한다는 것을 고려할 것입니다. 이렇게하면 일부 계산이 쉬워집니다.
또한 실시간과 관련하여 게임 시간이 변경되는 속도를 정의합니다. 이 예에서, 실시간 2 분마다 게임에서 1 시간에 해당합니다.
float hours = 0.0f; // From 0 to 24 wrapping around
const float HoursPerSecond = 1f / 120f; // E.g. 2 minutes = 1 hour ingame
public void Update(float elapsed)
{
hours += elapsed * HoursPerSecond; // Advance clock
if(hours >= 24f) hours -= 24f; // Wrap around 24 hours
}
구성
이제 태양의 움직임을 설정하기 전에 몇 가지 매개 변수를 지정해야합니다. 특히 X 값은 수평선에서 증가하고 X 값은 수평선에서 떨어집니다. 또한 Y가 수평선에 해당하는 것과 그 선 위로 얼마나 높아야합니까?
float startX = 0;
float endX = 1000;
float horizonY = worldHeight/2;
float amplitudeY = 200;
태양의 좌표 계산
이제 주어진 시간 동안 태양의 위치를 계산할 차례입니다. Jimmy가 사용한 것과 동일한 파라 메트릭 함수를 사용하지만 대신 [0..2PI] 범위의 도메인을 사용합니다 (일몰까지 태양을 원래 위치로 되돌리기 위해).
x = (1-cos (t)) / 2
y = 죄 (t)
이것은 X 값이 0에서 1로 변한 다음 다시 0으로 다시 돌아가고 (태양의 시작 및 끝 X 값에 매핑 될) Y 값이 0에서 시작하여 1로 이동하기 때문에 좋은 기능입니다 다시 0으로 설정하고 ( 당일 부분 이 될 것 입니다 ) 원래 위치로 돌아 오기 전에 음의 측면에서 똑같은 것을 반복합니다 ( 이 시점에서 태양이 그려지지는 않지만 우리의 밤 일 것입니다).
첫 번째 단계는 [0..24) 범위에서 [0..2PI) 함수 범위까지 시간을 조정하는 것입니다.
float t = (hours / 24f) * MathHelper.TwoPi; // Scale: [0..24) to [0..2PI)
다음으로 위에서 언급 한 0에서 1 사이의 값을 가져 오는 함수를 적용합니다.
float horizontal = (float)((1-Math.Cos(t)) / 2f); // Changes: 0 1 0
float vertical = (float)(Math.Sin(t)); // Changes: 0 1 0 -1 0
그리고 마지막으로 태양의 매개 변수를 사용하여 해당 값을 조정합니다.
float sunX = startX + (endX - startX) * horizontal; // From startX to endX and back
float sunY = horizonY + amplitydeY * vertical; // Up and down around horizonY