2009-03-11 10 views
8

ठीक है, यह ऐसा कुछ है जो एक साधारण मैट्रिक्स प्रश्न होना चाहिए, लेकिन मैट्रिस की मेरी समझ कुछ हद तक सीमित है। यहां परिदृश्य है: मेरे पास 1 पीएक्स स्प्राइट द्वारा 1 पीएक्स है कि मैं कुछ मात्रा x और y (प्रत्येक तरफ अलग-अलग मात्रा) द्वारा स्केल करना चाहता हूं, और फिर मैं उस कोण को उस कोण से घूमना चाहता हूं, और फिर मैं सक्षम होना चाहता हूं ठीक से पूरी चीज को स्थिति दें (ऊपर बाएं या केंद्र से, मुझे कोई फर्क नहीं पड़ता)।सी # में एक बार में एक मैट्रिक्स को घुमाएं, स्केल करें और अनुवाद कैसे करें?

अब तक मेरी कोड थोड़ा करीब है, लेकिन यह कोण मैं में पारित के आधार पर कुछ यादृच्छिक राशि से बंद हो जाता है

मुझे लगता है कि है कि यह यह करना होगा:।

 Point center = new Point(50, 50); 
     float width = 60; 
     float height = 100; 
     float angle = 0.5; 
     Vector3 axis = new Vector3(center.X, center.Y, 0); 
     axis.Normalize(); 
     Matrix m = Matrix.Scaling(width, height, 0) * 
      Matrix.RotationAxis(axis, angle) * 
      Matrix.Translation(center.X, center.Y, 0); 

लेकिन यह घूर्णन रेखा के रास्ते के पैमाने को कम करने के लिए जाता है, भले ही मुझे लगता है कि यह सही तरह की स्थिति है।

मैं भी इस की कोशिश की है:

Matrix m = Matrix.Transformation2D(new Vector2(center.X, center.Y), 0f, 
     new Vector2(width, height), new Vector2(center.X, center.Y), 
     angle, Vector2.Zero); 

लाइन बिल्कुल सही लग रहा है, सही सही आकार और आकृति के साथ है, लेकिन मैं इसे सही ढंग से सब पर स्थिति नहीं कर सकते। यदि मैं ऊपर दिए गए कॉल के अंत में अनुवाद वेक्टर का उपयोग करता हूं, या यदि मैं Sprite.Draw का उपयोग कर स्थिति सेट करता हूं, तो न तो सही काम करता है।

यह सब स्लिम डीएक्स में है। मैं क्या गलत कर रहा हूं?

उत्तर

12

मैं सिर्फ मैट्रिक्स परिवर्तन सीखने के दर्द से गुजर गया, लेकिन एक्सएनए का उपयोग कर रहा था।

मैं thesearticlestobevery समझ क्या होता है में उपयोगी पाया। विधि कॉल XNA में बहुत समान हैं और इसके पीछे सिद्धांत आपको स्लिम डीएक्स के साथ भी लागू होना चाहिए।

अपने कोड पर चमक से, मुझे लगता है कि आपको शुरुआत में, शुरुआत में अनुवाद करना चाहिए, और फिर अंत में फिर से अंतिम स्थिति में अनुवाद करना चाहिए, हालांकि मैं अभी भी इस पर एक नौसिखिया हूं भी।

आदेश मैं में ऐसा होता है:

  • अनुवाद मूल के
  • स्केल
  • घुमाएँ
  • अनुवाद इच्छित स्थान पर मूल करने के लिए अनुवाद करने के लिए

कारण पहला यह है कि घूर्णन मूल से आधारित हैं। इसलिए किसी निश्चित बिंदु के बारे में कुछ घुमाने के लिए, घूर्णन से पहले उस बिंदु को उस बिंदु पर रखें।

+1

हम्म ... यह बहुत करीब लगता है। मूल, स्केल और घुमावदार चरणों का अनुवाद बहुत अच्छा काम करता है, लेकिन फिर जब मैं वांछित स्थान पर अनुवाद करने का प्रयास करता हूं तो यह वास्तव में अजीब तरीके से कार्य करता है - मैं एक्स कूडिनेट बदलता हूं, और यह एक्स और वाई दोनों में चलता है। मैं सोच रहा हूं कि यह घुमावदार स्थान में अनुवाद कर रहा है ... – x4000

+0

एक और चीज जो अभी तक मुझे स्पष्ट नहीं है, मूल में अनुवाद कैसे करें। मेरे पास दो बिंदु हैं, साथ ही एक तिहाई जो उनके केंद्र में है। मैं केंद्र को मूल में अनुवाद कर रहा हूं, लेकिन क्या मुझे अलग तरीके से अनुवाद करना चाहिए? – x4000

+1

जहां आप चाहते हैं वहां वापस अनुवाद करने की बजाय, क्या आप केवल उस स्थान की स्थिति बदल सकते हैं जहां आप आकर्षित करते हैं? –

1

आपको क्या करना है एक समय में प्रत्येक परिवर्तन एक कदम है। स्केलिंग पहले इसे आकर्षित करें। क्या आप इसे उम्मीद करते हैं। फिर घुमाव में फेंक दें, और फिर अनुवाद करें। इससे गलत धारणाओं को उजागर करने में मदद मिलेगी।

