2013-08-19 49 views
16

Tôi có câu hỏi về webgl liên quan đến three.js. Tôi muốn đính kèm thông tin vào một đối tượng. Ví dụ, khi tôi bấm vào một đối tượng, tôi muốn lấy một số thông tin được gắn với đối tượng, như một URL, và sau đó chạy một hàm bằng cách sử dụng thông tin đó.Với ba.js, tôi có thể đính kèm thông tin vào một đối tượng, chẳng hạn như URL không?

Mã Tôi đang sử dụng cho việc tìm kiếm các đối tượng là:

var vector = new THREE.Vector3((event.clientX/window.innerWidth) * 2 - 1, -(event.clientY/window.innerHeight) * 2 + 1, 0.5); 
    projector.unprojectVector(vector, camera); 

    var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize()); 

    var intersects = raycaster.intersectObjects(objects); 

    intersects[0].object.material.color.setHex(Math.random() * 0xffffff); 

Dòng cuối cùng là như thế nào tôi đang thao tác với đối tượng. Mảng objects đơn giản là một mảng của tất cả các đối tượng. Vấn đề là tôi không biết đủ về cách Raycaster hoặc intersectObjects hoạt động, hoặc đủ về cách kết nối bất kỳ thông tin nào với một đối tượng để nó có thể được gọi lại sau.

Trả lời

17

thực sự bạn có thể đặt dữ liệu người dùng tùy chỉnh thành đối tượng trong Three.js. Chìa khóa ở đây là Object3D là cơ sở cho tất cả các đối tượng đồ thị cảnh. Các tài liệu có một tài sản gọi là

Object3D.userData; 

này có thể được nạp với một đối tượng của sự lựa chọn của bạn và khi lớp Raycaster lấy giao nhau của bạn, bạn chỉ có thể truy cập trực tiếp vào thời điểm đó.

Setter trong init hoặc runtime

Object3D.userData = { URL: "http://myurl.com" }; 

Getter trên Collision

window.location = intersects[0].object.userData.URL; 
+0

Perfect! Chính xác những gì tôi đang tìm kiếm. – JVE999

+2

Có bất kỳ sự khác biệt nào giữa việc thực hiện điều này và chỉ đơn giản là nói 'Mesh.myObject = {key: value};' Tôi nghĩ về cơ bản nó giống như vậy không? –

+3

Chỉ có sự phân biệt mà đến với tâm trí, và nó là một trong những quan trọng nhất, là nhân bản một Object3D sẽ bảo tồn tài sản userData. –