2015-02-26 15 views
6

Tôi đang cố gắng giảm tải một số Geometry tải và xử lý vào một nhân viên web. Để gửi nó trở lại chủ đề chính, cá thể Geometry cần phải được tuần tự hóa và có vẻ như là Geometry.prototype.toJSON() có nghĩa là chính xác loại điều này.Three.js - Làm thế nào để deserialize geometry.toJSON()? (nơi là geometry.fromJSON?)

Nhưng tôi không thể tìm ra cách biến đối tượng đó trở lại thành ví dụ Geometry trong chuỗi chính. Sản lượng toJSON() được sử dụng như thế nào?

PS: Tôi đã xem this related question, nhưng có vẻ như đã hẹn hò. toJSON() chưa có trong API. Câu trả lời được chấp nhận là một chút phức tạp, và yêu cầu tôi vẫn làm một số công việc thô trong chủ đề chính.

+0

Bạn nên nhìn xung quanh lớp nạp trong tài liệu: http://threejs.org/docs/# Tham chiếu/Trình tải/ObjectLoader – nemesv

+1

@nemesv: Tôi đã xem và nhìn. Các lớp đó không thể được sử dụng để biến đầu ra 'toJSON()' thành một 'Hình học '. Về lý thuyết, tôi có thể cố gắng hiểu tất cả các mã nguồn của họ, và viết một giải pháp đầy đủ từ đầu, nhưng điều đó sẽ mất rất nhiều thời gian. Chủ yếu, tôi không thể tin rằng một phương thức serialization 'toJSON()' tồn tại, không có cách nào để deserialize. : -/ – mhelvens

+0

Xem liệu điều này có giúp ích không: http://stackoverflow.com/questions/27992147/three-js-include-mesh-data-in-code/27996338#27996338 – WestLangley

Trả lời

2

Tại sao bạn không chỉ sử dụng Trình tải JSONLoader?

myloader = new THREE.JSONLoader() 
myloader.load("path/to/json", function(geometry,material){ 
    mesh = new THREE.Mesh(geometry,material) 
    scene.add(mesh) 
}) 

hoặc tải tập tin một JSON theo cùng một cách

+0

I * am * bằng cách sử dụng JSONLoader.Nhưng tôi đang làm nó trong một chuỗi công nhân, và bây giờ tìm kiếm một cách để giao tiếp hình học kết quả (sau khi sửa đổi) trở lại chủ đề chính. – mhelvens

3

Nếu tôi hiểu đúng vấn đề là:

  • Bạn có một tập tin mà bạn muốn tải như một hình học (obj, STL, v.v.)
  • Bạn muốn tải tệp này trong một WebWorker.
  • Sau đó, bạn muốn gửi hình học trở lại tập lệnh chính.
  • Vì vậy, bạn đang nghĩ đến việc gửi tệp về chủ đề chính dưới dạng JSON, vì việc gửi các đối tượng không được hỗ trợ.
  • Sau đó, bạn sẽ chuyển đổi json thành hình học trên chuỗi chính.

Vấn đề với việc chuyển đổi từ chuỗi JSON sang hình học là một thao tác tải khác (đó là lý do tại sao có JSONLoader), vì vậy tại thời điểm đó, bạn cũng có thể thực hiện tải trên chuỗi chính.

Cách tiếp cận mà tôi đã sử dụng là tải tệp vào các mảng phẳng của các đỉnh và tiêu chuẩn, sau đó tôi gửi chúng trở lại chuỗi chính để thêm vào BufferGeometry. Bạn cũng có thể sử dụng các đối tượng chuyển được để tăng thêm tốc độ.

// worker.js 

var vertices = new Float32Array(faces * 3 * 3); 
var normals = new Float32Array(faces * 3 * 3); 

// Load your file into the arrays somehow. 

var message = { 
    status:'complete', 
    vertices: vertices, 
    normals: normals 
}; 

postMessage(message, [message.vertices.buffer, message.normals.buffer]); 

// app.js 

onmessage = function (event) { 

    var vertices = event.data.vertices; 
    var normals = event.data.normals; 

    var geometry = new THREE.BufferGeometry(); 
    geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3)); 
    geometry.addAttribute('normal', new THREE.BufferAttribute(normals, 3)); 

    var material = new THREE.MeshPhongMaterial(); 

    var mesh = new THREE.Mesh(geometry, material); 

    // Do something with it. 

}; 
+0

Tôi đã sử dụng một chuỗi công nhân vì hình học vẫn cần phải được xử lý/chuyển đổi, điều này sẽ làm nổi bật chủ đề chính. Giải pháp của bạn có vẻ hợp lý ngay từ cái nhìn đầu tiên, nhưng đã quá lâu kể từ khi tôi đang giải quyết vấn đề. Tôi không thể thực sự đánh giá ngay bây giờ. (Trong mọi trường hợp, nó không thực sự trả lời câu hỏi như đã đặt ra.) – mhelvens

+0

Câu hỏi được hỏi là "Where is geometry.fromJSON()?" nhưng nó có vẻ như những gì bạn thực sự muốn biết là làm thế nào để vượt qua hình học từ một WebWorker đến kịch bản chính mà không cần chặn/trì hoãn. Kỹ thuật tôi giải thích làm điều đó, mặc dù thay vì tải bạn đang xử lý. Tạo BufferGeometry từ các mảng đã được chuyển được chuyển gần như ngay lập tức. Tôi tìm thấy câu hỏi này đang tìm cách để làm điều này. – DylanVann

+0

Chắc chắn, đó là câu trả lời hữu ích (tôi đã +1). Nhưng nó chỉ hoạt động nếu các đỉnh và các chuẩn là các phần dữ liệu duy nhất trong một hình học, mà không nhất thiết phải là trường hợp (giống như các mô hình hoạt hình 3d). Vâng, chúng tôi cũng có thể thêm vào đó, nhưng lý tưởng là phải có các cơ sở tuần tự hóa/deserialization xử lý tất cả các mô hình có thể, vì vậy chúng tôi không phải mã hóa và duy trì bản thân này. – mhelvens

1

Bạn có thể sử dụng JSONLoader hình học unserialize như vậy:

var geometry = new THREE.Geometry(); 
var serializedGeometry = geometry.toJSON(); 
var jsonLoader = new THREE.JSONLoader(); 

var result = jsonLoader.parse(serializedGeometry.data); 

var unserializedGeometry = result.geometry; 
Các vấn đề liên quan