2013-09-26 128 views

Trả lời

11

Có thể sử dụng một vài hack đơn giản trên nguyên mẫu Xương và Object3D. Kể từ khi xương kế thừa từ Object3D, chúng có thể có con, vì vậy chúng ta có thể dễ dàng .add() một lưới vào bất kỳ xương nào.

Tuy nhiên, SkinnedMesh sẽ chỉ gọi updateMatrixWorld() trên trẻ em không phải xương và cập nhật() cho trẻ xương. Ngoài ra, xương gọi cập nhật() cho mỗi con của nó (bất kể nó là xương hay không). Các đoạn mã sau thay đổi hành vi đó:

// modify bone update function to also update its world matrix 
// possibly do this only to skeletons you need it for, not for all bones 
var update = THREE.Bone.prototype.update; 
THREE.Bone.prototype.update = function(parentSkinMatrix, forceUpdate) { 
    update.call(this, parentSkinMatrix, forceUpdate); 
    this.updateMatrixWorld(true); 
}; 

// add noop update function to Object3D prototype 
// so any Object3D may be a child of a Bone 
THREE.Object3D.prototype.update = function() {}; 

// create buffalo ... 

// create a mesh and add it to some bone 
var mesh = new THREE.Mesh(new THREE.SphereGeometry(20), new THREE.MeshNormalMaterial()); 

var bone = buffalo.bones[5]; 
bone.add(mesh); 
+3

wow. câu trả lời như vậy. rất helpe. cảm ơn nhiều. wow – Gugis

8

Ba.js phiên bản 68 xử lý việc này ra khỏi hộp, nhưng khác đôi chút. Không yêu cầu thay đổi chức năng nội bộ.

Bây giờ, nó hoạt động như sau:

phân cấp xương hiện được tìm thấy trong con của SkinnedMesh.

Tìm xương trong danh sách trẻ em và chỉ cần đính kèm các đối tượng với nó:

player.children[0].add(testObj); 

Lưu ý: Nếu bạn có một hệ thống phân cấp xương (ví dụ như trong mô hình máy xay xuất khẩu của bạn) thì đây được thể hiện ở ba. js quá. Nếu bạn nhắm mục tiêu xương có xương bố mẹ, nó sẽ trông giống như sau:

player.children[0].children[1].add(testObj);