Bạn chỉ cần có để chuyển đổi tất cả các đỉnh để không gian màn hình và thực hiện một hộp bounding 2D từ họ:
function computeScreenSpaceBoundingBox(mesh, camera) {
var vertices = mesh.geometry.vertices;
var vertex = new THREE.Vector3();
var min = new THREE.Vector3(1);
var max = new THREE.Vector3(-1);
for (var i = 0; i < vertices.length; i++) {
var vertexWorldCoord = vertex.copy(vertices[i]).applyMatrix4(mesh.matrixWorld);
var vertexScreenSpace = vertexWorldCoord.project(camera);
min.min(vertexScreenSpace);
max.max(vertexScreenSpace);
}
return new THREE.Box2(min, max);
}
Kết quả là Box2 là ở tọa độ màn hình bình thường [-1, 1]. Bạn có thể nhận được các điểm ảnh bằng cách nhân với một nửa chiều cao và chiều rộng của renderer của bạn:
function normalizedToPixels(coord, renderWidthPixels, renderHeightPixels) {
var halfScreen = new THREE.Vector2(renderWidthPixels/2, renderHeightPixels/2)
return coord.clone().multiply(halfScreen);
}
Xem một cuộc biểu tình của nó ở đây: http://jsfiddle.net/holgerl/6fy9d54t/
EDIT: Giảm sử dụng bộ nhớ trong vòng lặp bên trong bằng cách gợi ý từ @WestLangley
Nguồn
2017-08-25 10:06:37
Điều này nghe có vẻ như là một thử thách tốt. Đối tượng hoặc máy ảnh có được hoạt ảnh không? Nếu vậy, bạn có cần tính toán không gian màn hình nó chiếm một lần cho mỗi khung không? – Marquizzo
Có, và tôi rất ngạc nhiên khi nó chưa được thực hiện. Cả hai đều có thể hoạt hình, nhưng tôi có một ý tưởng. Brb. – vaid