2015-05-20 25 views
5

Tôi đang cố gắng tìm cách xóa tất cả các đối tượng trong cảnh mà không phá hủy cảnh đó. Tôi biết rằng đặt tên đối tượng là một cách và sau đó khi chúng tôi muốn xóa đối tượng, chúng tôi chỉ "nhận" nó theo tên của nó. Tuy nhiên, tôi muốn tìm một cách nhanh chóng để xóa một cảnh của tất cả các đối tượng trong đó, bất kể tên của chúng. Có cách nào dễ dàng để làm điều đó không? Cảm ơn!Làm cách nào để xóa BA.JS Scene

Trả lời

5

Bạn có thể duyệt qua các đối tượng con của cảnh và xóa từng mục một.

 scene.children.forEach(function(object){ scene.remove(object); }); 

Edit:

Như đã đề cập trong các ý kiến, câu trả lời ở trên là sai. Cách chính xác để xóa tất cả các đối tượng khỏi khung cảnh đang sử dụng vòng lặp for/while.

while(scene.children.length > 0){ 
    scene.remove(scene.children[0]); 
} 

Lưu ý: Đây chỉ là một thanh toán bù trừ nhanh chóng và dơ bẩn của hệ thống phân cấp đối tượng. Nếu bạn có kế hoạch làm điều này rất nhiều bạn có nguy cơ chạy vào rò rỉ bộ nhớ với mã ở trên vì trình kết xuất có tham chiếu đến các vật liệu, kết cấu và hình học đối tượng. Một sạch hoàn toàn các cảnh phức tạp hơn và có rất nhiều câu hỏi khác mà đi vào chi tiết hơn:

+3

giải pháp này không chính xác, vì bạn đang lặp qua mảng được sửa đổi trong vòng lặp, vì vậy một số phần tử có thể bị bỏ qua (ví dụ: khi bạn có hai phần tử ở trẻ em), hãy thay thế bằng: '' 'while (scene) .children.length> 0) { scene.remove (scene.children [0]); } '' ' – Alleo

0

Tôi có một ngắn gọn hơn cách làm điều này. Tôi nhận thấy rằng phương thức remove của Object3D chấp nhận nhiều hơn một tham số để loại bỏ đối tượng. Điều này cho phép chúng tôi sử dụng toàn bộ mảng children bằng cách sửa đổi cuộc gọi để sử dụng từng phần tử dưới dạng tham số riêng lẻ bằng cách tận dụng phương pháp tích hợp sẵn trong apply cho các hàm. Điều này hoạt động như vậy:

scene.remove.apply(scene, scene.children); 
0

Truyền tải tất cả trẻ em và gọi vứt bỏ trên hình, vật liệu và kết cấu của chúng. Mã dưới đây là giải pháp của tôi.

function clearThree(obj){ 
    while(obj.children.length > 0){ 
    clearThree(obj.children[0]) 
    obj.remove(obj.children[0]); 
    } 
    if(obj.geometry) obj.geometry.dispose() 
    if(obj.material) obj.material.dispose() 
    if(obj.texture) obj.texture.dispose() 
} 

clearThree(scene) 
Các vấn đề liên quan