2009-12-01 30 views
12

Tôi đang tạo trình kết xuất bằng OpenGL. Tôi có các mô hình kết cấu trong Blender/Sketchup (tôi có thể trao đổi giữa hai cách dễ dàng) và tôi muốn có thể xuất các tệp đó vào trình kết xuất của tôi. Ý tưởng ban đầu của tôi là chỉ cần xuất khẩu các khuôn mặt thô và làm cho các hình tam giác đó, nhưng tôi cũng muốn dễ dàng cắt các tệp kết cấu của tôi thành các tọa độ kết cấu.Sử dụng Mô hình Máy xay sinh tố/SketchUp trong OpenGL

Bằng cách đó, tôi có nghĩa là khuôn mặt mô hình của tôi được khắc vào hình tam giác. Bạn có thể thấy trong this image (được sao chép dưới đây) mà đường cong của tôi trở thành 24 hình tam giác. Tôi muốn biết tọa độ kết cấu nào để sử dụng cho mỗi tam giác.

Polygonized curved 3D object

Tệp DAE có phải là cách dễ nhất để làm điều đó không? Tôi đã đọc các thông số kỹ thuật cho định dạng và có vẻ dễ dàng đủ. Tôi nghĩ rằng tôi có thể phân tích cú pháp XML và tái tạo trung thực các mô hình trong OpenGL. Tôi đang tự hỏi nếu có một cách dễ dàng hơn (tức là một trong đó không sáng tạo lại bánh xe).

+0

Bạn có thể xây dựng trên những gì bạn có ý nghĩa bởi "Tôi muốn dễ dàng cắt các tệp kết cấu của tôi thành các tọa độ kết cấu" –

+0

Điều chắc chắn! Đã chỉnh sửa bài đăng gốc của tôi. – mkenyon

+2

Câu hỏi với quy tắc hình ảnh, vì vậy tôi đã tự do thêm bạn. – unwind

Trả lời

12

Nếu bạn thấy thoải mái khi phân tích cú pháp định dạng .dae, hãy sử dụng nó. Tuy nhiên, nếu bạn chỉ quan tâm đến việc xuất khẩu các lưới tam giác kết cấu, tôi sẽ xem xét việc sử dụng .obj format mà đơn giản hơn nhiều để phân tích cú pháp. Từ những gì tôi có thể nói cả Sketchup và Blender có thể xuất định dạng này.

+0

Điều đó giống như một cách đơn giản hơn để thể hiện cùng một dữ liệu. Tôi sẽ xem xét định dạng OBJ tối nay. – mkenyon

+1

Tôi muốn bạn biết rằng OBJ (và các tệp MTL tương ứng) hoạt động tốt. Cảm ơn bạn rất nhiều! – mkenyon

+0

Bạn được chào đón! –

1

Bất kỳ định dạng tệp phong phú nào được sử dụng bởi các chương trình tạo mô hình (chẳng hạn như Máy xay sinh tố hoặc Sketchup) sẽ bao gồm tất cả thông tin cần thiết để tạo lại hình bạn nhìn thấy. Điều này nên bao gồm loại hình học (ví dụ: dải tam giác, hình tam giác riêng lẻ, v.v.), các đỉnh và tiêu chuẩn cho hình học, các đặc tính vật liệu được sử dụng và cả các kết cấu được sử dụng cùng với tọa độ kết cấu phù hợp. Nếu bất kỳ thứ gì thiếu định dạng tệp tiềm năng, hãy chọn một định dạng khác. Nếu bạn nghĩ rằng phân tích cú pháp XML là đơn giản, thì tôi hy vọng bạn đang lập kế hoạch sử dụng các thư viện hiện có để thực hiện việc này, chẳng hạn như người nước ngoài, Xerces hoặc một số triển khai cụ thể về ngôn ngữ khác.

Khi xem xét xuất/nhập, trước tiên hãy thử tìm thư viện nguồn mở có thể xử lý việc nhập cho bạn và cung cấp dữ liệu cho chương trình của bạn ở định dạng hợp lý. Nếu không có sẵn và bạn phải viết nhà nhập khẩu của riêng mình, hãy thử tìm một ASCII đơn giản (không phải dựa trên XML) hoặc định dạng nhị phân phù hợp với nhu cầu của bạn. PLY có thể phù hợp. Chỉ như một phương sách cuối cùng, tôi khuyên bạn nên cố gắng triển khai một nhà nhập khẩu cho một định dạng dựa trên XML.

