3

これがばかげた質問である場合はお詫びします。私は3Dでの作業に非常に慣れていません。

3x3の回転行列と原点(0,0,0)に基づく平行移動ベクトルを備えたピンホールカメラがいくつかあります。

私が使用しているシステムは、原点を移動してカメラを回転させることができます(ただし、すべてが相互に相対的です)。その結果、各カメラの新しい回転行列と平行移動ベクトルが生成され、アクセスできます。

私の質問は、元の空間に3D位置がある点が与えられた場合、同じカメラ(または複数のカメラ)の新しい回転/移動を使用して、新しい空間にある同じ点の3D位置をどのように計算するのですか?

そして、私が質問している間、そうするためのより効率的な手段はありますか?

4

2 に答える 2

0

行列と変換を追跡するために同次座標を使用することをお勧めします。あなたの質問は、異なるカメラビュー間でポイントをどのように前後に変換するかということだと思います。

カメラ変換を単一の行列演算として表す場合、M逆方向に進むのはinverse(M)。さらに良いことに、カメラマトリックスが複数のステップの構成である場合は、ステップを逆にすることができます。たとえば、の場合M=rotatex(theta) * scale(sx, sy, sz) * translate(x, y, z)inverse(M) = translate(-x, -y, -z) * scale(1/sx, 1/sy, 1/sz) * rotatex(-theta)。また、順序を逆にする必要があることに注意してください。これは「靴下/靴」のプロパティです。靴下を履いてから靴を履きます。逆にするには、靴を脱いでから靴下を脱いでください。

各カメラから前後に移動できるようになると、任意のカメラビュー間でポイントを簡単に交換できます。

于 2011-06-21T23:44:02.137 に答える
0

ポイントの位置は、平行移動/回転できる原点マトリックスを基準にしていると思います。

これがすべて必要であると仮定すると、ポイントの新しい位置は次のように与えられます。

pos_newCoord = R^-1 * T^-1 * pos_oldCoord

あなたがしていることは、あなたがあなたの新しい起源を取り、それを古い起源に戻し、そしてそれを回転させないことです。別の書き方:

newOrigin = myTranslation(myRotation(oldOrigin))
def newCoordinates(point):
    return inverse(myRotation)(inverse(myTranslation)(point))

特に4d行列を使用している場合は、逆演算を事前に計算できます。


カメラの回転と平行移動の変化に基づいて、原点の回転と平行移動の変化を決定する方法は?」–OP

この情報が通知されない場合は、次のように回復できます。4dポイントと4v4アフィン変換行列(en.wikipedia.org/wiki/Affine_transformation)を使用します。

  • 任意の4台のカメラを取ります。
  • 元のカメラポイントとそれらの平行移動/回転ポイントを比較してください。
  • それを行うにはおそらくより良い線形代数の方法がありますが、ウィキペディアのリンクにアクセスすると、3x3の部分行列Aと3x1の部分行列bがあり、したがって12の未知数があることがわかります。ポイントごとに3つの方程式を持つ4つのポイントは、12の方程式を与えます。この形式の行列は可逆であるため、解決策があります*。お気に入りの連立一次方程式解法を使用して解きます。たとえば、12x12行列でのガウスの消去法などです。
于 2011-06-22T00:43:26.613 に答える