2011-09-02 34 views
12


Đây là bài đăng đầu tiên của tôi ở đây, do đó xin lỗi vì bất kỳ lỗi lầm nào.
Tôi đang phát triển một trò chơi hành động đơn giản với việc sử dụng OpenGL ES 2.0 và Android 2.3. Khung trò chơi của tôi mà tôi hiện đang làm việc dựa trên các họa tiết hai chiều tồn tại trong thế giới ba chiều. Tất nhiên các thực thể thế giới của tôi có thông tin như vị trí trong thế giới tưởng tượng, giá trị luân phiên dưới dạng phao [] ma trận, xử lý kết cấu OpenGL cũng như xử lý Bitmap của Android (Tôi không chắc chắn liệu nó có cần thiết như tôi đang làm hay không) sự rasterisation với việc sử dụng máy OpenGl, nhưng trong thời gian này nó chỉ ở đó, để thuận tiện cho tôi). Đây là một thời gian ngắn nền, bây giờ cho vấn đề có vấn đề.
Hiện tại tôi đang bị kẹt với phát hiện va chạm dựa trên điểm ảnh vì tôi không chắc chắn đối tượng nào (ở đây kết cấu OGL hoặc Android Bitmap) tôi cần lấy mẫu. Ý tôi là, tôi đã cố gắng lấy mẫu Bitmap của Android, nhưng nó hoàn toàn không hiệu quả đối với tôi - nhiều sự cố thời gian chạy liên quan đến việc đọc bên ngoài bitmap. Tất nhiên để có thể đọc các pixel từ bitmap, tôi đã sử dụng phương thức Bitmap.create để có được sprite xoay đúng cách. Dưới đây là đoạn mã:
Vấn đề phát hiện va chạm dựa trên pixel với OpenGLES 2.0 trong Android

android.graphics.Matrix m = new android.graphics.Matrix(); 
if(o1.angle != 0.0f) {   
    m.setRotate(o1.angle); 
    b1 = Bitmap.createBitmap(b1, 0, 0, b1.getWidth(), b1.getHeight(), m, false); 
} 

Một vấn đề khác, mà có thể thêm vào các vấn đề, hoặc thậm chí là vấn đề chính, đó là hình chữ nhật của tôi giao nhau (hình chữ nhật chỉ ra hai không gian chiều lẫn nhau cho cả hai đối tượng) là xây dựng từ các bộ phận của hai hộp giới hạn được tính toán với việc sử dụng ma trận OpenGL Chức năng Matrix.multiplyMV (mã bên dưới). Có thể nào, rằng hai phương pháp tính toán ma trận Android và OpenGL đó không bằng nhau?

Matrix.rotateM(mtxRotate, 0, -angle, 0, 0, 1); 

// original bitmap size, equal to sprite size in it's model space, 
// as well as in world's space 
float[] rect = new float[] { 
    origRect.left, origRect.top, 0.0f, 1.0f, 
    origRect.right, origRect.top, 0.0f, 1.0f, 
    origRect.left, origRect.bottom, 0.0f, 1.0f, 
    origRect.right, origRect.bottom, 0.0f, 1.0f 
}; 

android.opengl.Matrix.multiplyMV(rect, 0, mtxRotate, 0, rect, 0); 
android.opengl.Matrix.multiplyMV(rect, 4, mtxRotate, 0, rect, 4); 
android.opengl.Matrix.multiplyMV(rect, 8, mtxRotate, 0, rect, 8); 
android.opengl.Matrix.multiplyMV(rect, 12, mtxRotate, 0, rect, 12); 

// computation of object's bounding box (it is necessary as object has been 
// rotated second ago and now it's bounding rectangle doesn't match it's host 
float left = rect[0]; 
float top = rect[1]; 
float right = rect[0]; 
float bottom = rect[1]; 
for(int i = 4; i < 16; i += 4) { 
    left = Math.min(left, rect[i]); 
    top = Math.max(top, rect[i+1]); 
    right = Math.max(right, rect[i]); 
    bottom = Math.min(bottom, rect[i+1]); 
}; 
+0

