2

ユーザーが手を使って画面上のオブジェクトを指すだけの直感的なポインティングメカニズムを実装しようとしています。最後の部分の書き方がわからないことを除いて、ほとんどの準備ができています。

基本的に、次のようなキャリブレーション ポイントのリストがあります。

typdef struct {
    Point2D pointOnScreen, // gives an x/y pixel screen position
    Point3D pointingFinger, // gives the position of the user's pointing finger, in space
    Point3D usersEyes // gives the position of the user's eyes, in space
} CalibrationPoint;

std::vector<CalibrationPoint> calibrationPoints;

さて、アイデアは、これらを使用して、次calibrationPointsのような関数を作成できるということです。

Point2D whereIsTheUserPointing(Point3D pointingFinger, Point3D usersEyes) {
     return the corresponding point on screen; // this would need to be calibrated
                                               // somehow using the calibrationPoints
}

しかし、これを行う方法の計算を理解するのに苦労しています。基本的な考え方は、ポインティングするときは、指を一直線に並べることyour eyesです。ただし、3D で画面の位置を把握していないため、代わりにキャリブレーション ポイントを取得し、そこからユーザーが指している場所を推測できると考えました。関数を作成してシステムを調整するにはどうすればよいですか?fingerobject you're pointing atwhereIsTheUserPointing()

4

2 に答える 2

2

私は理想化していますが、おそらくこれが始まりになるでしょう:

  • 目と指先のユニバーサル 3D 座標を取得できるとします。

  • 3D 空間の 3 つの点が平面にまたがっています。画面上の 3 点を特定できれば、3D 空間で画面平面を見つけることができます。安全のために、4 つの角すべてを見つけて、平面だけでなくその境界も把握できるようにしましょう。

  • 3D で交わる 2 つの直線は、3D で一意の点を決定します。

したがって、画面の 4 つのコーナーを見つけるには、各コーナーを通る 2 本の直線の 4 つのペアを生成します。これは、ユーザーに 4 つのコーナーをポイントして移動し、再び 4 つのコーナーをポイントするように求めることで実行できます。

于 2012-09-10T11:42:00.740 に答える
0

目の座標を (a,b,c) とし、指先の座標を (x,y,z) とします。結合線を 3D で簡単に視覚化できます。あとは、画面の「平面」と交差するまで線を延長するだけです。

あなたの場合の線のパラメトリック座標は次のようになります。

(a + T(x-a), b + T(y-b), c + T(z-c))

with:

eye at (a,b,c) and finger at (x,y,z).

T = 0 で、目の座標を取得します。T=1 で指先の座標を取得します。T>1 でラインを「延長」できます。

T画面の平面の z 座標があると仮定すると、次の式で簡単に値を取得できます。

T = (Z_VALUE_OF_PLANE-c)/(z-c)

この T の値を代入して、他の 2 つの座標 (x,y) を取得します。

2D 平面上の最終的な座標は次のようになります。

X = a + ((Z_VALUE_OF_PLANE-c)/(z-c))*(x-a)
Y = b + ((Z_VALUE_OF_PLANE-c)/(z-c))*(y-b)
于 2012-09-10T11:47:04.517 に答える