3

OpenGL と DirectX の間で変換を実行するためにこの質問を見つけましたが、Unity3D から同じことを実行する場合は機能していないようです。

OpenGL プロジェクション マトリックスと Unity3D プロジェクション マトリックス (およびビュー マトリックス!) の違いについて何か知っている人がここにいることを期待していました。

この記事も使用しようとしましたが、うまくいきませんでした。

Unity3D では、独自のネイティブ C++ プラグインを呼び出しています。

SetView(MatrixToArray(Camera.current.worldToCameraMatrix));
SetProjection(MatrixToArray(Matrix4x4.identity));
SetWorld(MatrixToArray(Camera.current.projectionMatrix));

private static float[] MatrixToArray(Matrix4x4 _matrix)
{
    float[] result = new float[16];

    for (int _row = 0; _row < 4; _row++)
    {
        for (int _col = 0; _col < 4; _col++)
        {
            result[_col + _row * 4] = _matrix[_row, _col];
        }
    }

    return result;
}

そして、私のC++プラグインでは、記事を介してこれらの行列を変換しようとしています:

extern "C" void EXPORT_API SetProjection(float a[])
{
    g_Proj._11 = a[0];
    g_Proj._21 = a[1];
    g_Proj._31 = -a[2];
    g_Proj._41 = a[3];
    g_Proj._12 = a[4];
    g_Proj._22 = a[5];
    g_Proj._32 = -a[6];
    g_Proj._42 = a[7];
    g_Proj._13 = a[8];
    g_Proj._23 = a[9];
    g_Proj._33 = -a[10];
    g_Proj._43 = a[11];
    g_Proj._14 = a[12];
    g_Proj._24 = a[13];
    g_Proj._34 = -a[14];
    g_Proj._44 = a[15];
}

extern "C" void EXPORT_API SetView(float a[])
{
    g_View._11 = a[0];
    g_View._21 = a[1];
    g_View._31 = -a[2];
    g_View._41 = a[3];
    g_View._12 = a[4];
    g_View._22 = a[5];
    g_View._32 = -a[6];
    g_View._42 = a[7];
    g_View._13 = -a[8];
    g_View._23 = -a[9];
    g_View._33 = a[10];
    g_View._43 = -a[11];
    g_View._14 = a[12];
    g_View._24 = a[13];
    g_View._34 = a[14];
    g_View._44 = a[15];
}

ビューと射影行列に単位行列を使用すると、頂点の三角形が得られるため、物事が描かれていることがわかります: {0,0,0}、{0,1,0}、{1,0,0}。また、カメラを動かすと、あらゆる種類のせん断効果が見られます。

編集 - 詳細情報:
Unity3D のドキュメントには、OpenGL 表記を使用していると書かれています。

編集 - サンプル プロジェクト:
誰かが私のコードを試してみたい場合は、テスト プロジェクトを作成し、ユニティ フォーラムにアップロードしました。

4

1 に答える 1

0

この記事はうまく機能しているように見えますが、急いで試行錯誤した結果、射影行列を世界行列に設定したようです。

SetProjection(MatrixToArray(Matrix4x4.identity));
SetWorld(MatrixToArray(Camera.current.projectionMatrix));

になるはずだった

SetWorld(MatrixToArray(Matrix4x4.identity));
SetProjection(MatrixToArray(Camera.current.projectionMatrix));

Unity フォーラムにtest projectに関する情報を追加しました。

于 2013-08-21T08:40:55.483 に答える