6

Tôi tự hỏi làm thế nào để có thể viết một thuật toán chính xác để tính toán biên giới của bề mặt giao nhau giữa một bề mặt tham số f : R^2 --> R^3 và lưới tam giác.Giao điểm của lưới có bề mặt tham số

Tôi đã nghĩ đến một cách tiếp cận thứ nhất:

nStepsU = 100 
nStepsV = 100 
tolerance=0.01 // pick some sensical value 
intersectionVertices={} 
for u from minU to maxU in nStepsU: 
    for v from minV to maxV in nStepsV: 
     for v in verticesInMesh: 
      if euclidean distance(f(u,v), v) < tolerance: 
       add vertex v in a set 

connect the vertices in intersectionVertices with a line strip 
draw the vertices in intersectionVertices 

thuật toán này, rất đơn giản nhưng chậm (n^3) và không giữ trong tài khoản đó địa hình của lưới được dựa trên hình tam giác để các điểm đầu ra là các điểm của lưới và không phải là điểm tính toán khai thác giao điểm của bề mặt với các hình tam giác và phụ thuộc nhiều vào sự khoan dung mà ta phải đặt ra.

Có ai đó có ý tưởng hay hơn hoặc có thể đưa tôi đến một thư viện phù hợp cho mục đích này không?

+1

Bạn có bất kỳ thông tin bổ sung nào về bề mặt không? Bạn có thể dự án hiệu quả không? Bạn có thể tìm thấy hiệu quả ở phía nào của nó một điểm không? – maxim1000

+0

Bề mặt là một helicoid 'x (r, theta) = r * cos (theta)', 'y (r, theta) = theta',' z (r, theta) = r * sin (theta) 'như vậy là không thể phân biệt được bên trong và bên ngoài – linello

+0

Ồ, đúng vậy. Vì vậy, câu trả lời của tôi là không chính xác tại chỗ trên. Nhưng bạn vẫn có thể xác định theta và r từ (x, y, z) và tính toán khoảng cách đã ký từ đó. Những gì tôi không rõ ràng về mặc dù là, làm thế nào chính xác bạn mong đợi này được? Điều gì xảy ra nếu một tam giác giao nhau với bề mặt nhiều lần theo hướng y? –

Trả lời

3

Tôi sẽ lặp qua từng hình tam giác và tính toán giao điểm của hình tam giác với bề mặt. Tôi sẽ sử dụng một shader hình học mà có hình tam giác như đầu vào, và đầu ra dải dòng. Đối với mỗi đỉnh trong tam giác, tính toán khoảng cách đã ký với bề mặt. Sau đó lặp lại qua các cạnh: Nếu có hai đỉnh nơi h có các dấu hiệu khác nhau, cạnh giữa các đỉnh này giao nhau với bề mặt. Trong khi tôi chắc chắn ngã tư chính xác có thể được tính toán, giải pháp đơn giản nhất sẽ được nội suy tuyến tính, ví dụ:

vec3 intersection = (h0 * v1 + h1 * v0)/(h0 + h1); 

Sau đó, sản lượng mỗi ngã tư như một đỉnh của đoạn thẳng của bạn.

Mã tôi đã đăng here có thể giúp bạn bắt đầu. Nếu bạn muốn vẽ kết quả, có thể bạn sẽ gặp phải vấn đề tương tự mà tôi đã mô tả trong câu hỏi đó. Nếu bạn cần các đỉnh trên máy khách, bạn có thể sử dụng transform feedback.

Chỉnh sửa: Tôi vừa làm một bài kiểm tra nhỏ. Như chức năng khoảng cách tôi đã sử dụng

float distToHelicoid(in vec3 p) 
{ 
    float theta = p.y/5 + offset.x/50; 
    float a = mod(theta - atan(p.z, p.x), 2*PI) - PI; // [-PI, PI[ 
    if (abs(a) > PI/2) 
    a = mod(theta - atan(-p.z, -p.x), 2*PI) - PI; 
    return a; 
} 

Vì không có bên trong/bên ngoài, và chức năng khoảng cách này đi từ -90 ° đến 90 °, bạn chỉ có thể phát ra các đỉnh nếu dấu hiệu đi từ nhỏ đến tiêu cực nhỏ tích cực hay ngược lại, không phải khi nó lật từ 90 ° đến -90 °. Ở đây tôi chỉ đơn giản là lọc ra khoảng cách nơi abs (quận)> 45 °:

enter image description here

Cách sạch sẽ là để xác định các chỉ số của các cuộc cách mạng gần nhất. Ví dụ. [-pi, pi] sẽ là cuộc cách mạng 0, [pi, 3pi] = cuộc cách mạng 1, v.v. Sau đó, bạn sẽ chỉ phát ra nếu hai khoảng cách tham chiếu đến cùng một cuộc cách mạng.

+0

Tôi thích cách tiếp cận của bạn, điều duy nhất ở đây là tôi cần nghiên cứu tốt hơn các shaders hình học vì tôi luôn thấy chúng rất phức tạp để hiểu. Tôi cũng nghĩ rằng, để giảm độ phức tạp khi sử dụng một đổ bóng đỉnh tùy chỉnh để tô màu cho đỉnh mà trong đó điều kiện lân cận được coi là màu đỏ. Bạn có bất kỳ liên kết tốt nào có tài liệu về cách tải hình tam giác lên hình bóng đổ không? – linello

+0

Trình đổ bóng hình học lấy đầu vào của nó từ trình đổ bóng đỉnh, do đó bạn không phải làm bất cứ điều gì khác với những gì bạn thường làm. Thay vì chương trình đổ bóng + đổ bóng bình thường của bạn, bạn cũng chỉ đính kèm một hình đổ bóng hình học. Sau đó sử dụng chương trình như mọi khi và vẽ hình học của bạn. Vì vậy, nó thực sự rất dễ dàng để tích hợp. Xem [ở đây] (http://www.opengl.org/wiki/Geometry_Shader) để biết cách nó phù hợp với đường ống. –

+0

@linello Tôi đã thêm chức năng khoảng cách cho helicoid. –

1

Nếu bề mặt của bạn luôn luôn là helicoid, bạn có thể thử để chiếu tất cả mọi thứ trên một xi lanh quanh trục Y.

Bề mặt của helicoid gồm đường vuông góc với bề mặt của hình trụ đó và sau khi chiếu bạn sẽ nhận được một xoắn ốc . Sau khi chiếu lưới tam giác 3D vào hình trụ đó, bạn sẽ nhận được lưới tam giác 2D (lưu ý rằng một số khu vực có thể được phủ một vài lớp hình tam giác).

Vì vậy, nhiệm vụ trở nên tìm hình tam giác trong lưới tam giác 2D giao nhau với hình xoắn ốc đơn giản hơn. Nếu bạn đồng ý với xấp xỉ, bạn có thể phân đoạn xoắn ốc đó và sử dụng một số loại cây để tìm hình tam giác giao nhau với hình xoắn ốc.

Khi bạn có một hình tam giác giao cắt một phần của hình xoắn ốc, giao lộ của nó sẽ là một đoạn, bạn có thể tính toán lại tọa độ 3D của phân đoạn và tập hợp các phân đoạn này là đường giao nhau của bạn.