2013-02-18 54 views
16

मेरा लक्ष्य एक मानक UIKit व्यू ओवरले करना है (फिलहाल, मैं सिर्फ UILabel बना रहा हूं लेकिन आखिरकार मेरे पास कस्टम सामग्री होगी) छवि ट्रैकिंग और वुफोरिया एआर एसडीके का उपयोग करके एक ज्ञात आकार पर। मेरे पास ऐसा कुछ है जो काम करता है, लेकिन "फज" शब्द के साथ जिसका मैं खाता नहीं ले सकता। मैं समझना चाहता हूं कि मेरी त्रुटि कहां है, इसलिए मैं या तो इस सुधार के अस्तित्व को औचित्य साबित कर सकता हूं या एक अलग एल्गोरिदम का उपयोग कर सकता हूं जिसे वैध माना जाता है।मुझे एक OpenRS मॉडलView को CATransform3D में कैसे अनुवादित करना चाहिए?

मेरी परियोजना Vuforia SDK में ImageTargets नमूना प्रोजेक्ट पर आधारित है। जहां उनके EAGLView ओपनजीएल टीपोट्स को प्रस्तुत करने के परिणामों के बारे में बताते हैं, मैंने इसे अपने ओबीजेसी ++ कक्षा TrackableObjectController पर कॉल के साथ बदल दिया है। प्रत्येक ट्रैक करने योग्य परिणाम के लिए, यह इस करता है:

- (void)augmentedRealityView:(EAGLView *)view foundTrackableResult:(const QCAR::TrackableResult *)trackableResult 
{ 
    // find out where the target is in Core Animation space 
    const QCAR::ImageTarget* imageTarget = static_cast<const QCAR::ImageTarget*>(&(trackableResult->getTrackable())); 
    TrackableObject *trackable = [self trackableForName: TrackableName(imageTarget)]; 
    trackable.tracked = YES; 
    QCAR::Vec2F size = imageTarget->getSize(); 
    QCAR::Matrix44F modelViewMatrix = QCAR::Tool::convertPose2GLMatrix(trackableResult->getPose()); 
    CGFloat ScreenScale = [[UIScreen mainScreen] scale]; 
    float xscl = qUtils.viewport.sizeX/ScreenScale/2; 
    float yscl = qUtils.viewport.sizeY/ScreenScale/2; 
    QCAR::Matrix44F projectedTransform = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; 
    QCAR::Matrix44F qcarTransform = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; 
    /* this sizeFudge constant is here to put the label in the correct place in this demo; I had thought that 
    * the problem was related to the units used (I defined the length of the target in mm in the Target Manager; 
    * the fact that I've got to multiply by ten here could be indicative of the app interpreting length in cm). 
    * That turned out not to be the case, when I changed the reported length of the target it stopped drawing the 
    * label at the correct size. Currently, therefore, the app and the target database are both using mm, but 
    * there's the following empirically-divised fudge factor to get the app to position the correctly-sized view 
    * in the correct position relative to the detected object. 
    */ 
    const double sizeFudge = 10.0; 
    ShaderUtils::translatePoseMatrix(sizeFudge * size.data[0]/2, sizeFudge * size.data[1]/2, 0, projectedTransform.data); 
    ShaderUtils::scalePoseMatrix(xscl, -yscl, 1.0, projectedTransform.data); // flip along y axis 
    ShaderUtils::multiplyMatrix(projectedTransform.data, qUtils.projectionMatrix.data, qcarTransform.data); 
    ShaderUtils::multiplyMatrix(qcarTransform.data, modelViewMatrix.data, qcarTransform.data); 
    CATransform3D transform = *((CATransform3D*)qcarTransform.data); // both are array[16] of float 
    transform = CATransform3DScale(transform,1,-1,0); //needs flipping to draw 
    trackable.transform = transform; 
} 

वहाँ फिर, अन्य कोड, मुख्य थ्रेड पर कहा जाता है, कि मेरे TrackableObject उदाहरणों पर ध्यान देती है ओवरले दृश्य की परत पर लागू होता है अभिकलन CATransform3D और के रूप में ओवरले दृश्य सेट EAGLView का एक सबव्यू।

मेरी समस्या यह है कि कोड नमूना में टिप्पणी इस sizeFudge कारक के साथ दी गई है। इस कारक के अलावा, मेरे पास कोड एक ही चीज़ है as this answer; लेकिन यह गलत जगह पर मेरा विचार डाल रहा है।

अनुभवजन्य रूप से मुझे लगता है कि अगर मैं sizeFudge शब्द शामिल नहीं करता हूं, तो मेरा ओवरले व्यू ट्रैक किए गए ऑब्जेक्ट के अभिविन्यास और अनुवाद को अच्छी तरह से ट्रैक करता है लेकिन आईपैड स्क्रीन पर दाएं और दाएं को ऑफसेट करता है-यह एक अनुवाद अंतर है, इसलिए यह समझ में आता है कि शब्द का उपयोग बदल रहा है। मैंने पहली बार सोचा था कि समस्या ऑब्जेक्ट का आकार थी जैसा कि वुफोरिया के लक्ष्य प्रबंधक में निर्दिष्ट है। यह मामला नहीं है; यदि मैं आकार को दस बार आकार बना देता हूं तो ओवरले व्यू एक ही, गलत जगह पर खींचा जाता है लेकिन दस गुना छोटा होता है (जैसा कि एआर उस ऑब्जेक्ट को मानता है जिस पर यह ट्रैकिंग है, मुझे लगता है)।

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

