2016-08-26 24 views
11

Vì vậy, tôi có một API C với các cấu trúc sauLàm thế nào để sử dụng C struct với mảng 2D trong C# Unity

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

Nó được thông qua như một tham số để một trong những chức năng API của tôi:

void myFunction(const mat4f matrix); 

tôi xuất khẩu chức năng này để C# trong Unity sử dụng một dll:

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

câu hỏi của tôi là, những gì tôi nên mak e C# struct tương ứng được?

Ngay bây giờ tôi có như sau:

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

và sử dụng cố gắng sử dụng các chức năng như sau:

//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 

Đây có phải là điều đúng để làm gì? Có cách nào tốt hơn để làm điều này?

Trả lời

4

Đối với ma trận 4 × 4, bạn có thể sử dụng UnityEngine.Matrix4x4. Nếu bạn muốn sử dụng struct riêng của bạn, tôi khuyên bạn nên thực hiện nó theo cùng một cách UnityEngine.Matrix4x4 được thực hiện:

[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 
    }; 
} 

Đây là một blittable type. Các loại blittable không yêu cầu chuyển đổi khi chúng được chuyển giữa mã được quản lý và không được quản lý.

mẫu sử dụng:

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

triển khai hiện là tương tự như tôi đã trình bày ở trên.

1

Chuyển một cấu trúc C# vào một hàm được nhập như bạn đang làm là hợp lệ, nhưng bạn nên chỉ định độ dài của mảng trong cấu trúc, ngay cả khi sau đó bạn chỉ định kích thước của nó.

Việc kê khai c cơ bản xác định một mảng có độ dài 16, vì vậy tôi sẽ chỉ ra C# struct như sau:

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

Bạn có thể đọc thêm về cách mảng được sắp sếp here.

Các vấn đề liên quan