2013-02-18 6 views
16

私の目標は、標準的なUIKitビューをオーバーレイすることです(現時点では、UILabelを作成していますが、最終的にカスタムコンテンツがあります)。イメージトラッキングとVuforia AR SDKを使用して検出されたシェイプをオーバーします。私にはうまくいくものがありますが、説明できない「ファッジ」という言葉があります。私は自分のエラーがどこにあるのか理解したいので、この修正の存在を正当化するか、有効であることが知られている別のアルゴリズムを使用することができます。OpenGLES modelViewをCATransform3Dにどのように変換すればよいですか?

私のプロジェクトは、Vuforia SDKのImageTargetsサンプルプロジェクトに基づいています。彼らのEAGLViewがOpenGLティーポットをレンダリングするために結果を反復するところでは、これをObjC++クラス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という用語を使用していない場合、私のオーバーレイビューは、追跡されたオブジェクトの方向と平行移動をうまく追跡しますが、iPadの画面上で右下がりにオフセットされています。だから、それに使われる言葉を変えることは意味があります。私はまず、VuforiaのTarget Managerで指定されたオブジェクトのサイズが問題であると考えました。これは事実ではないことが分かります。サイズの10倍のターゲットを作成した場合、オーバレイビューは同じ、間違った場所に描画されますが、10倍小さくなります(ARは、トラッキングしているオブジェクトがそれより遠いと仮定します)。

私はここに私がなりたいポーズをここに翻訳しているだけですが、これは私には意味をなさないので不満足です。誰でも魔法の数に依存しないCATransform3DにVuforiaが提供するOpenGL座標から変換する正しい方法を説明してください。

** いくつかのより多くのデータ **

問題は、私はこの質問を書いたとき、私は思ったよりも複雑です。ラベルの位置は実際には、直線的ではないが、iPadから追跡対象物までの距離に依存するように見える。明らかな系統誤差もある。

iPadをターゲットから一定の距離(黒い四角の上にある)に移動し、ビューの中央が表示されているペンでマークして作成したグラフです。正方形の上の点と左の点には、上記の翻訳パッジがあり、下の点と右の点はsizeFudge==0です。うまくいけば、距離とオフセットとの関係は、3Dグラフィックスの知識を私よりももっと知っている人に、変換の問題点を教えてくれるはずです。

Chart as described in the previous paragraph.

+1

OpenGL ESビューで使用される座標系は何ですか?通常、OpenGL ESシーンは、0〜[幅]または[高さ]のUIKit座標ではなく、-1から1の座標で設定されます。それを説明するために翻訳が必要なのが分かりました。彼らが-10から10の範囲の座標系を使用していた場合、それはあなたの翻訳ファッジファクターを説明するかもしれません。 –

+0

Insight @ BradLarsonに感謝します。私はこの座標系がどうやって見つけられるのか分かりません。私は現在、プロジェクトが錐台または他のカメラ投影を設定する場所を見ることができません。 _view's_座標系がビューの平面内で2次元であるため、これは無関係であると感じるでしょうか? –

+1

これらの人は、あなたや少なくともいくつかの役に立つポインタのように見えます:http://stackoverflow.com/questions/6045502/how-to-get-catransform3d-from-projection-and-modelview-matricesModelView-matrices – cb88

答えて

1

それは最初の場所であなたの意見のセットアップを行うには、おそらくです。幅と高さが間違っているか、iPad上でiPhoneのスクリーンレシオを使用するなどの間違った値が原因で、奇妙なオフセットが発生する可能性があります。

アプリの風景はありますか?もしそうなら、それを肖像画に入れてください。私は過去にアプリがいつも肖像画のディメンションで起動するように見えた(私はこれを確認していない)ので、あなたのビューの設定が画面の前に起こると、あなたの周りの「正しい方法」が不一致になることに気づいた。

また、どのくらい離れているかを正確に調べることもできます。 size.dataにハックとして乗算する代わりに、別の翻訳を追加し、数字が正しいまで調整します。これらの数字は、何が起こっているかについてより良い洞察を与えるかもしれません。 * 10はたぶん純粋なウサギです。何も意味がありません。

+0

これは、有望なルートのように聞こえる。私はポートレート/風景の向きのためにアプリで他の問題を見てきましたので、私はそれを見ていきます。 –

+0

異なる方向には別の_ずれているエラーがあることがわかります。これはヒントになるかもしれません。それは、全てが縦向きの(間違った)別の場所にも現れるので、すべてではありません。私は量が目標からの距離に応じて変化することを発見したので、マトリックス変換の一般的な問題のように見えます。 –

関連する問題