+0

Tôi đã từng làm việc trên các ứng dụng web trước đây; Tôi biết đủ để không làm phân tích cú pháp XML của riêng tôi. Nó sẽ được thông qua một thư viện. – mkenyon

2

Nếu bạn muốn phân tích các tệp .dae, tôi khuyên bạn nên xem xét các trình phân tích cú pháp Collada. .dae thực sự là phần mở rộng cho các tệp Collada, nỗ lực mới nhất từ ​​Khronos group (người duy trì OpenGL) để có một định dạng tệp thống nhất duy nhất cho trao đổi dữ liệu 3D.

Đối với các phân tích cú pháp có sẵn, đây là những gì tôi đã đi qua:

  • collada-dom, việc thực hiện tham khảo. Như tên cho thấy, nó chỉ là một trừu tượng của cây XML.
  • FCollada, trừu tượng đẹp hơn. Tuy nhiên, dự án này đã chết trong gần hai năm, và, từ những gì tôi đã thu thập được, rất có thể chúng tôi sẽ không thấy bất kỳ cập nhật nào trong tương lai.
  • OpenCollada, một nỗ lực mới gần đây. Đã không thử nó, nhưng có một cộng đồng năng động đằng sau nó.

Điều đó đang được nói, nếu mục tiêu duy nhất của bạn là tải một đoạn hình học đơn giản với các đỉnh, tiêu chuẩn và tọa độ kết cấu, với định dạng tệp .obj có thể là cách nhanh hơn.

+0

Tôi muốn bạn biết rằng các tệp OBJ hoạt động tốt. Cảm ơn bạn rất nhiều! – mkenyon

0

Bạn nên có một cái nhìn tại địa chỉ:

http://sketchup.google.com/community/developers.html

Đội sketchup cung cấp một C++ COM máy chủ miễn phí. Sử dụng điều này, bạn có thể truy cập vào nhiều thông tin về tệp .skp.

Bạn sẽ có thể sử dụng máy chủ COM này để viết trình nhập .skp cho ứng dụng của bạn.

Bạn nên thử lấy tệp .tlb nếu có thể. Điều này sẽ cung cấp cho bạn quyền truy cập vào con trỏ thông minh, điều này sẽ đơn giản hóa nhà nhập khẩu của bạn (ứng dụng khách COM)

Tôi đã sử dụng SDK phiên bản 6 (bao gồm tệp tlb). Phiên bản hiện tại của SDK dường như không bao gồm tệp này.

người đăng một giải pháp (đối với các tập tin TLB thiếu) trên các diễn đàn phát triển: http://groups.google.com/group/su-sdk-fileshare/topics

5

Nếu định dạng nhị phân không scare bạn, tôi khuyên bạn nên viết một Blender & Sketchup plug-in và xuất khẩu hình học được nướng trước vào các mảng đỉnh được đóng gói.

Điều tuyệt vời về phương pháp này là không có chuyển đổi phân tích cú pháp hoặc loại trong ứng dụng của bạn. Mọi thứ đã sẵn sàng để được gửi tới GPU trong các bản sao bộ nhớ liền kề đơn giản. Tuyệt vời cho hình học tĩnh.

Một rút gọn xuất khẩu máy xay sinh tố trông giống như sau:


#!BPY 
import bpy, struct 
from Blender import * 

self.fh = open("MyFileName", "w") 
m = bpy.data.meshes["MyMeshName"] 
faces = m.faces 
for face in faces: 
    for (vertex, uv) in zip(face.verts, face.uv): 
     self.fh.write(struct.pack('<fff', *vertex.co)) # coords 
     self.fh.write(struct.pack('<fff', *vertex.no)) # normals 
     self.fh.write(struct.pack('<ff', uv.x, uv.y)) # uvs 

self.fh.close() 
1

Ngoài ra còn có: Lib3DS - http://www.lib3ds.org/ LibOBJ (sẽ không cho phép tôi gửi link)

+0

Thật thú vị! Tôi sẽ kiểm tra. – mkenyon

+0

@mkenyon Có lẽ cũng có rất nhiều thư viện mã nguồn mở trên toàn Github. – FracturedRetina

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