2

私はSOを検索しましたが、これを理解できません。他の質問は役に立たなかったか、私はそれらを理解していませんでした。

問題は、3D画像にたくさんのポイントがあることです。ポイントは長方形用ですが、遠近法のために3Dカメラのビューからは長方形のようには見えません。タスクは、その長方形から画面にポイントをマップすることです。「クワッドからクワッドへの変換」と呼ばれる方法を見てきましたが、それらのほとんどは、2次元の四辺形を別の四辺形にマッピングするためのものです。しかし、実世界では長方形のX、Y 、Z座標を持っているので、もっと簡単な方法を探しています。誰かがこれを行うための実用的なアルゴリズムや方法を知っていますか?

それが役に立ったら、私の3Dカメラは実際にはOpenNIとNITEミドルウェアを備えたKinectデバイスであり、私はWPFを使用しています。

前もって感謝します。

編集: ウィキペディアで角度と余弦定理を使用した3D投影ページも見つけましたが、それは難しい方法のようです(3D画像で角度を見つける)。それが本当の解決策かどうかはわかりません。

4

5 に答える 5

2

射影行列を確認することをお勧めします

これが、3Dラスタライザーが2D画面上の3Dボリュームを「フラット化」する方法です。

于 2011-04-22T17:33:37.397 に答える
2

特定のWPFカメラの投影行列を取得するには、次のコードを参照してください。

private static Matrix3D GetProjectionMatrix(OrthographicCamera camera, double aspectRatio)
{ 
    // This math is identical to what you find documented for
    // D3DXMatrixOrthoRH with the exception that in WPF only
    // the camera's width is specified.  Height is calculated
    // from width and the aspect ratio.
    double w = camera.Width;
    double h = w / aspectRatio;
    double zn = camera.NearPlaneDistance;
    double zf = camera.FarPlaneDistance;
    double m33 = 1 / (zn - zf);
    double m43 = zn * m33;
    return new Matrix3D(
        2 / w, 0, 0, 0,
        0, 2 / h, 0, 0,
        0, 0, m33, 0,
        0, 0, m43, 1);
}

private static Matrix3D GetProjectionMatrix(PerspectiveCamera camera, double aspectRatio)
{ 
    // This math is identical to what you find documented for
    // D3DXMatrixPerspectiveFovRH with the exception that in
    // WPF the camera's horizontal rather the vertical
    // field-of-view is specified.
    double hFoV = MathUtils.DegreesToRadians(camera.FieldOfView);
    double zn = camera.NearPlaneDistance;
    double zf = camera.FarPlaneDistance;
    double xScale = 1 / Math.Tan(hFoV / 2);
    double yScale = aspectRatio * xScale;
    double m33 = (zf == double.PositiveInfinity) ? -1 : (zf / (zn - zf));
    double m43 = zn * m33;
    return new Matrix3D(
        xScale, 0, 0, 0,
        0, yScale, 0, 0,
        0, 0, m33, -1,
        0, 0, m43, 0);
}

/// <summary>
///     Computes the effective projection matrix for the given
///     camera.
/// </summary>
public static Matrix3D GetProjectionMatrix(Camera camera, double aspectRatio)
{
    if (camera == null)
    {
        throw new ArgumentNullException("camera");
    }
    PerspectiveCamera perspectiveCamera = camera as PerspectiveCamera;
    if (perspectiveCamera != null)
    {
        return GetProjectionMatrix(perspectiveCamera, aspectRatio);
    }
    OrthographicCamera orthographicCamera = camera as OrthographicCamera;
    if (orthographicCamera != null)
    {
        return GetProjectionMatrix(orthographicCamera, aspectRatio);
    }
    MatrixCamera matrixCamera = camera as MatrixCamera;
    if (matrixCamera != null)
    {
        return matrixCamera.ProjectionMatrix;
    }
    throw new ArgumentException(String.Format("Unsupported camera type '{0}'.", camera.GetType().FullName), "camera");
}
于 2011-04-22T17:46:35.357 に答える
1

あなたは基本的な正投影を行うことができます(私はレイトレーシングの観点から考えているので、これはあなたがしていることに当てはまらないかもしれません):

ここに画像の説明を入力してください

コードは非常に直感的です。

for y in image.height:
  for x in image.width:
    ray = new Ray(x, 0, z, Vector(0, 1, 0)) # Pointing forward
    intersection = prism.intersection(ray) # Since you aren't shading, you can check only for intersections.

    image.setPixel(x, y, intersection) # Returns black and white image of prism mapped to plane

(0, 1, 0)宇宙に直接出て行く方向でベクトルを撃ち、どれが当たったかを記録するだけです。

于 2011-04-22T17:44:02.840 に答える
1

私はこれを見つけまし。行列の代わりに単純な数学を使用します。

これは、3D頂点から2Dスクリーン頂点に変換するための透視投影と呼ばれます。これを使用して、作成した3Dプログラムを支援しました。

HorizontalFactor = ScreenWidth / Tan(PI / 4)
VerticalFactor = ScreenHeight / Tan(PI / 4)

ScreenX = ((X * HorizontalFactor) / Y) + HalfWidth
ScreenY = ((Z * VerticalFactor) / Y) + HalfHeight

これがお役に立てば幸いです。私はあなたが探しているものだと思います。フォーマットについて申し訳ありません(ここで新しい)

于 2011-08-29T21:55:35.477 に答える
0

3Dワールドのポイントを2D画面にマッピングすることは、OpenGLやDirect3dなどのフレームワークの仕事の一部です。Heandelが言ったようにそれはラスタライズと呼ばれています。おそらく、Direct3dを使用できますか?

于 2011-04-22T17:37:49.560 に答える