2012-10-22 11 views
7

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

t = IDENTITY; 
t = translate(t, -50, -50); 
t = rotate(t, theta); 
t = translate(t, 50, 50); 

,: मैं निम्नलिखित कोड (मान मेरी वस्तु 50,50 पर एक केंद्र के साथ 100x100 है) है।

मैं एक त्वरित jsfiddle को क्रियान्वित किया है मेरी समस्या प्रदर्शित करने के लिए: http://jsfiddle.net/9M3uy/67/

JSFiddle में, लाल घुमाया जहां रोटेशन (CSS3 के अंतर्निहित में परिणत-मूल के सौजन्य से) समाप्त हो गया हो जाना चाहिए था वर्ग है, और नीला घुमावदार वर्ग है जहां मेरी गणना समाप्त होती है (हरा मूल गैर-घुमावदार वर्ग होता)।

कोई विचार? क्या मैं समझ नहीं पा रहा हूं कि अनुवाद कैसे करें, घुमाएं, मैकेनिक कामों का अनुवाद करें या क्या मैं कुछ गलत कर रहा हूं?

+0

मैं हरे रंग को नहीं देख सकता ... –

+0

आपको क्रोम या सफारी का उपयोग करना होगा। मैंने जेएसफ़िल्ड को सभी ब्राउज़रों के लिए आवश्यक सीएसएस शामिल करने के लिए अपडेट किया। – syazdani

+0

हां! लेकिन ऐसा लगता है कि आपको जवाब मिल गया! मैं बहुत देर से आया –

उत्तर

2

अपने कोड में दो समस्याएं हैं:

  1. मैट्रिक्स गुणा विपरीत क्रम से आप शायद का इरादा किया जाता है। ऐसा लगता है कि rotate(t, theta) एक मैट्रिक्स को वापस करने के लिए t लागू होता है जो एक रोटेशन के बाद लागू होता है, लेकिन वास्तव में यह विपरीत है - घूर्णन t से पहले लागू किया जाएगा। rotate और translate में आपको matrixMultiply पर कॉल में पैरामीटर ऑर्डर को रिवर्स करने की आवश्यकता है।

  2. सीएसएस matrix फ़ंक्शन के पैरामीटर गलत क्रम में हैं। यह a11, a21, a12, a22, a13, a23 होना चाहिए। आप जो गुजर रहे हैं वह a11, a12, a21, a22, a13, a23 है।

यहां fixed version है।

+0

यहां इंटरजे के निश्चित संस्करण का एक अनुकूलित संस्करण है। http://jsfiddle.net/orwellophile/hvvo9oh8/ – Orwellophile

0

2 डी-केस के लिए पहले "मानक" 3x3 मैट्रिक्स गुणा को लागू करने का प्रयास करें और केवल तत्वों को ऑप्टिमाइज़ करने का प्रयास करने के बाद, जो शून्य से गुणा करने के परिणामस्वरूप। यह देखने में थोड़ा मुश्किल है कि सूत्र सही हैं, जब अनुक्रमण योजना बहुत अपरंपरागत है।

रोटेशन मैट्रिक्स = [सी -0 0; एस सी 0; 0 0 1]; अनुवाद मैट्रिक्स = [1 0 एक्स; 0 1 वाई; 0 0 1];

मुझे लगता है कि सीएसएस-ट्रांसलेशनेशन फ़ंक्शन भी 3x3 परिणाम मानता है।

दोनों गुणा और रोटेशन संबंधित मैट्रिक्स द्वारा वैक्टर (एक्स, वाई, 1) गुणा करके किया जाता है।

संपादित करें: एक सा नगण्य के बाद, ऐसा लगता है कि या तो मैट्रिक्स मीटर अनुवाद किया जाना चाहिए, या ऑपरेटर के रूप में return MatMul([rot matrix],m) and return MatMul([trans matrix],m)

EDIT2 में परिभाषित किया जा सकता है: अब मैं कुछ अजीब देख सकते हैं: द्वारा केवल अनुवाद + -50, + -50 और ~ 10 डिग्री से घूर्णन, कोने लाल वर्ग के बीच में नहीं रहता है। लेकिन वैसे भी सीएसएस मैट्रिक्स के प्रारूप को समझ में नहीं आता है। क्षमा करें ...

+0

मैंने पूर्ण 3x3 गुणा होने के लिए उदाहरण अपडेट किया: http://jsfiddle.net/9M3uy/5/। सीएसएस ट्रांसफॉर्म (मुझे लगता है कि आपका मतलब क्या है), फ़ॉर्म में मैट्रिक्स लेता है: 'मैट्रिक्स (ए, बी, सी, डी, टीएक्स, टाई)' (यह तीसरी पंक्ति छोड़ देता है)। – syazdani

+1

आपको क्रोम या सफारी (या कोई अन्य वेबकिट आधारित ब्राउज़र) का उपयोग करना होगा। डिफ़ॉल्ट रूप से, सीएसएस में परिवर्तन की उत्पत्ति केंद्र में होती है, और यदि आपने सीएसएस में कुछ भी नहीं बदला है, तो मेरे कोड द्वारा गणना की गई मैट्रिक्स काम करने लगती है, लेकिन केवल इसलिए कि ब्राउज़र आपके लिए रोटेशन को केंद्रित कर रहा है। यदि आप अद्यतन पहेली को देखते हैं जहां मैंने सभी ब्राउज़रों के लिए मूल को 0,0 पर सेट किया है, तो आप देखेंगे कि आपका सुझाया गया परिवर्तन काम नहीं करता है। – syazdani

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