태양 운동 기능?


9

따라서 수평선에 설정된 태양 스프라이트 (x = 0, y = worldheight / 2)를 감안할 때 태양을 높이고 내리는 기능을 고안하려고합니다.

이 작업을 수행하는 가장 좋은 방법은 죄 기능이지만 사용 방법을 모르겠습니다.

y = sin (x)를 사용하는 경우 x는 전체 곡선에 대해 0과 pi 사이의 범위에 있어야하고 X에 대해서는 일정한 속도를 가져야합니다.

어떤 생각이나 제안?

편집 : 고마워요!

일하는!

답변:


7

0에서 pi까지의 문제와 관련하여 일반적으로 X를 배율로 스케일하면됩니다. 예:

y = sin(x * pi / worldWidth)

http://www.wolframalpha.com/input/?i= 플롯 % 5BSin % 5Bx % 5D % 2C + % 7Bx % 2C + 0 % 2C + Pi % 7D % 5D

그러나 이것은 아마도 당신이 찾고있는 곡선을 얻지 못합니다. 파라 메트릭 형식을 사용해야합니다.

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.

http://www.wolframalpha.com/input/?i=ParametricPlot%5B%7B1+-+Cos%5Bt%5D%2C+Sin%5Bt%5D%7D%2C+%7Bt%2C+0%2C+Pi% 7D % 5D

Y에 대한 sin과 X에 대한 cos의 조합은 타원을 추적합니다.


고마워요. 나는 수학 중심이 아닙니다. 수학에서의 나의 기술은 거의 기초적인 미적분학입니다.
Ross

12

지미가 말했듯이 타원이 아마도이 동작에 더 적합 할 것입니다. 여기에 관심이있는 사람들을 위해 좀 더 자세하게 구현하는 방법에 대한 아이디어가 있습니다.

시간이 걸리다

우선 게임 세계에서 시간을 추적하는 변수가 필요합니다. 원하는 방식으로 구현할 수 있지만 다음은 예입니다. 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

놀랍게도 +1, 유감스럽게도 두 가지 답변을 표시 할 수 없습니다!
Ross

문제 없습니다. 어쨌든 지미와 같은 기본 공식을 사용했습니다. :)
David Gouveia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.