2016-08-26 26 views
11

所以我有下面的結構如何在C#中統一使用C結構與二維數組

typedef struct mat4f_ { float m[4][4]; } mat4f; 

它被作爲參數傳遞給我的API函數的一個通過一個C API:

void myFunction(const mat4f matrix); 

[DllImport ("mylib")] 
private static extern void myFunction(mat4f matrix); 

我的問題是,我應該麥:

我在Unity使用DLL導出此函數C# e相應的C#結構是?

現在,我有以下幾點:

[StructLayout(LayoutKind.Sequential)] 
public struct mat4f 
{ 
    public float[,] m; 
} 

與應用嘗試使用功能如下:

//Just make an identity matrix 
mat4f matrix; 
matrix.m = new float[4, 4] { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; 

myFunction(matrix); //Call dll function 

這是做正確的事嗎?有一個更好的方法嗎?

回答

4

對於4×4矩陣,可以使用UnityEngine.Matrix4x4。如果你想使用自己的結構,我建議你實現它以同樣的方式UnityEngine.Matrix4x4實現:

[StructLayout(LayoutKind.Sequential)] 
public struct mat4f 
{ 
    public float m00; 
    public float m01; 
    public float m02; 
    public float m03; 
    public float m10; 
    public float m11; 
    public float m12; 
    public float m13; 
    public float m20; 
    public float m21; 
    public float m22; 
    public float m23; 
    public float m30; 
    public float m31; 
    public float m32; 
    public float m33; 

    public static mat4f Identity = new mat4f 
    { 
     m11 = 1.0f, 
     m22 = 1.0f, 
     m33 = 1.0f, 
     m44 = 1.0f 
    }; 
} 

這是一個blittable type。 Blittable類型在託管和非託管代碼之間傳遞時不需要轉換。

樣品使用:

mat4f matrix = mat4f.Identity; 
myFunction(matrix); // Call DLL function 

現有實現類似於一個I上面給出。

1

將C#結構傳遞給像您所做的導入函數是有效的,但是您應該指定結構中數組的長度,即使稍後指定其大小也是如此。

C的聲明基本上指定長度爲16的陣列,所以我會如下指定C#的結構:

[StructLayout(LayoutKind.Sequential)] 
public struct mat4f 
{ 
[MarshalAs(UnmanagedType.ByValArray, SizeConst=16)] public float[,] m; 
} 

可以詳細瞭解如何陣列編組here