सूर्य की गति के लिए कार्य?


9

इसलिए, क्षितिज पर एक सूर्य स्प्राइट सेट दिया गया (x = 0, y = worldheight / 2) मैं सूर्य उदय करने के लिए एक फ़ंक्शन को विकसित करने की कोशिश कर रहा हूं, फिर गिरना।

ऐसा करने का सबसे अच्छा तरीका पाप कार्य होगा, लेकिन मुझे नहीं पता कि इसका उपयोग कैसे करना है।

यदि y = sin (x) का उपयोग कर रहे हैं, तो x को x के लिए निरंतर वेग होने पर, पूर्ण वक्र के लिए 0 और pi के बीच की सीमा होती है।

कोई विचार या सुझाव?

संपादित करें: धन्यवाद दोस्तों!

सूरज काम कर रहा है!

जवाबों:


7

0 से पीआई मुद्दे के संबंध में, सामान्य तौर पर आपको जो करना है, वह एक गुणक द्वारा एक्स को मापना है। उदाहरण:

y = sin(x * pi / worldWidth)

http://www.wolframalpha.com/input/?i=Plot%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% 7 दिन% 5D

X के लिए Y और cos के लिए पाप का यह संयोजन एक दीर्घवृत्त का पता लगाएगा।


धन्यवाद, यह बहुत बढ़िया है। मैं बहुत गणित-केंद्रित नहीं हूं। मैथ में मेरे कौशल बहुत अधिक अल्पविकसित पथरी हैं।
रॉस

12

जैसे जिमी ने कहा कि एक दीर्घवृत्त शायद इस गति के लिए एक बेहतर फिट है। यहाँ कुछ विचार हैं कि वास्तव में इसे कैसे दिलचस्पी रखने वालों के लिए थोड़ा और विस्तार के साथ लागू किया जाए।

समय ले रहा है

शुरुआत के लिए, आपको खेल की दुनिया में समय का ध्यान रखने के लिए एक चर की आवश्यकता होती है। आप इसे किसी भी तरह से लागू कर सकते हैं, लेकिन यहाँ एक उदाहरण है। मैं एक वैरिएबल का उपयोग करता हूं जिसे hours0 से 24 तक भिन्न होता है (हालांकि जब यह 24 तक पहुंचता है तो यह 0 से वापस हो जाता है)।

हालांकि वास्तविक जीवन के विपरीत, मैं सिर्फ इस बात पर विचार करूंगा कि दिन 0 घंटे से शुरू होता है, और रात 12 घंटे से शुरू होती है। इससे कुछ गणनाएं आसान हो जाएंगी।

मैं उस दर को भी परिभाषित करूंगा जिसमें वास्तविक समय के संबंध में खेल का समय बदलता है। इस उदाहरण में, हर दो मिनट का वास्तविक समय खेल में एक घंटे के अनुरूप होगा।

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
}

विन्यास

अब हमारे सूरज की गति को निर्धारित करने से पहले हमें इसके कुछ मापदंडों को निर्दिष्ट करने की आवश्यकता है। विशेष रूप से, यह किस एक्स मान को क्षितिज से बढ़ाता है, और किस एक्स मूल्य पर यह क्षितिज में गिरता है। इसके अलावा, वाई जो क्षितिज से मेल खाती है, और वह उस रेखा से ऊपर उठने वाला है।

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

सूर्य के निर्देशांक की गणना

अब दिन के एक निश्चित समय के लिए हमारे सूर्य की स्थिति की गणना करने का समय है। मैं जिमी द्वारा उपयोग किए गए समान पैरामीट्रिक फ़ंक्शन का उपयोग करूंगा, लेकिन डोमेन से [0..2PI] के बजाय (दिन के प्रकोप से सूर्य को उसकी मूल स्थिति में वापस लाने के लिए):

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

y = पाप (t)

यह एक अच्छा कार्य है क्योंकि एक्स मान 0 से 1 तक भिन्न होता है और फिर 0 से फिर से होता है (जो हम अपने सूरज की शुरुआत और अंत एक्स मानों के लिए मैपिंग करेंगे) और वाई मान 0 से शुरू होता है और 1 और पीछे चलता है 0 पर फिर से (जो हमारा दिन का हिस्सा होगा) और फिर मूल स्थिति पर वापस आने से पहले नकारात्मक पक्ष पर सटीक बात को दोहराता है (जो कि हमारी रात होगी हालांकि सूरज इस बिंदु पर नहीं खींचा जाएगा)।

पहला चरण हमारे फ़ंक्शन की सीमा [[०.२.२४] तक घंटों को स्केल कर रहा है:

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 अद्भुतता के लिए, मेरा एकमात्र खेद यह है कि मैं दो उत्तरों को चिह्नित नहीं कर सकता!
रॉस

कोई बात नहीं, मैंने वैसे ही आधार फ़ार्मुलों का उपयोग किया जैसे जिमी। :)
डेविड गौवेया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.