Làm cách nào để bẻ cong một đối tượng trong OpenGL?


11

Có cách nào người ta có thể bẻ cong một vật thể, như hình trụ hoặc mặt phẳng bằng OpenGL không?

Tôi là người mới bắt đầu OpenGL (Tôi đang sử dụng OpenGL ES 2.0, nếu điều đó quan trọng, mặc dù tôi nghi ngờ, toán học là vấn đề quan trọng nhất trong trường hợp này, vì vậy, bằng cách nào đó độc lập với phiên bản), tôi hiểu các khái niệm cơ bản: dịch, xoay, biến đổi ma trận, v.v. . Tôi đã tự hỏi nếu có một kỹ thuật cho phép bạn thực sự thay đổi hình dạng của các đối tượng của bạn (trong trường hợp này bằng cách uốn cong chúng)?

Bất kỳ liên kết, hướng dẫn hoặc tài liệu tham khảo khác được hoan nghênh!

Câu trả lời:


11

Những gì bạn cần làm để "bẻ cong" một đối tượng là áp dụng một số kết hợp dịch / xoay / chia tỷ lệ thích hợp cho chỉ một số tập hợp con của các đối tượng trong câu hỏi - có thể là trọng số của phép biến đổi đó.

Làm điều này là một thời trang dễ chịu sẽ cần phải sử dụng nhiều đỉnh hơn có thể rất cần thiết để mô tả lưới ban đầu. Ví dụ, một hình trụ đơn giản có thể chỉ có các đỉnh ở hai đầu, nhưng nếu bạn muốn hình trụ đó uốn cong ở giữa, bạn cũng sẽ cần các đỉnh ở đó.

Nếu tất cả những gì bạn quan tâm là rất cụ thể, biến dạng một lần của các hình dạng rất đơn giản (như mặt phẳng đã nói ở trên), bạn có thể chỉ cần làm điều này bằng tay. Ví dụ: quyết định "trục uốn" cho mặt phẳng của bạn và tính toán các phép biến đổi phù hợp cho từng hàng của mặt phẳng để đạt được góc xoay thích hợp về trục uốn đó tùy thuộc vào khoảng cách của chúng, và sau đó áp dụng điều đó cho hình học (có thể trên CPU vì nó sẽ là đơn giản nhất, ít nhất là ban đầu). Nhưng một kỹ thuật như vậy sẽ không có quy mô tốt và sẽ rất tẻ nhạt.

Vì nó có thể rất phức tạp để tìm ra chính xác làm thế nào để cân trọng lượng biến đổi cho từng đỉnh riêng lẻ trong một tập hợp để đạt được biến dạng mong muốn (đặc biệt đối với các đối tượng thực tế và phức tạp hơn), nhiều trò chơi sử dụng một kỹ thuật gọi là hoạt hình xương . Ở cấp độ cao, điều này liên quan đến việc liên kết một tập hợp hình học riêng biệt ("bộ xương") với lưới của bạn. Hình học đó đại diện cho xương của đối tượng của bạn và bạn xác định (thường là trong các công cụ mô hình hóa) ánh xạ giữa các đỉnh của mô hình thực và xương của bộ xương - xương nào được liên kết với mỗi đỉnh và xương đó ảnh hưởng đến biến dạng đến mức nào của đỉnh đó. Sau đó bộ xương được hoạt hình trực tiếp và hoạt hình được chuyển sang mô hình thực thông qua mối quan hệ giữa xương và các đỉnh của chúng.

Thông thường trong kỹ thuật này, ánh xạ giữa khung xương và lưới thực được xác định tại thời điểm sản xuất tài sản. Các hình ảnh động cũng có thể được xây dựng sau đó, hoặc chúng có thể được xây dựng theo thủ tục khi chạy. Việc áp dụng các phép biến đổi hình ảnh động vào lưới thực xảy ra trong thời gian chạy. Nói chung không có đỉnh mới nào được tạo trong thời gian chạy, điều đó có nghĩa là phạm vi biến dạng đẹp mắt được cố định hoàn toàn trong lưới khi nó được tạo ban đầu.

Về lý thuyết, người ta cũng có thể áp dụng phân chia và phân chia cho lưới trong thời gian chạy dựa trên phân tích các biến đổi trong hoạt hình, và do đó tạo ra các đỉnh thích hợp để tạo ra một hình ảnh động không nhất thiết phải được lên kế hoạch. Tôi không biết, bất kỳ giấy tờ nào về chủ đề này.

Xem thêm:


9

Đối với toán học cong vênh thực tế, điều này có thể trở nên rất phức tạp, tại sao bạn không bắt đầu ở đây? .

Bây giờ tôi sẽ nói về cách bạn có thể áp dụng điều này, giả sử bạn đã có toán cho cách bạn sẽ làm biến dạng của bạn xuống.

2 cách:

