2017-02-22 37 views
5

Tôi đang làm việc với Three.js. Tôi có một bộ sưu tập gồm Điểm 3D (x, y, z) và một bộ sưu tập các khuôn mặt. Một mặt bao gồm K điểm. Nó cũng có thể lồi lõm. Tôi không tìm thấy gì có thể giúp tôi trong tài liệu Three.js. Một giải pháp có thể là để triangulate những hình dạng, nhưng cho đến nay tôi đã không tìm thấy bất kỳ thuật toán tam giác 3D đơn giản.Triangulation các điểm 3D với K đỉnh mỗi mặt

Các giải pháp khác sẽ làm một cái gì đó như thế:

var pointsGeometry = new THREE.Geometry(); 

pointsGeometry.vertices.push(new THREE.Vector3(10, 0, 0)); 
pointsGeometry.vertices.push(new THREE.Vector3(10, 10, 0)); 
pointsGeometry.vertices.push(new THREE.Vector3(0, 10, 0)); 
pointsGeometry.vertices.push(new THREE.Vector3(1, 3, 0)); 
pointsGeometry.vertices.push(new THREE.Vector3(-1, 3, 0)); 
pointsGeometry.vertices.push(new THREE.Vector3(10, 0, 0)); 

var material = new THREE.MeshBasicMaterial({color: 0x00ff00}); 

var mesh = new THREE.Shape/ShapeGeometry/Something(pointsGeometry, material); 
group.add(mesh); 

scene.add(group); 

Tôi có rất nhiều những hình dạng mà cùng nhau xây dựng một mặt kín.

Bất kỳ đề xuất nào?

Cảm ơn sự quan tâm của bạn. Chúc một ngày tốt đẹp.

Trả lời

3

Như bạn chỉ ra, có 2 cách để đạt được điều đó:

  • sử dụng một thuật toán tam giác 3D (không được cung cấp bởi Three.js);
  • sử dụng thuật toán triangulation 2D thường được sử dụng cho các đối tượng Three.js Shape với một số phép biến đổi được áp dụng trên mỗi khuôn mặt của hình.

Điều cuối cùng có vẻ thú vị nhưng không may, như tôi đã thử, tôi nhận ra nó không phải là tầm thường. Tôi đã đưa ra một cái gì đó tương tự như những gì Paul-Jan nói:

Đối với mỗi mặt của hình học của bạn:

  1. Tính trọng tâm mặt;
  2. Tính toán khuôn mặt bình thường;
  3. Tính toán ma trận khuôn mặt;
  4. Chiếu các điểm 3D lên mặt phẳng 2D của khuôn mặt;
  5. Tạo hình học (triangulated bằng thuật toán triangulation Shape);
  6. Áp dụng ma trận đối mặt với các hình học mới được tạo ra
  7. Tạo một Mesh và thêm nó vào một Object3D (Tôi cố gắng để kết hợp tất cả các hình học vào 1, nhưng nó không thành công với các ShapeBufferGeometry)

Kiểm tra this fiddle .

Hãy cẩn thận với winding order các đỉnh của bạn hoặc đặt THREE.Material.side đến THREE.DoubleSide để tránh bị loại bỏ khuôn mặt.

+0

Tôi đã biết rằng các điểm là đồng phẳng, vì vậy tôi có thể dễ dàng tính toán bình thường của mặt phẳng, chiếu mặt phẳng và các điểm vào mặt phẳng X, Y. Tôi đã có một thuật toán triangulation 2D riêng. sau đó tôi không cần phải đảo ngược các điểm đến mặt phẳng trước đó, bởi vì tôi chỉ cần thứ tự của chúng, Sau đó, với thứ tự các điểm tôi có thể dễ dàng tạo thành các hình tam giác và gửi chúng đến ba.js. (Có vẻ như tôi không thể gắn thẻ bạn) nhưng cảm ơn và bản demo là tuyệt vời, tôi sẽ kiểm tra nó với dữ liệu của tôi và xem nó có phù hợp với hệ thống của tôi không :) – Swisx

1

Tôi nghĩ bạn có thể muốn truy cập lại tài liệu Three.js và đối tượng Shape nói riêng. Mã mẫu trên trang đó sử dụng bezierCurveTo, nhưng nếu bạn sử dụng lineTo thay vào đó bạn có thể cho nó chuỗi các điểm của bạn và tạo đa giác lõm (bao gồm cả lỗ).

+1

OP phải xử lý điểm 3D, nhưng thuật toán triangulation của Three.js Shape] (https://github.com/neeh/three.js/blob/dev/src/extras/ShapeUtils.js) làm việc với các điểm 2D.Một phép biến đổi là cần thiết cho mỗi mặt của đa giác trước khi chuyển tới 'Hình dạng'. – neeh

+0

Ah, điểm tốt. Tôi đã dưới sự biểu hiện rằng bạn chỉ có thể ăn nó điểm 3D và mọi thứ sẽ làm việc tự động, nhờ sự điều chỉnh! Bây giờ bạn sẽ phải đầu tiên dự đoán các điểm của mỗi khuôn mặt trên mặt phẳng của riêng mình và biến hình dạng trở lại hướng chính xác sau đó. Không phải là rất thực tế cho một số lượng không nhỏ của khuôn mặt. –

+0

@ Paul-Jan cảm ơn rất nhiều câu trả lời, vâng, thật đáng buồn là nó không hoạt động với điểm 3d. Sau đó tôi đã đưa ra kết luận tương tự. – Swisx

Các vấn đề liên quan