0

Direct3D キャンバスに背景画像があります。背景の特定の位置に円を描いています。キャンバスがカメラで (ワールド/ビュー/プロジェクションを使用して) ズーム/パンされた後、背景が更新されます。

問題は、円を再描画するための画像上の以前の位置が見つからないことです。次の関数 (DirectX 11.1) を使用して座標を見つけています。しかし、それは機能していません。

XMVECTOR Camera::Unproject(Windows::Foundation::Rect viewPort, Windows::Foundation::Point location)
{
XMFLOAT3 worldPosition(location.X, location.Y, 0.0f);
XMVECTOR worldVector = XMLoadFloat3(&worldPosition);
return XMVector3Unproject(worldVector, viewPort.X, viewPort.Y, viewPort.Width, viewPort.Height, 0.0f, 1.0f, this->Projection(), this->View(), this->World());   
}

XMMatrixIdentity を世界として試してみました。しかし、成功しません。誰でも私を助けてもらえますか?

4

1 に答える 1

1

これは、あなたが提供した情報に関する重要な問題です。

画面上の 2D ポイントは、シーン内の 1 つの 3D ポイントにマッピングできません。すべての 2D ポイントは、光線全体にマップされます。したがって、特定の 2D 位置に円を描くと、その円をシーン内のさまざまな位置に配置できます。それがおそらく、奇妙な結果が得られる理由です。

カメラを動かすと、レイはおそらく「より見える」ようになります。つまり、単一の 2D ポイントではなく、2D レイにマップされます。そして、あなたの円はこの光線のどこかに置かれます。ご覧のとおり、提供された情報で円の新しい位置を取得する方法はありません。特定の光線のどこかにあるとしか言えません。

しかし、おそらく円の位置を指定できます。オブジェクト上、仮想平面上などに配置されている可能性があります。そうすれば、この問題は解決可能です。

まず、円の 3D 位置を見つける必要があります。XMVector3Unproject2回使用します。1 回は z 座標が 0 で、もう 1 回は 1 です。これにより、カメラに非常に近い点と遠くの点が得られます。これはあなたの光線です。次に、その光線上の円の位置を計算する必要があります。たとえば、光線を平面と交差させることによって。この 3D 位置は、新しいカメラ パラメータを使用してスクリーン ( ) に投影し直すことができXMVector3Project、新しい円の位置を定義します。

はい、おそらくアイデンティティ行列を世界行列として定義する必要があります。

于 2012-10-22T20:58:40.190 に答える