2011-01-02 38 views
6

Tôi đang tạo bản sao Minecraft làm dự án OpenGL đầu tiên của mình và bị kẹt ở phần chọn hộp. Điều gì sẽ là phương pháp tốt nhất để thực hiện một lựa chọn hộp đáng tin cậy?Phương pháp chọn hộp tốt nhất cho bản sao Minecraft

Tôi đã trải qua một số thuật toán AABB, nhưng không có giải thích nào đủ chính xác (đặc biệt là các siêu chỉnh) và tôi không muốn sử dụng những thứ tôi không hiểu.

Kể từ khi thế giới bao gồm khối Tôi đã từng octrees để loại bỏ một số căng thẳng trên các tính toán ray dàn diễn viên, về cơ bản là điều duy nhất tôi cần là chức năng này:

float cube_intersect(Vector ray, Vector origin, Vector min, Vector max) 
{ 
    //??? 
} 

Các ray và nguồn gốc có thể dễ dàng thu được với

Vector ray, origin, point_far; 
double mx, my, mz; 

gluUnProject(viewport[2]/2, viewport[3]/2, 1.0, (double*)modelview, (double*)projection, viewport, &mx, &my, &mz); 
point_far = Vector(mx, my, mz); 
gluUnProject(viewport[2]/2, viewport[3]/2, 0.0, (double*)modelview, (double*)projection, viewport, &mx, &my, &mz); 
origin = Vector(mx, my, mz); 
ray = point_far-origin; 

phút và tối đa là các góc đối diện của hình lập phương.

Tôi thậm chí không chắc chắn đây là cách phù hợp để làm điều này, xem xét số lượng hình khối tôi phải kiểm tra, ngay cả với octrees.

Tôi cũng đã thử gluProject, nó hoạt động, nhưng rất không đáng tin cậy và không cung cấp cho tôi khuôn mặt được chọn của hình khối.


EDIT

Vì vậy, đây là những gì tôi đã thực hiện: tính toán một vị trí trong không gian với ray:

float t = 0; 
for(int i=0; i<10; i++) 
{ 
    Vector p = ray*t+origin; 
    while(visible octree) 
    { 
     if(p inside octree) 
     { 
      // then call recursive function until a cube is found 
      break; 
     } 
     octree = octree->next; 
    } 
    if(found a cube) 
    { 
     break; 
    } 
    t += .5; 
} 

Nó thực sự đáng ngạc nhiên nhanh và dừng lại sau khi người đầu tiên tìm thấy khối .

alt text

Như bạn có thể nhìn thấy tia phải đi nhiều octrees máng trước khi nó tìm thấy một khối lập phương (thực sự là một vị trí trong không gian) - có một crosshair ở giữa màn hình. Bước tăng thấp càng chính xác hơn, nhưng cũng chậm hơn.

Trả lời

5

Làm việc với các hộp như nguyên thủy là quá mức cần thiết trong các yêu cầu bộ nhớ và sức mạnh xử lý. Cubes là tốt cho rendering và thậm chí ở đó bạn có thể tìm thấy nhiều thuật toán tiên tiến cung cấp cho bạn một hình ảnh cuối cùng tốt hơn (Marching cubes). Đồ họa của Minecraft rất nguyên thủy theo ý nghĩa này khi việc dựng hình voxel đã diễn ra trong một thời gian dài và tiến bộ đáng kể đã được thực hiện.

Về cơ bản, bạn nên khai thác thực tế là tất cả các ô của bạn đều cách nhau bằng nhau và có cùng kích thước. Đây được gọi là voxels. Chiếu sóng trong một lưới là tầm thường so với những gì bạn có - một cây oct-pha rộng và thử nghiệm AABB pha hẹp. Tôi đề nghị bạn nghiên cứu một chút về voxels và voxel thiết lập phát hiện va chạm/raycasting như bạn sẽ tìm thấy cả hai thuật toán được dễ dàng hơn để thực hiện và đó sẽ chạy nhanh hơn.

+0

Sao chép đã dán những gì bạn đã nói với Google và nhận thấy rằng: http://www.metanetsoftware.com/technique/tutorialB.html Cảm ơn, tốt hơn so với giải pháp của tôi. – Solenoid

+0

Đồng ý .. Tôi đã làm việc trên một bản sao cho xbox và tìm thấy xử lý các đỉnh chuyên sâu .. chuyển sang khối hành quân cho trò chơi tiếp theo của tôi và nó chạy cách nhanh hơn (như một ứng dụng chrome trong javascript!) [Mỏ mars] (http: // youtu.be/_oML6USPs20) –

0

Bạn không cần bất kỳ cấu trúc octree rõ ràng nào trong bộ nhớ. Tất cả những gì cần thiết là byte [,,]. Chỉ cần tạo ra 8 trẻ em của một hộp lười biếng trong quá trình tìm kiếm (như một công cụ cờ vua tạo ra trạng thái trò chơi trẻ em).

0

Tôi cũng cho rằng bạn không phải dựa vào các chương trình phát sóng thực tế để xác định nội dung hiển thị. Do bạn đang ở trong một hệ thống lưới điện được xác định trước, bạn thực sự không bị bắt làm con tin với các yêu cầu "có thể nhìn thấy chính xác".Nếu bạn có thể theo dõi vị trí của máy ảnh của bạn và phân bổ một la bàn NSWE của một số loại bạn cũng có thể sử dụng để xác định xem bộ đệm GPU thậm chí nên xem xét hàng loạt các đỉnh của cho rendering ..

tôi bao gồm lý thuyết này một cách chi tiết ở đây https://stackoverflow.com/a/18028366/94167

Nhưng khi sử dụng vị trí của Octree và Camera + khoảng cách/giới hạn máy ảnh về cơ bản bạn biết những gì người dùng đang nhìn thấy mà không cần phải sử dụng raytrace (s) để xem? Nếu bạn có thể củng cố hình tam giác của mình thành hình tam giác lớn hơn cho mục đích kết xuất và sau đó sử dụng kết cấu để phá vỡ khả năng hiển thị của mặt lưng lớn thành hình khối (nhẹ), bạn giảm đáng kể số đỉnh của mình. Sau đó, vấn đề của nó là chỉ hiển thị thân tàu và theo dõi hướng camera của bạn là gì và vị trí của nó là xyz bạn có thể thoát khỏi một số khuôn mặt không được hiển thị vì nó sẽ có tác động tối thiểu đến hiệu suất (đặc biệt là Nếu các bóng râm của bạn cũng làm một số công việc)

Tôi đang thử nghiệm thêm bằng cách theo dõi điểm trung tâm của máy ảnh để xác định tiêu điểm ngang của nó và từ đó bạn có thể xác định góc mà lần lượt xác định độ sâu của chunk bạn có thể nhìn thấy theo hướng nó phải đối mặt.

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