मेरा लक्ष्य एक मानक 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 डी ग्राफिक्स के बारे में अधिक जानकारी के साथ किसी के रूप में संकेत करता है कि ट्रांसफॉर्म के साथ समस्या क्या है।
उनके ओपनजीएल ES व्यू के लिए उपयोग की जाने वाली समन्वय प्रणाली क्या है? आम तौर पर, ओपनजीएल ईएस दृश्य समन्वय के साथ स्थापित होते हैं जो यूआईकिट निर्देशांक की 0 से [चौड़ाई] या [ऊंचाई] की बजाय -1 से 1 तक जाते हैं। मैं इसके लिए खाते में अनुवाद की आवश्यकता देख सकता था। यदि वे एक समन्वय प्रणाली का उपयोग कर रहे थे जो -10 से 10 तक था, तो यह आपके अनुवाद फज कारक को समझा सकता है। –
अंतर्दृष्टि @BradLarson के लिए धन्यवाद। मुझे यकीन नहीं है कि मुझे यह समन्वय प्रणाली कैसे मिलेगी; मैं वर्तमान में नहीं देख सकता कि परियोजना एक निराशा या अन्य कैमरा प्रक्षेपण कहां सेट करती है। मुझे यह भी महसूस होता है कि यह असंबंधित है, क्योंकि _view's_ समन्वय प्रणाली दृश्य के विमान में द्वि-आयामी होगी, है ना? –
ऐसा लगता है कि इन लोगों के पास आपके लिए जवाब हो सकता है या कम से कम कुछ सहायक पॉइंटर्स: http://stackoverflow.com/questions/6045502/how-to-get-catransform3d-from-projection-and-modelview-matricesModelView-matrices – cb88