Nói chung OpenGL là * chỉ * cho đồ họa. Bạn không nên để nó chạm vào trò chơi của bạn/tọa độ thế giới ngoại trừ để tạo một bản sao * được chuyển đổi * của chúng để trình bày lên màn hình. Điều này có nghĩa là bất kỳ hộp giới hạn nào bạn phải được tính toán bằng mã của riêng bạn. Và hãy xem xét các hệ thống vật lý dựa trên pixel :) Nghe có vẻ như là một ý tưởng hay cho mọi thứ, cho đến khi bạn thử nó và tìm hiểu nó chỉ là ý tưởng tốt cho các mục không tương tác về mặt vật lý (bất kỳ mục nào biến mất khi bạn chạm vào nó, như một viên đạn hoặc vật phẩm nhặt lên, hoặc nếu bạn chết ngay lập tức khi chạm vào). –

+0

Cảm ơn câu trả lời đó. Kết quả tôi muốn đạt được là có va chạm tốt hơn so với kết quả dựa trên vòng tròn và hộp.Điều này có thể đúng là các xung đột điểm ảnh không đủ tốt vì chúng đắt tiền tính toán. Gần đây tôi đã đọc về một cái gì đó gọi là 'hình dạng lồi' và có lẽ tôi sẽ sử dụng chúng để tăng cường hành vi của hệ thống va chạm của tôi – cplusogl

+1

Cảnh báo về per-pixel chủ yếu là do tôi chơi với nó. platformer kiểu trường học, và đã tìm ra rằng nó không cảm thấy đúng. Độ phức tạp tính toán có thể giảm đi rất nhiều với các kỹ thuật đúng (ban đầu là va chạm AABB-only, có thể bị giảm bởi thông tin phân vùng không gian như hệ thống lưới hoặc quad-tree động, sau đó sử dụng mặt nạ va chạm đen trắng đặc biệt và chỉ kiểm tra chồng lên nhau). Hình dạng lồi chắc chắn là một cách tốt để đi quá, và sẽ cho phép bạn thay thế nghệ thuật 3d trong một trò chơi với chỉ tương tác 2d. –

Trả lời

0

Chúc mừng,

nốt nhạc đầu tiên rằng có một lỗi trong mã của bạn. Bạn không thể sử dụng Matrix.multiplyMV() với vector nguồn và đích là giống nhau (hàm sẽ tính toán chính xác tọa độ x mà nó sẽ ghi đè trong vectơ nguồn. Tuy nhiên, nó cần x gốc để tính y, z và w tọa độ - đó là lần lượt thiếu sót). Cũng lưu ý rằng sẽ dễ dàng hơn cho bạn khi sử dụng các quả cầu chặn cho bước va chạm phát hiện đầu tiên, vì chúng không yêu cầu mã phức tạp như vậy để thực hiện phép biến đổi ma trận.

Sau đó, phát hiện xung đột. Bạn không nên đọc từ các ảnh bitmap hay kết cấu. Những gì bạn nên làm là xây dựng một hình bóng cho đối tượng của bạn (đó là khá dễ dàng, hình bóng chỉ là một danh sách các vị trí). Sau đó bạn cần phải xây dựng các đối tượng lồi lấp đầy hình bóng (không lồi). Nó có thể đạt được bằng ví dụ. thuật toán cắt tai. Nó có thể không phải là nhanh nhất, nhưng nó rất dễ thực hiện và sẽ chỉ được thực hiện một lần. Khi bạn có các đối tượng lồi, bạn có thể biến đổi tọa độ của chúng bằng ma trận và phát hiện va chạm với thế giới của bạn (có nhiều bài viết hay về giao điểm hình tam giác bạn có thể sử dụng), và bạn nhận được độ chính xác giống như khi bạn sử dụng pixel dựa trên phát hiện va chạm.

Tôi hy vọng điều này sẽ giúp ...

+0

Ồ, tôi sẽ phải kiểm tra các cuộc gọi multiplyMV khác của tôi, cảm ơn vì đã chỉ ra điều đó. Tuy nhiên, vui vẻ đủ các hành vi ứng dụng không bao giờ trình bày bất kỳ ổn định vì việc sử dụng không đúng của multiplyMV ... Đối với các hình dạng lồi, tôi sẽ phải nhìn sâu hơn vào chủ đề. Cảm ơn nhiều! – cplusogl

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