2009-06-23 105 views
9

Làm thế nào tôi có thể vẽ đường cong Hermite bằng OpenGL, có bất kỳ chức năng tích hợp nào không? Tôi thấy một số ví dụ trên mạng cho thấy làm thế nào để sử dụng đánh giá để vẽ đường cong Bezier nhưng không thể tìm thấy bất kỳ thông tin cho các đường cong Hermite.Vẽ đường cong Hermite trong OpenGL

Trả lời

1

Bạn có thể chuyển đổi bất kỳ đường cong Hermite nào thành đường cong Bezier và sau đó vẽ đường cong đó. Chúng được định nghĩa đơn giản bằng cách sử dụng hai cơ sở khác nhau trong C3. Google không phải là rất hữu ích, và có vẻ như đây sẽ là một câu hỏi phổ biến, vì vậy chúng tôi nên cố gắng làm cho câu trả lời StackOverflow dứt khoát, có thể với một số mã mẫu. Tôi sẽ trở lại vào ngày mai với nhiều hơn nữa.

6

Như Steven đã đề cập, bạn có thể chuyển đổi đường cong khối Hermite thành đường cong Bezier khối. Nó thực sự khá đơn giản.

Một đường cong Hermite khối điển hình được xác định với hai điểm và hai vectơ:

  • P0 - bắt đầu điểm
  • V0 - phái sinh tại P0
  • P1 - điểm cuối
  • V1 - phái sinh tại P1

Sự chuyển đổi sang một Bezier khối đơn giản là:

B0 = P0 
B1 = P0 + V0/3 
B2 = P1 - V1/3 
B3 = P1 

Sau đó bạn có thể vẽ đường cong Bezier của bạn sử dụng và đánh giá hoặc bất kỳ cách nào khác mà bạn muốn.

11

Để vectơ của điểm kiểm soát cho Bezier của bạn là [b0 b1 b2 b3] và đối với Hermite của bạn là [h0 h1 v0 v1] (v0 và v1 là đạo hàm/tiếp tuyến tại điểm h0 và h1). Sau đó, chúng ta có thể sử dụng một dạng ma trận để hiển thị các chuyển đổi:

Hermite để Bezier

 
[b0] = 1 [ 3 0 0 0] [h0] 
[b1] - [ 3 0 1 0] [h1] 
[b2] 3 [ 0 3 0 -1] [v0] 
[b3]  [ 0 3 0 0] [v1] 

(đây là chính xác như trong phản ứng Naaff của, ở trên).

Bezier để Hermite

 
[h0] = [ 1 0 0 0] [b0] 
[h1] [ 0 0 0 1] [b1] 
[v0] [-3 3 0 0] [b2] 
[v1] [ 0 0 -3 3] [b3] 

Vì vậy, trong ma trận hình thành những có lẽ hơi phức tạp hơn cần thiết (sau khi mã tất cả của Naaff là ngắn và đến điểm). Nó rất hữu ích, bởi vì chúng ta có thể vượt qua Hermites rất dễ dàng ngay bây giờ.

Đặc biệt, chúng ta có thể mang theo đường cong tham số hình khối cổ điển khác: đường cong Catmull-Rom. Nó có các điểm điều khiển [c_1 c0 c1 c2] (không giống như các đường cong Bezier, đường cong chạy từ điểm thứ hai đến điểm kiểm soát thứ ba, do đó đánh số thông thường từ -1). Quá trình chuyển đổi để Bezier là sau đó:

Catmull-Rom để Bezier

 
[b0] = 1 [ 0 6 0 0] [c_1] 
[b1] - [-1 6 1 0] [c0] 
[b2] 6 [ 0 1 6 -1] [c1] 
[b3]  [ 0 0 6 0] [c2] 

Bezier để Catmull-Rom

 
[c_1] = [ 6 -6 0 1] [b0] 
[c0] [ 1 0 0 0] [b1] 
[c1] [ 0 0 0 1] [b2] 
[c2] [ 1 0 -6 6] [b3] 

tôi có thể làm các Hermite để cặp Catmull-Rom quá, nhưng chúng hiếm khi được sử dụng, vì Bezier thường là biểu diễn chính.

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