1) Mỗi ​​khung hình, truy cập mọi đỉnh trong mô hình hình trụ và bù nó theo một cách nào đó.

2) Bù đắp các đỉnh trong shader đỉnh như bạn đang kết xuất. OpenGL ES 2.0 hỗ trợ trình tạo bóng đỉnh. Vì vậy, bạn đang gặp may mắn.

Bạn có muốn chỉ làm cong vênh đối tượng khi nó xuất hiện trên màn hình , hay bạn muốn làm cong vênh đối tượng để mọi đối tượng trong trò chơi biết rằng nó đã bị biến dạng?

Nếu bạn làm cong đối tượng trong shader đỉnh, thì điều đó chỉ xảy ra ngay trước khi hiển thị / rasterization , vì vậy điều này có nghĩa là không ai trong số các đối tượng trò chơi sẽ biết về biến dạng . Điều này tốt nếu bạn chỉ đơn giản là thực hiện một trình bảo vệ màn hình hoặc nếu các biến dạng quá nhỏ đến mức chúng không có tác động đến hình dạng có thể va chạm của vật thể.

Khi bạn làm cong hình học trong shader đỉnh, các đỉnh ban đầu của mô hình thực sự không di chuyển , (chúng chỉ xuất hiện để di chuyển ).

Biến dạng trong shader đỉnh

Không định dạng:

không biến dạng

Biến dạng

biến dạng

Đây là từ chương 6 của hướng dẫn cg , (chương trình # 14).

Mã shader để tạo ra biến dạng này là một cái gì đó như

// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;

// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;

// move the vertex
float4 newPosition = position + displacement * displacementDirection ;

// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;

Vì vậy, bạn có thể thấy, điều này xảy ra hiển thị RIGHT BEFORE (shader đỉnh xảy ra trên GPU) vì vậy mã CPU thực tế không có cách nào để truy cập vị trí đỉnh đã chuyển đổi (có nhiều cách để gửi dữ liệu từ GPU đến CPU (chủ yếu thông qua kết cấu) nhưng chúng tôi sẽ không đến đó).


8

Những gì bạn đang cố gắng đạt được về cơ bản là một tập hợp con của chủ đề biến dạng lưới. Nhưng vì bạn là người mới bắt đầu, tôi sợ loại thông tin này có thể hơi lạ cho đến bây giờ. Tôi sẽ cố gắng đặt ra các khái niệm cơ bản mặc dù.

Để làm điều này, bạn sẽ cần hai điều:

  1. Lưới của bạn cần có đủ các đỉnh để bạn biến đổi. Chẳng hạn, nếu đó là một mặt phẳng, bạn sẽ cần đảm bảo rằng nó thực sự được tạo ra như một dạng lưới, với nhiều đỉnh để bạn biến dạng. Điều tương tự với một xi lanh. Có thể đạt được điều này trong thời gian chạy với tessname nhưng tôi không biết nhiều về chủ đề này.
  2. Bạn cần sử dụng một shader đỉnh để làm biến dạng các đỉnh. Về cơ bản, trình tạo bóng đỉnh sẽ đảm nhiệm việc tính toán vị trí biến đổi cuối cùng của mỗi đỉnh, vì vậy bạn có thể có cơ hội áp dụng bất kỳ biến dạng nào cho chúng.

Tôi không chắc nó sẽ hữu ích như thế nào, nhưng hãy xem tài nguyên OpenGL này, vì nó có vẻ đúng với thứ bạn cần:

http://www.ozone3d.net/tutorials/mesh_deformer_p3.php#part_3

Ảnh chụp màn hình từ liên kết đó:

nhập mô tả hình ảnh ở đây

Biên tập

Chỉ cần nhìn thấy câu trả lời của Josh và tôi đồng ý, hoạt hình xương cũng là một cách rất thanh lịch để gói gọn vấn đề này, đặc biệt là khi các biến dạng của bạn bắt đầu trở nên phức tạp hơn và khó diễn đạt hơn về mặt toán học.

Nhưng hãy nhớ rằng, cả hai điểm trên vẫn được áp dụng - bạn chỉ có thể biến dạng các đỉnh, vì vậy rõ ràng chúng cần tồn tại ở vị trí đầu tiên, đó là lý do tại sao lưới của bạn cần phải có mật độ đỉnh khá. Và nó thường là shader đỉnh điều khiển hoạt hình của bộ xương và pha trộn đỉnh và như vậy.

Và nhân tiện, bạn cũng có thể thực hiện những điều này trên CPU, nhưng ngày nay, nó thường là một lựa chọn tốt hơn để thực hiện chúng trên GPU, đó là lý do tại sao tôi nhấn mạnh vào trình tạo bóng đỉnh và bạn nên xem xét nó. Dù sao thì nó cũng không thực sự khó hơn nhiều so với thực hiện trên CPU.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.