2012-04-04 37 views
16
को आंदोलन

किसी को भी मुझे कुछ सलाह या सुझाव दे सकते हैं2 डी से 3 डी

मैं कितना एक तस्वीर में एक वस्तु एक स्थान से दूसरे में स्थानांतरित किया गया है खोजने की जरूरत है (अच्छी तरह से वास्तव में मैं कितना कैमरा है की गणना करने की जरूरत है 2 छवियों के बीच स्थानांतरित हो गया, लेकिन वस्तु स्थिर रहेगी और बस अपने वाई-अक्ष पर घुमाया जाएगा, मुझे लगता है कि छवि को स्थानांतरित करना आसान होगा)। इस उदाहरण के रूप में काफी कुछ है लेकिन काफी जटिल नहीं है। enter image description here

तो मैं उदाहरण यहाँ enter image description here अनुसार घन पर एक rubiks घन की पहली तस्वीर लेने के लिए और 4 अंक का चयन छवि एक Texture2D और नीले हलकों के सामने चेहरे के 4 अंक का प्रतिनिधित्व करता है उपयोगकर्ता द्वारा चुने गए क्यूब। ये 4 अंक सूची में संग्रहीत हैं और अगली छवि लोड की गई है जो इस enter image description here जैसा दिखता है फिर उपयोगकर्ता को पिछले (सफेद चेहरे) के समान चेहरे के 4 अंक चुनना होगा। फिर इन 4 अंक एक नई सूची में संग्रहीत हैं।

तो अब मैं दो सूचियों है और मैं जैसा कि यहाँ दिखाया enter image description here

लेकिन अधिक महत्वपूर्ण बात यह छवि 2 करने के लिए छवि 1 से गणना करने के लिए कितना "पूरे सामने चेहरा" ले जाया गया है (घुमाएगी/पैमाने/अनुवाद) की जरूरत है , मुझे 3 डी में इस आंदोलन की गणना करने की आवश्यकता है! तो पहली छवि के लिए मुझे लगता है कि z-घटक = 0. उदाहरण के लिए मैं छवि 1 के शीर्ष बाएं कोने मानता हूं = उदा। (10, 10, 0)।

क्या कोई तरीका है कि मैं "मान ले सकता हूं" कि अगर छवि 2 का चेहरा घूर्णन/स्केल/अनुवादित किया गया है तो इसे 3 डी स्पेस में स्थानांतरित किया जा सकता है? तो यदि छवि 2 का ऊपरी बाएं कोने छवि 1 (छवि शुरू करना) के दाएं कोने के दाईं ओर है, तो कैमरे को दाईं ओर ले जाना चाहिए था। और यह अंक के ऊपर या नीचे के लिए जाना होगा? घूमने के लिए, क्या मैं छवि 1 के अंक और छवि 2 के बिंदुओं के बीच कोणों के बीच कोणों की गणना कर सकता हूं और किसी भी तरह से गणना करता हूं कि कैमरा कितना घूर्णन कर रहा है?

मेरे कोड के लिए मैं ऐसा कुछ सोच रहा था?

// Image 1 coordinates for the front face 
// Assume z = 0 
cube1 = new List<Vector3>(); 
cube.Add(new Vector3(10, 10, 0)); 
cube.Add(new Vector3(20, 10, 0)); 
cube.Add(new Vector3(10, 20, 0)); 
cube.Add(new Vector3(20, 20, 0)); 

// Get image 2 coordinates 
cube2 = new List<Vector3>(); 
cube.Add(new Vector3(newX, newY, ?)); // Keep Z = 0? 
cube.Add(new Vector3(newX, newY, ?)); 
cube.Add(new Vector3(newX, newY, ?)); 
cube.Add(new Vector3(newX, newY, ?)); 

आंदोलन के लिए बाएं या दाएं सिर्फ गणना कितना प्रत्येक बिंदु

//Translation 
Matrix translating = Matrix.CreateTranslation(new Vector3(amountMovedX, amountMovedY, 0)); 
List<Vector3> imageAfterTranslating = transformListOfVertices(imageAfterScaling, translating); 

और तिरछा के लिए (आईएम थोड़ा अटक) ले जाया गया है ....

// Rotation 
Matrix rotation = Matrix.CreateFromAxisAngle( 
Vector3.Normalize(new Vector3(?, ?, ?)), MathHelper.ToRadians(?)); // Not sure here 
List<Vector3> imageAfterRotation = transformListOfVertices(cube, rotation); 
+1

क्या अंक किसी भी नियम का पालन करना है? जैसे वे सभी coplaner होना चाहिए? – MerickOWA

+0

हाँ आवेदन के उद्देश्य के लिए हाँ सभी बिंदु coplanar माना जाएगा। तो उपयोगकर्ता केवल घन का एक चेहरा चुन सकता है और उन सभी बिंदुओं को एक विमान पर माना जाएगा – heyred

उत्तर

2

दुनिया मैट्रिक्स * मैट्रिक्स देखें (कैमरा का) * प्रक्षेपण (कैमरा का) = मैट्रिक्स

मानते हैं कि cube1 = प्रारंभिक स्थिति।
क्या दौरान प्रस्तुत करना होता है: cube1 * transformMatrix = उत्पादन मैट्रिक्स

तो मैं समझता हूँ कि आप को सही: अपने इनपुट उपयोगकर्ता कैमरा मैट्रिक्स (देखें) केवल,
(और कैमरे = दृश्य * प्रक्षेपण) बदलने की अनुमति देता और कैमरे को अद्यतन करने के बाद आप घन के नए परिवर्तन को जानना चाहते हैं।

तो तुम उलट आपरेशन करने की जरूरत है:

outputmatrix/transformMatrix = cube1 मैट्रिक्स (नया एक आप की आवश्यकता होगी)

नई cube1 परिणाम मैट्रिक्स से आप कोण, आंदोलन निकाल सकते हैं और आदि ..

तो, आपकी समस्या "क्या" लागू करने के लिए अधिक संबंधित है - लागू करने के तरीके के बारे में नहीं।
(जैसा कि मैं आपको आवश्यक आदेशों और कोड के साथ familir देखता हूं)

मुझे उम्मीद है कि इससे मदद मिलती है।

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