2

私の問題:

2つの3Dポイントを取得して、それらを1つの軸にロックするにはどうすればよいですか?たとえば、両方のz軸が0になるようにします。

私がやろうとしていること:

シーンに3D座標のセットがあり、ピラミッドが付いたボックスを表しています。別の3D座標で表されるカメラもあります。シーン座標からカメラ座標を減算して正規化し、カメラを指すベクトルを返します。次に、カメラポイントの後ろにある平面と光線平面の交差を行います。

O + tD

ここで、O(原点)はカメラの位置、Dはシーンポイントからカメラへの方向、tは光線がカメラポイントから平面と交差するのにかかる時間です。

それが意味をなさない場合は、ここに大まかな図面があります:

原油画

私は広範囲にわたって検索しましたが、私が知る限り、これは「ピンホールカメラ」を使用して呼ばれています。

問題は私のカメラの回転ではありません、私はそれを排除しました。問題は、交点を重心(uv)座標に変換することです。

x軸の平行移動は次のようになります。

uaxis.x = -a_PlaneNormal.y;
uaxis.y = a_PlaneNormal.x;
uaxis.z = a_PlaneNormal.z;

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);

point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);

return point2d; 

z軸の平行移動は次のようになります。

uaxis.x = -a_PlaneNormal.z;
uaxis.y = a_PlaneNormal.y;
uaxis.z = a_PlaneNormal.x;

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);

point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);

return point2d; 

私の質問は、光線平面の交点をx軸とz軸の両方の重心座標に変えるにはどうすればよいですか?

4

1 に答える 1

3

ベクトル方向(v)で(p0)から始まる、線上の点(p)の通常の式は次のとおりです。

p = p0 + t*v

(p1)を含み、法線(n)を持つ平面上の点(p)の基準は次のとおりです。

(p - p1).n = 0

だから、plug&chug:

(p0 + t*v - p1).n = (p0-p1).n + t*(v.n) = 0

   ->  t = (p1-p0).n / v.n
   ->  p = p0 + ((p1-p0).n / v.n)*v

チェックする:

(p - p1).n = (p0-p1).n + ((p1-p0).n / v.n)*(v.n)
                   = (p0-p1).n + (p1-p0).n
                   = 0

Z座標を特定の値に固定する場合は、Z軸に沿った法線を選択する必要があります(XY平面に平行な平面を定義します)。

次に、次のようになります。

n = (0,0,1)

   ->  p = p0 + ((p1.z-p0.z)/v.z) * v
   ->  x and y offsets from p0 = ((p1.z-p0.z)/v.z) * (v.x,v.y)

最後に、3Dコンピュータグラフィックス用の仮想「カメラ」を構築しようとしている場合、この種のことを行うための標準的な方法は同次座標です。最終的に、同次座標での作業は、私が上で書いた種類のアドホック3Dベクトル代数よりも簡単です(そして通常は高速です)。

于 2009-11-23T12:21:32.697 に答える