私の目標は、標準的な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グラフィックスの知識を私よりももっと知っている人に、変換の問題点を教えてくれるはずです。
OpenGL ESビューで使用される座標系は何ですか?通常、OpenGL ESシーンは、0〜[幅]または[高さ]のUIKit座標ではなく、-1から1の座標で設定されます。それを説明するために翻訳が必要なのが分かりました。彼らが-10から10の範囲の座標系を使用していた場合、それはあなたの翻訳ファッジファクターを説明するかもしれません。 –
Insight @ BradLarsonに感謝します。私はこの座標系がどうやって見つけられるのか分かりません。私は現在、プロジェクトが錐台または他のカメラ投影を設定する場所を見ることができません。 _view's_座標系がビューの平面内で2次元であるため、これは無関係であると感じるでしょうか? –
これらの人は、あなたや少なくともいくつかの役に立つポインタのように見えます:http://stackoverflow.com/questions/6045502/how-to-get-catransform3d-from-projection-and-modelview-matricesModelView-matrices – cb88