17

UILabel私の目標は、イメージ トラッキングと Vuforia AR SDK を使用して、検出された形状に標準の UIKit ビュー (今のところ、作成しているだけですが、最終的にはカスタム コンテンツを作成する予定です) をオーバーレイすることです。機能するものがありますが、説明できない「ファッジ」用語があります。エラーがどこにあるかを理解したいので、この修正の存在を正当化するか、有効であることがわかっている別のアルゴリズムを使用できます。

私のプロジェクトは、Vuforia SDK の ImageTargets サンプル プロジェクトに基づいています。OpenGL ティーポットをレンダリングするために結果を反復処理する場合、EAGLViewこれを 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要因にあります。この要因とは別に、私が持っているコードはこの答えと同じことをします; しかし、それは私の見方を間違った場所に置いています。

経験的に、この用語を含めない場合sizeFudge、オーバーレイ ビューは追跡対象オブジェクトの向きと平行移動を適切に追跡しますが、iPad 画面では右下にオフセットされます。これは平行移動の違いであるため、に使用される用語の変更。Vuforia の Target Manager で指定されているオブジェクトのサイズに問題があると最初に考えました。これは事実ではないことが判明しました。サイズの 10 倍のターゲットを作成すると、オーバーレイ ビューは同じ、間違った場所に描画されますが、10 倍小さくなります (AR は追跡しているオブジェクトが遠くにあると想定しているため)。

ここでポーズを変換するだけで、私がなりたい場所に移動できますが、これは私には意味をなさないので不十分です. Vuforia が提供する OpenGL 座標から、マジック ナンバーに依存しない CATransform3D に変換する正しい方法を誰か説明してもらえますか?

**いくつかの追加データ**

この質問を書いたときに思ったよりも問題は複雑です。ラベルの位置は、線形ではありませんが、実際には iPad から追跡対象のオブジェクトまでの距離に依存しているようです。明らかな系統誤差もあります。

これは、iPad をターゲット (黒い四角の上にある) から一定の距離に移動し、ビューの中心が表示された場所にペンで印を付けることによって作成されたチャートです。正方形の上と左の点には、上記のように変換ファッジがあり、下と右の点には がありsizeFudge==0ます。ここに示されている距離とオフセットの関係が、私よりも 3D グラフィックスの知識が豊富な人に、変換の問題が何であるかの手がかりになることを願っています。

前の段落で説明したチャート。

4

1 に答える 1

1

それはおそらく、そもそもビューの設定に関係しています。奇妙なオフセットは、幅と高さが間違っているか、iPadでiPhoneの画面比を使用するなどのその他の誤った値が原因である可能性があります。

あなたのアプリは風景ですか?もしそうなら、それをポートレートで試してみてください。過去に、アプリは常に縦向きの画面サイズで起動するように見えることに気づきました(ただし、これは確認していません)。そのため、画面が「正しい方法」になる前にビューの設定が行われると、不一致が発生します。

また、それがどれだけずれているかを正確に計算してみることもできます。size.dataをハックとして乗算する代わりに、別の翻訳を追加し、適切になるまで数値を微調整します。これらの数値は、何が起こっているかについてのより良い洞察を与えるかもしれません。* 10はおそらく純粋なまぐれであり、何の意味もありません。

于 2013-03-18T10:40:52.317 に答える