** कुछ और डेटा **

समस्या से मैंने सोचा था कि जब मैं इस सवाल का लिखा अधिक जटिल है। वास्तव में लेबल का स्थान आईपैड से ट्रैक की गई वस्तु पर निर्भर करता है, हालांकि रैखिक रूप से नहीं। एक स्पष्ट व्यवस्थित त्रुटि भी है।

आईपैड को लक्ष्य (ब्लैक स्क्वायर पर स्थित) से दूर एक निश्चित दूरी पर ले जाकर एक चार्ट बनाया गया है, और एक पेन के साथ चिह्नित किया गया जहां दृश्य का केंद्र दिखाई दिया। ऊपर वर्णित अंक और वर्ग के बाईं ओर ऊपर वर्णित अनुवाद फज है, नीचे दिए गए बिंदुओं और दाईं ओर sizeFudge==0 है। उम्मीद है कि यहां दिखाए गए दूरी और ऑफसेट के बीच का रिश्ता किसी के साथ 3 डी ग्राफिक्स के बारे में अधिक जानकारी के साथ किसी के रूप में संकेत करता है कि ट्रांसफॉर्म के साथ समस्या क्या है।

Chart as described in the previous paragraph.

+1

उनके ओपनजीएल ES व्यू के लिए उपयोग की जाने वाली समन्वय प्रणाली क्या है? आम तौर पर, ओपनजीएल ईएस दृश्य समन्वय के साथ स्थापित होते हैं जो यूआईकिट निर्देशांक की 0 से [चौड़ाई] या [ऊंचाई] की बजाय -1 से 1 तक जाते हैं। मैं इसके लिए खाते में अनुवाद की आवश्यकता देख सकता था। यदि वे एक समन्वय प्रणाली का उपयोग कर रहे थे जो -10 से 10 तक था, तो यह आपके अनुवाद फज कारक को समझा सकता है। –

+0

अंतर्दृष्टि @BradLarson के लिए धन्यवाद। मुझे यकीन नहीं है कि मुझे यह समन्वय प्रणाली कैसे मिलेगी; मैं वर्तमान में नहीं देख सकता कि परियोजना एक निराशा या अन्य कैमरा प्रक्षेपण कहां सेट करती है। मुझे यह भी महसूस होता है कि यह असंबंधित है, क्योंकि _view's_ समन्वय प्रणाली दृश्य के विमान में द्वि-आयामी होगी, है ना? –

+1

ऐसा लगता है कि इन लोगों के पास आपके लिए जवाब हो सकता है या कम से कम कुछ सहायक पॉइंटर्स: http://stackoverflow.com/questions/6045502/how-to-get-catransform3d-from-projection-and-modelview-matricesModelView-matrices – cb88

उत्तर

1

यह पहली जगह में अपने विचारों की स्थापना के साथ क्या करना शायद है। आईपैड पर आईफोन स्क्रीन-अनुपात का उपयोग करने जैसी चौड़ाई और ऊंचाई गलत तरीके से या किसी अन्य संभावित गलत मूल्यों के कारण एक अजीब ऑफसेट हो सकता है।

क्या आपका ऐप परिदृश्य है? यदि ऐसा है तो इसे पोर्ट्रेट में जाएं।मैंने अतीत में देखा है कि ऐप्स हमेशा पोर्ट्रेट स्क्रीन आयामों के साथ लॉन्च होने लगते हैं (मैंने हालांकि इसकी पुष्टि नहीं की है) ताकि यदि स्क्रीन के सामने आपका दृश्य सेटअप होता है तो आपके आस-पास 'सही रास्ता' मिल जाएगा।

आप यह भी काम करने की कोशिश कर सकते हैं कि यह कितना बंद है। Size.data को हैक के रूप में गुणा करने के बजाय: एक और अनुवाद जोड़ें और संख्याओं को सही होने तक ट्विक करें। ये संख्या आपको क्या हो रहा है में कुछ बेहतर अंतर्दृष्टि दे सकती है। * 10 शायद सिर्फ शुद्ध झुकाव है और इसका मतलब कुछ भी नहीं है।

+0

यह नीचे जाने के लिए एक आशाजनक मार्ग की तरह लगता है, धन्यवाद। मैंने चित्र/परिदृश्य अभिविन्यास के कारण ऐप में अन्य समस्याएं देखी हैं, इसलिए मैं इसे देख लूंगा। –

+0

ऐसा प्रतीत होता है कि अलग-अलग उन्मुखताओं में निश्चित रूप से एक _different_ off-by-error है, जो एक सुराग हो सकता है। यह पूरी बात नहीं है, क्योंकि पोर्ट्रेट अभिविन्यास में सबकुछ गलत (एक अलग) गलत स्थान पर दिखाई देता है। मैंने पाया है कि राशि बंद लक्ष्य से दूरी के साथ बदलती है, इसलिए यह मैट्रिक्स ट्रांसफॉर्म के साथ एक सामान्य समस्या की तरह दिखता है। –