Berfungsi untuk pergerakan matahari?

9

Jadi, mengingat set sprite matahari di cakrawala (x = 0, y = worldheight / 2) Saya mencoba untuk merancang fungsi untuk membuat matahari terbit, lalu jatuh.

Cara terbaik untuk melakukan ini adalah fungsi dosa, tetapi saya tidak tahu bagaimana menggunakannya.

jika menggunakan y = sin (x), maka x harus berkisar antara 0 dan pi untuk kurva penuh, sementara memiliki kecepatan konstan untuk X.

Ada pemikiran atau saran?

Sunting: Terima kasih kawan!

Sun bekerja!

Ross
sumber

Jawaban:

7

Mengenai masalah 0 hingga pi, secara umum yang harus Anda lakukan adalah menskalakan X dengan pengganda. Contoh:

y = sin(x * pi / worldWidth)

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

Namun, ini tidak mendapatkan kurva yang mungkin Anda cari. Anda harus menggunakan formulir parametrik:

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

Kombinasi dosa untuk Y dan cos untuk X ini akan melacak elips.

Jimmy
sumber
Terima kasih, ini luar biasa. Saya tidak terlalu matematika-sentris. Keterampilan saya dalam Matematika cukup banyak hanya kalkulus yang belum sempurna.
Ross
12

Seperti kata Jimmy, elips mungkin lebih cocok untuk gerakan ini. Berikut adalah beberapa ide tentang bagaimana sebenarnya mengimplementasikannya dengan sedikit lebih detail bagi mereka yang tertarik.

Mengambil waktu

Sebagai permulaan, Anda membutuhkan variabel untuk melacak waktu di dunia game. Anda dapat menerapkannya dengan cara apa pun yang Anda suka, tetapi inilah sebuah contoh. Saya akan menggunakan variabel yang dipanggil hoursyang bervariasi dari 0 hingga 24 (meskipun ketika mencapai 24 itu akan kembali ke 0).

Tidak seperti kehidupan nyata, saya hanya akan mempertimbangkan hari itu dimulai pada 0 jam, dan malam dimulai pada 12 jam. Ini akan membuat beberapa perhitungan lebih mudah.

Saya juga akan menentukan tingkat perubahan waktu permainan dalam kaitannya dengan waktu nyata. Dalam contoh ini, setiap dua menit waktu nyata akan sesuai dengan satu jam dalam permainan.

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
}

Konfigurasi

Sekarang sebelum mengatur gerakan matahari kita, kita perlu menentukan beberapa parameternya. Secara khusus, pada nilai X apa yang dinaikkannya dari cakrawala, dan pada nilai X apa nilai itu jatuh ke cakrawala? Juga, apa yang Y sesuai dengan cakrawala, dan seberapa tinggi dia seharusnya naik di atas garis itu.

float startX = 0;
float endX = 1000;
float horizonY = worldHeight/2;
float amplitudeY = 200;

Menghitung Koordinat Matahari

Sekarang saatnya menghitung posisi matahari kita untuk waktu tertentu dalam sehari. Saya akan menggunakan fungsi parametrik yang sama yang digunakan oleh Jimmy tetapi dengan domain mulai dari [0..2PI] sebagai gantinya (untuk membawa matahari kembali ke posisi semula saat fajar):

x = (1-cos (t)) / 2

y = dosa (t)

Ini adalah fungsi yang baik karena nilai X bervariasi dari 0 hingga 1 dan kemudian kembali ke 0 lagi (yang akan kami pemetaan ke nilai X awal dan akhir matahari) dan nilai Y dimulai dari 0 dan bergerak ke 1 dan kembali ke 0 lagi (yang akan menjadi porsi hari kita ) dan kemudian mengulangi hal yang sama persis di sisi negatif sebelum kembali ke posisi semula (yang akan menjadi malam kita meskipun matahari tidak akan ditarik pada titik ini).

Langkah pertama adalah penskalaan jam dari rentang [0..24) ke rentang fungsi kami yaitu [0..2PI):

float t = (hours / 24f) * MathHelper.TwoPi;          // Scale: [0..24) to [0..2PI)

Selanjutnya kita menerapkan fungsi untuk mendapatkan kembali nilai antara 0 dan 1 yang saya bicarakan di atas:

float horizontal = (float)((1-Math.Cos(t)) / 2f);    // Changes: 0 1 0
float vertical = (float)(Math.Sin(t));               // Changes: 0 1 0 -1 0

Dan akhirnya kami skala nilai-nilai itu menggunakan parameter matahari:

float sunX = startX + (endX - startX) * horizontal;    // From startX to endX and back
float sunY = horizonY + amplitydeY * vertical;         // Up and down around horizonY
David Gouveia
sumber
+1 untuk luar biasa, satu-satunya penyesalan saya adalah saya tidak dapat menandai dua jawaban!
Ross
Tidak masalah, saya tetap menggunakan formula dasar yang sama dengan Jimmy. :)
David Gouveia