आप निर्देशांक कहां हैं, यह जानने में सहायता के लिए आप अस्थायी रेखाओं में भी आकर्षित कर सकते हैं। उदाहरण के लिए यदि आप अपना खींचने और घूर्णन करते हैं और उम्मीद करते हैं कि आपका अंतिम बिंदु 0,0 पर हो। 0,0 पर एक एंडपॉइंट के साथ एक और लाइन खींचना यह देखने के लिए कि क्या वास्तव में मामला है, एक डबल चेक के रूप में कार्य करेगा।

आपकी विशिष्ट समस्या के लिए समस्या घूर्णन के साथ हो सकती है। जब आप स्केल कर चुके हैं और लाइन घुमाने के बाद केंद्र से बाहर है तो आप अनुवाद करते समय समस्याएं पैदा कर सकते हैं।

सामान्य समाधान लाइन को मूल में वापस ले जाना है, जो किसी भी ऑपरेशन को आकार या अभिविन्यास को बदलने में शामिल है। इसके बाद क्योंकि आप एक ज्ञात अच्छे स्थान पर हैं, आप अपने अंतिम गंतव्य में अनुवाद कर सकते हैं।

टिप्पणियाँ

प्रतिक्रिया तो अनुवाद एक मुद्दा है और आप समन्वय प्रणाली बदलने कर रहे हैं तो आप एक रूपांतरण समारोह पुरानी व्यवस्था और नए के बीच परिवर्तित करने के लिए लिखने के लिए की आवश्यकता होगी।

उदाहरण के लिए यदि आप 45 डिग्री घूर्णन कर रहे हैं। घूर्णन से पहले आप 1 इंच तक बढ़ने के लिए 0,1 द्वारा अनुवाद कर सकते हैं। घूर्णन के बाद आपको मूल समन्वय प्रणाली के सापेक्ष 1 इंच आगे बढ़ने के लिए मोटे तौर पर -70707, .070707 का अनुवाद करना होगा।

+0

मैंने पहले से ही प्रत्येक भाग को अलग करने की कोशिश की है - मुझे इसका उल्लेख करना चाहिए था। स्केलिंग और अनुवाद पूरी तरह से काम करते हैं। लेकिन जैसा कि आप कहते हैं, जब मैं रोटेशन जोड़ता हूं तो यह बंद हो जाता है। और हाँ मुझे संदर्भ बिंदुओं पर आइकन रखना है ताकि मैं देख सकूं कि मैं कितना करीब हूं। मैं अब ऑफसेटिंग का प्रयास करने जा रहा हूं। – x4000

+0

रोटेशन गड़बड़ हो जाता है क्योंकि यह मूल के बारे में घूमता है। –

+0

अब मैंने मूल पर वापस जाने की कोशिश की है और फिर जहां मैं चाहता हूं वहां वापस अनुवाद करने की कोशिश की है। यह करीब लगता है, लेकिन अनुवाद बंद है क्योंकि यह घुमावदार समन्वय अंतरिक्ष के अंदर अनुवाद कर रहा है, ऐसा लगता है। – x4000

1

क्या आप सही धुरी के चारों ओर घूम रहे हैं? मैं मैट्रिक्स सामान पर एक नौसिखिया हूं, लेकिन मुझे ऐसा लगता है कि चूंकि एक्स, वाई स्पेस में स्प्राइट मौजूद है, इसलिए रोटेशन अक्ष ज़ेड-एक्सिस - यानी (0,0,1) होना चाहिए।

+0

हम्म, यह एक अच्छा मुद्दा है, लेकिन जब मैं स्केलिंग करता हूं और यह करता है तो मेरा घूर्णन ठीक काम करता प्रतीत होता है - समस्या तब आती है जब मैं इसे भी स्थिति देने की कोशिश करता हूं। मैं इन तीनों में से कोई भी काम कर सकता हूं, लेकिन कुछ ऐसा है जो मैं इसे एक साथ रखकर गलत कर रहा हूं! – x4000

+0

हे, जेड अक्ष के साथ अच्छी पकड़ - ऊपर मेरे पहले उदाहरण के साथ, यह काफी प्रासंगिक है। – x4000

3

ठीक है, यह अब काम कर रहा है। यहाँ इस के लिए मेरे कार्य कोड है, में और मामले में किसी को इसकी आवश्यकता है:

Point sourceLoc = new Point (50, 50); 
    float length = 60; 
    float thickness = 2; 
    float angle = 0.5; 
    Matrix m = Matrix.Scaling(length, thickness, 0) * 
      Matrix.RotationZ(angle) * 
      Matrix.Translation(sourceLoc.X, sourceLoc.Y, 0); 
    sprite.Transform = m; 

    sprite.Draw(this.tx, Vector3.Zero, Vector3.Zero, Color.Red); 

यह एक मोटाई अपनी चुनी मोटाई के बराबर के साथ, अपने चुने हुए लंबाई का कोणीय रेखा खींचना होगा (आपका बनावट मानते हुए एक 1x1 पिक्सेल सफेद छवि है)। स्रोत स्थान वह स्थान है जहां से आप जो भी कोण निर्दिष्ट करेंगे (रेडियंस में) के साथ लाइन निकल जाएगी। तो यदि आप शून्य से शुरू करते हैं और जब तक आप 2 पीआई हिट नहीं करते हैं, तब तक 0.1 से कुछ बढ़ते हैं, और फिर 0 पर रीसेट हो जाते हैं, तो आपके पास एक लाइन होगी जो घड़ी के हाथ या रडार स्वीप जैसे केंद्र के चारों ओर घूमती है। यही वह है जो मैं खोज रहा था - योगदान देने वाले सभी के लिए धन्यवाद!

संबंधित मुद्दे