2009-04-23 54 views
6

Từ câu hỏi cuối cùng của tôi: Marching Cube Question
Thực hiện Thuật toán Cube Marching?

Tuy nhiên, tôi vẫn chưa rõ ràng như trong:

  1. làm thế nào để tạo ra tưởng tượng khối/voxel để kiểm tra xem một đỉnh nằm dưới isosurface?
  2. làm thế nào để tôi biết đỉnh nào dưới mặt đồng vị?
  3. mỗi khối/voxel xác định khối lập phương/mặt nào để sử dụng?
  4. cách vẽ bề mặt bằng cách sử dụng dữ liệu trong triTable?

Giả sử tôi có dữ liệu đám mây điểm của quả táo.
làm cách nào để tôi tiếp tục?

có ai quen thuộc với Marching Cube giúp tôi không?
tôi chỉ biết C++ và opengl. (C là một chút ra khỏi bàn tay của tôi)

Trả lời

1

1) Nó phụ thuộc vào việc thực hiện yoru. Bạn sẽ cần phải có một cấu trúc dữ liệu, nơi bạn có thể tra cứu các giá trị ở mỗi góc (đỉnh) của voxel hoặc khối lập phương. Đây có thể là hình ảnh 3D (ví dụ: kết cấu 3D trong OpenGL) hoặc có thể là cấu trúc dữ liệu mảng tùy chỉnh hoặc bất kỳ định dạng nào khác mà bạn muốn.

2) Bạn cần kiểm tra các đỉnh của hình lập phương. Có những tối ưu hóa khác nhau về điều này, nhưng nói chung, bắt đầu với góc đầu tiên, và chỉ cần kiểm tra các giá trị của tất cả 8 góc của khối lập phương.

3) Thuật toán (nhanh) nhất tạo bitmask để sử dụng làm bảng tra cứu thành một mảng tĩnh các tùy chọn. Chỉ có rất nhiều lựa chọn có thể cho việc này.

4) Khi bạn đã tạo hình tam giác từ triTable, bạn có thể sử dụng OpenGL để hiển thị chúng.

Giả sử tôi có dữ liệu đám mây điểm của quả táo. làm thế nào để tôi tiến hành?

Điều này sẽ không hoạt động với hình khối hành quân. Các khối lập kế hoạch yêu cầu dữ liệu voxel, vì vậy bạn cần sử dụng một số thuật toán để đưa đám mây điểm dữ liệu vào một ổ đĩa khối. Gaussian Splatting là một tùy chọn ở đây.

Thông thường, nếu bạn đang làm việc từ một đám mây điểm, và muốn xem bề mặt, bạn nên xem xét các thuật toán tái tạo bề mặt thay vì các hình khối hành quân.

Nếu bạn muốn tìm hiểu thêm, tôi khuyên bạn nên đọc một số sách về kỹ thuật trực quan hóa. Một điều tốt là từ những người Kitware - The Visualization Toolkit.

Bạn có thể muốn xem VTK. Nó có triển khai C++ là Marching Cubes và có nguồn mở hoàn toàn.

+0

có thể 6 glQuads bằng voxel? nếu vậy, làm thế nào là xây dựng voxel reletive đến? điểm của tôi có phải là trung tâm của khối lập phương không? – noob88

+0

@ noob88: Không, không hẳn. "Khối lập phương" của bạn sẽ cần phải là một số đối tượng bao gồm 8 pionts. 6 glQuads có thể là khuôn mặt của khối lập phương/voxel, và các đỉnh bạn đang sử dụng có thể là 8 điểm của bạn. Tuy nhiên, tôi sẽ tạo một cấu trúc dữ liệu khác để giữ điều này. Một cái gì đó đơn giản như một mảng đa chiều hoạt động. –

+0

tôi thấy .. tôi nghĩ rằng tôi cần thời gian để kiểm tra nó ra 1, tôi có thể có liên lạc của bạn? Nếu tôi thêm một bình luận, nó sẽ hiển thị trong hồ sơ của tôi, và tôi có thể nhận được sự giúp đỡ của bạn .. – noob88

2

Trước hết, mặt đồng hồ có thể được biểu diễn theo hai cách. Một cách là có các siêu dữ liệu đẳng hướng và điểm trên mỗi điểm như một tập dữ liệu từ một nguồn bên ngoài. Đó là cách quét MRI. Cách tiếp cận thứ hai là tạo hàm F() ngầm định lấy một điểm/đỉnh làm tham số của nó và trả về một vô hướng mới.Hãy xem xét chức năng này:

float computeScalar(const Vector3<float>& v) 
{ 
    return std::sqrt(v.x*v.x + v.y*v.y + v.z*v.z); 
} 

Điều này sẽ tính toán khoảng cách từ điểm đến điểm gốc cho mọi điểm trong trường vô hướng của bạn. Nếu isovalue là bán kính, bạn chỉ cần tìm một cách để đại diện cho một hình cầu. Điều này là do | v | < = R là đúng cho tất cả các điểm bên trong một quả cầu, hoặc sống trên nội thất của nó. Chỉ cần tìm ra các đỉnh nằm bên trong hình cầu và những đỉnh nào ở bên ngoài. Bạn muốn sử dụng các toán tử nhỏ hơn hoặc lớn hơn vì khối lượng chia không gian thành hai. Khi bạn biết những điểm nào trong khối lập phương của bạn được phân loại là bên trong và bên ngoài, bạn cũng biết các cạnh nào của mặt cắt giao cắt. Bạn có thể kết thúc với tất cả mọi thứ từ không có tam giác đến năm hình tam giác. Vị trí của các đỉnh lưới có thể được tính toán bằng cách nội suy qua các cạnh giao nhau để tìm điểm giao nhau thực tế.


Nếu bạn muốn đại diện cho tiếng nói một quả táo với trường vô hướng, bạn sẽ có cần phải lấy dữ liệu nguồn thiết để cắm vào ứng dụng của bạn, hoặc sử dụng một chức năng tiềm ẩn khá phức tạp. Tôi khuyên bạn nên nhận các hình thức sơ cấp hình học đơn giản như hình cầu và tori để làm việc trước, và sau đó mở rộng từ đó.

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