Cách chuyển đổi STL sang OBJ cho In 3D và Tạo mô hình
STL và OBJ: Sự khác biệt thực sự giữa hai định dạng này
STL và OBJ đều là những định dạng chủ chốt trong thế giới 3D, nhưng chúng không thể thay thế cho nhau. Chúng chứa các loại dữ liệu khác nhau, và việc biết được sự khác biệt sẽ cho bạn biết khi nào việc chuyển đổi là hữu ích và khi nào chỉ là việc làm vô nghĩa. Một file STL về cơ bản chỉ là hình học bề mặt—một lưới đơn giản gồm các mặt tam giác được mô tả bởi tọa độ đỉnh và vector pháp tuyến của chúng. Chỉ vậy thôi. Không màu sắc, không texture, không thuộc tính vật liệu. Định dạng này ra đời vào năm 1987 tại 3D Systems cho các máy in lập thể của họ, và bản chất tối giản của nó vừa là điểm mạnh vừa là điểm yếu lớn nhất. Một file STL điển hình cho một chi tiết cơ khí có thể có từ 50.000 đến 500.000 tam giác. Các file OBJ, được tạo bởi Wavefront Technologies vào cùng thời điểm, có khả năng mô tả nhiều hơn hẳn. Ngoài hình học, một file OBJ có thể trỏ đến một file MTL (Material Template Library) đi kèm để định nghĩa những thứ như màu sắc bề mặt, độ bóng, độ trong suốt và các bản đồ texture. OBJ cũng hỗ trợ các đa giác có nhiều hơn ba cạnh (tứ giác, n-giác) và thậm chí cả các đường cong tự do, mặc dù bạn hiếm khi thấy chúng trong thực tế. Nếu bạn chỉ in 3D, STL gần như luôn là tất cả những gì bạn cần. Sức mạnh thực sự của OBJ thể hiện trong việc kết xuất đồ họa (rendering), phát triển game, và bất kỳ quy trình nào mà hình thức trực quan là yếu tố quan trọng. Khi bạn chuyển một mô hình từ một phần mềm slicer vào Blender để chụp ảnh sản phẩm, hoặc gửi một tài sản đến một game engine như Unity, OBJ (hoặc những người anh em họ hiện đại của nó là FBX và GLTF) cung cấp cho các công cụ đó nhiều thứ để làm việc hơn là chỉ hình học thô. Cần phải nói rõ: việc chuyển đổi từ STL sang OBJ không tự động tạo ra dữ liệu màu sắc hay texture từ hư không một cách thần kỳ. Việc chuyển đổi chỉ bọc lại khối hình học tam giác đó trong một cái vỏ khác. Nếu bạn cần một mô hình có texture, bạn vẫn phải tự mình làm công việc gán texture trong một ứng dụng 3D sau khi chuyển đổi.
Khi nào bạn thực sự cần chuyển đổi STL sang OBJ
Đừng chuyển đổi nếu không thực sự cần thiết. Hãy chắc chắn rằng quy trình làm việc của bạn thực sự cần một file OBJ trước đã. Trong nhiều trường hợp, đó là một bước không cần thiết. Lý do phổ biến nhất để chuyển đổi rất đơn giản: khả năng tương thích phần mềm. Một số công cụ tạo mô hình và game engine, đặc biệt là những cái cũ, không hoạt động tốt với các file STL. Chúng có thể không nhập được file, hoặc có thể làm hỏng hình học, lật ngược các bề mặt. Ví dụ, trình nhập OBJ của Autodesk Maya trưởng thành và đáng tin cậy hơn nhiều so với hỗ trợ STL của nó. Nếu bạn đang đưa một bản quét hoặc một file xuất từ CAD vào Maya để tạo mô hình thêm, việc chuyển đổi sang OBJ trước là một bước đi chuyên nghiệp giúp bạn tránh được nhiều phiền phức. Các cụm lắp ráp nhiều bộ phận là một lý do tuyệt vời khác để chuyển sang OBJ. Hãy tưởng tượng bạn có một file STL của một vỏ cơ khí với hàng tá thành phần riêng biệt được hợp nhất thành một khối. Trong định dạng OBJ, bạn có thể định nghĩa các nhóm được đặt tên (sử dụng thẻ 'g') cho phép các phần mềm ở công đoạn sau chọn và thao tác với các bộ phận riêng lẻ đó. Đây là một cứu cánh trong Blender, nơi các nhóm OBJ được nhập vào một cách tiện lợi thành các đối tượng lưới riêng biệt. Các studio dựng hình và render farm thường yêu cầu OBJ vì các pipeline của họ được xây dựng xung quanh nó như một định dạng trao đổi cơ bản. Các công cụ như Houdini, Cinema 4D, và KeyShot 11 có thể mở một file OBJ và ngay lập tức bắt đầu áp dụng vật liệu. Trong khi đó, một file STL thường đòi hỏi một bước bổ sung để gán một vật liệu mặc định trước khi có thể bắt đầu bất kỳ công việc tô bóng thực sự nào. Cuối cùng, nếu bạn đang đặt một mô hình 3D lên một trang web bằng thư viện như Three.js, bạn sẽ thấy rằng OBJ được hỗ trợ rộng rãi trong khi STL thì không. Đối với các ứng dụng web và AR, OBJ là một điểm khởi đầu vững chắc trước khi bạn chuyển sang một định dạng được tối ưu hóa cho web như GLTF để sản xuất.
Cách chuyển đổi STL sang OBJ bằng CocoConvert
Sử dụng CocoConvert cho việc chuyển đổi này cực kỳ đơn giản và diễn ra ngay trên trình duyệt của bạn, vì vậy không cần cài đặt phần mềm. Nó hoạt động với các file lên đến 500 MB trên gói tiêu chuẩn. Đầu tiên, hãy truy cập trang chuyển đổi tại /convert/stl-to-obj. Bạn sẽ thấy một khu vực kéo-thả lớn. Bạn có thể kéo file STL của mình thẳng từ màn hình desktop hoặc nhấp để mở cửa sổ chọn file. Nó chấp nhận cả file STL nhị phân và ASCII, tự động nhận diện loại file bạn đã tải lên. Khi file được tải lên, một phân tích nhanh sẽ chạy, thường chỉ mất từ hai đến năm giây đối với các file dưới 50 MB. Đối với các lưới dày đặc trên 200 MB, sẽ mất nhiều thời gian hơn một chút. Sau đó, bạn sẽ thấy một bản tóm tắt về số lượng tam giác và kích thước file. Tại đây, bạn có một lựa chọn: download một file OBJ duy nhất, hoặc nhận một file lưu trữ ZIP với cả file OBJ và một file MTL cơ bản. Tôi khuyên bạn nên lấy file ZIP; file MTL nhỏ đó định nghĩa một vật liệu màu xám mặc định (Kd 0.8 0.8 0.8) và có thể ngăn chặn những cảnh báo 'thiếu vật liệu' phiền phức trong các ứng dụng khác. Nhấp vào Chuyển đổi, và file của bạn sẽ sẵn sàng trong vài giây. Một file STL nhị phân 150 MB với khoảng 2,8 triệu tam giác sẽ mất khoảng 25 đến 40 giây để xử lý. Bây giờ là một vài hạn chế thực tế. CocoConvert không thực hiện sửa chữa lưới trong quá trình chuyển đổi. Nếu file STL gốc của bạn là một mớ hỗn độn với các cạnh không liền mạch (non-manifold), lỗ hổng, hoặc pháp tuyến bị đảo ngược, file OBJ đầu ra cũng sẽ như vậy. Bất cứ ai đã từng vật lộn với một bản quét 3D lỗi đều biết rằng việc sửa chữa tự động là một bước riêng biệt, thường rất gian nan. Đối với việc đó, bạn sẽ cần một công cụ chuyên dụng như Microsoft 3D Builder hoặc Meshmixer. CocoConvert cũng không đơn giản hóa lưới; một file STL 500 MB khổng lồ sẽ trở thành một file OBJ khổng lồ. Nếu bạn cần một file nhỏ hơn, bạn sẽ cần phải giảm lưới (decimate) nó trong một công cụ như Blender trước hoặc sau khi chuyển đổi.
Các phương pháp thay thế: Blender, MeshLab, và các công cụ CAD
Mặc dù các công cụ trên trình duyệt rất tuyệt vời cho các công việc nhanh chóng, phần mềm máy tính để bàn cung cấp cho bạn sự kiểm soát cần thiết cho các dự án phức tạp hơn. Blender là con dao đa năng của Thụy Sĩ cho loại công việc này. Nó miễn phí, chạy trên mọi nền tảng, và cho bạn toàn quyền kiểm soát. Bạn nhập file STL của mình (File > Import > STL), sau đó xuất ra dưới dạng OBJ (File > Export > Wavefront (.obj)). Điều kỳ diệu nằm ở hộp thoại xuất file. Bạn có thể đặt 'Forward Axis' và 'Up Axis' để khớp với hệ tọa độ của ứng dụng đích và chọn có tạo file MTL hay không. Quan trọng là, nếu pháp tuyến của mô hình bị lật, bạn có thể sửa chúng bằng một phím tắt Shift+N nhanh chóng trong Edit Mode trước khi xuất. Đây là loại sửa chữa thủ công mà các công cụ trực tuyến không thể làm được. Đối với các file thực sự lớn, MeshLab là tay chơi hạng nặng. Công cụ mã nguồn mở miễn phí này được xây dựng đặc biệt để xử lý các lưới khổng lồ và thường xử lý các file có hơn 5 triệu mặt nhanh hơn và đáng tin cậy hơn các trình chuyển đổi dựa trên trình duyệt. Quá trình rất đơn giản: mở file STL, vào File > Export Mesh As, và chọn OBJ. Hộp thoại cung cấp cho bạn các tùy chọn bật/tắt cho pháp tuyến, màu sắc và tọa độ texture. Nếu bạn có quyền truy cập vào file CAD gốc từ SolidWorks, Fusion 360, hoặc FreeCAD, hãy dừng việc bạn đang làm và quay lại với nó. Xuất OBJ trực tiếp từ nguồn *luôn luôn* là con đường sạch sẽ nhất. Nó cho phép bạn kiểm soát cài đặt tinh chỉnh lưới trước khi tạo lưới tam giác (tessellation) và tránh được vấn đề 'lưới hóa kép' (double-tessellation) lộn xộn (CAD sang STL sang OBJ), điều này gần như luôn tạo ra một lưới sạch hơn. Để tự động hóa một loạt các chuyển đổi, công cụ dòng lệnh mã nguồn mở assimp (Asset Importer Library) là người bạn thân nhất của bạn. Một lệnh duy nhất, 'assimp export input.stl output.obj', là xong. Điều này hoàn hảo để tích hợp vào các kịch bản Python hoặc các pipeline CI khi bạn có hàng tá file cần xử lý.
Kiểm tra file OBJ của bạn sau khi chuyển đổi
Đừng chỉ mặc định là việc chuyển đổi đã hoạt động hoàn hảo. Kiểm tra nhanh 60 giây bây giờ có thể tiết kiệm cho bạn hàng giờ bực bội sau này. Bắt đầu bằng một kiểm tra trực quan đơn giản. Mở file OBJ bằng một trình xem nhẹ—Windows 3D Viewer, macOS Preview, hoặc một công cụ trực tuyến như 3D Viewer Online (3dviewer.net)—và chỉ cần nhìn vào nó. Xoay mô hình xung quanh. Có những mảng đen kỳ lạ không? Đó có thể là các pháp tuyến bị đảo ngược. Thấy bất kỳ lỗ hổng hoặc hình học bị trùng lặp nào không? Những vấn đề này thường đã có sẵn trong file STL gốc, nhưng bây giờ là lúc để phát hiện chúng. Nếu bạn không ngại một trình soạn thảo văn bản, cứ mở file đó ra xem. OBJ chỉ là văn bản thuần túy. Trong VS Code hoặc Notepad++, bạn sẽ thấy một dòng 'mtllib filename.mtl' ở trên cùng (nếu bạn đã chọn tùy chọn đó), sau đó là một khối lớn các dòng 'v' (đỉnh) và 'vn' (pháp tuyến đỉnh), theo sau là các dòng 'f' (mặt). Nếu bạn thấy các mặt được định nghĩa trước các đỉnh, file đó đã bị hỏng. Để kiểm tra định lượng hơn, hãy đảm bảo số lượng tam giác khớp nhau. Số dòng 'f ' trong file OBJ phải giống với số lượng tam giác từ file STL gốc của bạn. Bạn có thể thực hiện tìm kiếm nhanh trong trình soạn thảo văn bản cho 'f ' để đếm số lần xuất hiện. Một sự khác biệt lớn (hơn 0,1%) có nghĩa là đã có lỗi trong quá trình phân tích cú pháp. Khi file OBJ của bạn được gửi đến một phần mềm slicer cho máy in 3D, một kiểm tra cuối cùng là rất quan trọng: tỷ lệ. Nhập nó vào PrusaSlicer hoặc Bambu Studio và xem kích thước có đúng không. Một lỗi sơ đẳng kinh điển là có một bộ phận 50 mm hiển thị thành 50.000 mm do không khớp đơn vị. Các file STL không có đơn vị, điều này có thể gây ra sự hỗn loạn. Nếu điều này xảy ra, đừng hoảng sợ; chỉ cần thu nhỏ nó xuống 0,001 trong slicer hoặc xuất lại với cài đặt đơn vị tốt hơn.
Tối ưu hóa file OBJ cho In 3D và cho Kết xuất đồ họa (Rendering)
Một file OBJ được tối ưu hóa cho in 3D khác với một file được tối ưu hóa cho rendering. Một vài điều chỉnh có mục tiêu có thể tạo ra sự khác biệt lớn cho cả hai quy trình làm việc. Khi in 3D, hình học là vua. Phần mềm slicer của bạn cần một lưới 'kín nước' (manifold)—không có lỗ hổng, không có các mặt tự giao nhau, chỉ có các bề mặt sạch sẽ nơi mỗi cạnh được chia sẻ bởi chính xác hai mặt. Sau khi chuyển đổi, việc chạy file OBJ qua một công cụ sửa chữa là một việc làm thông minh. PrusaSlicer thực hiện điều này tự động khi nhập, hoặc bạn có thể sử dụng Analysis > Inspector của Meshmixer để tìm và khắc phục sự cố. Bạn cũng muốn giữ đủ số lượng tam giác để tránh hiện tượng gãy khúc có thể nhìn thấy trên các bề mặt cong. Một quy tắc kinh nghiệm tốt cho máy in FDM với chiều cao lớp 0,2 mm là có các tam giác không lớn hơn khoảng 0,1 mm mỗi cạnh. Đối với rendering, các ưu tiên thay đổi hoàn toàn. Ở đây, số lượng tam giác khổng lồ là kẻ thù. Chúng làm chậm quá trình rendering và khiến việc chỉnh sửa trở nên khó khăn. Nếu file OBJ của bạn đến từ một bản quét quang trắc hoặc một file xuất từ CAD có độ phân giải cao với hàng triệu tam giác, bạn có lẽ nên giảm lưới nó. Bộ điều chỉnh Decimate của Blender là hoàn hảo cho việc này; đặt Ratio thành 0,1–0,3 có thể giảm mạnh một mô hình từ 2 triệu xuống 200.000 tam giác với rất ít khác biệt về mặt hình ảnh ở khoảng cách camera thông thường, trong khi tăng tốc đáng kể quy trình làm việc của bạn. Thiết lập vật liệu là phần quan trọng khác cho rendering. File MTL cơ bản từ CocoConvert là một điểm khởi đầu, không phải là sản phẩm cuối cùng. Trong Shader Editor của Blender, bạn sẽ muốn tinh chỉnh các cài đặt Principled BSDF—điều chỉnh Roughness, đặt Metallic thành 1.0 cho kim loại, và gắn một ảnh texture vào nếu bạn có. Đối với các game engine như Unity, bạn có thể cần đổi tên các mục vật liệu trong file MTL để khớp với thư viện vật liệu của dự án trước khi bạn nhập file OBJ.
Các lỗi thường gặp và cách khắc phục
Bạn sẽ gặp đi gặp lại một vài vấn đề quen thuộc khi chuyển đổi STL sang OBJ. May mắn thay, các cách khắc phục thường khá đơn giản. Cho đến nay, vấn đề đau đầu nhất là các pháp tuyến bị đảo ngược, khiến các phần của mô hình của bạn trông đen hoặc trong suốt. Điều này xảy ra vì file STL gốc có dữ liệu pháp tuyến không nhất quán. Cách khắc phục rất dễ dàng. Trong Blender, chọn tất cả hình học của bạn trong Edit Mode, sau đó sử dụng Mesh > Normals > Recalculate Outside. Trong MeshLab, bạn có thể vào Filters > Normals, Curvatures and Orientation > Re-Orient all faces coherently. Vài cú nhấp chuột là vấn đề đã được giải quyết. Một vấn đề kinh điển khác là tỷ lệ. Mô hình của bạn nhập vào hoặc là quá nhỏ hoặc quá lớn. Điều này là do các file STL không lưu trữ đơn vị—một giá trị '25.4' là milimét hay inch? Phần mềm phải đoán. Nếu bạn biết công cụ CAD ban đầu đã sử dụng milimét (như SolidWorks) hoặc inch, bạn có thể áp dụng một hệ số tỷ lệ là 25,4 (hoặc nghịch đảo của nó) trong cài đặt nhập của ứng dụng đích để khắc phục ngay lập tức. Đôi khi bạn sẽ gặp lỗi về một file MTL bị thiếu. Điều này xảy ra khi một ứng dụng mong đợi một thư viện vật liệu đi kèm với file OBJ. Nếu bạn không nhận được một file từ CocoConvert, hoặc nó bị mất, bạn có thể tự tạo một file. Chỉ cần tạo một file văn bản mới có cùng tên với file OBJ của bạn nhưng với phần mở rộng .mtl. Dán bốn dòng này vào đó: 'newmtl default', 'Kd 0.8 0.8 0.8', 'Ka 0.0 0.0 0.0', 'Ks 0.0 0.0 0.0'. Lưu nó vào cùng một thư mục, và cảnh báo sẽ biến mất. Nếu bạn đang xử lý một file khổng lồ trên 300 MB, đừng ngạc nhiên nếu một công cụ dựa trên trình duyệt như CocoConvert gặp khó khăn hoặc bị quá thời gian. Đó là lúc để chuyển sang một ứng dụng máy tính để bàn như MeshLab hoặc công cụ dòng lệnh assimp. Chúng được xây dựng để xử lý các bộ dữ liệu lớn một cách dễ dàng. Nếu có thể, việc chia một cụm lắp ráp lớn thành các bộ phận nhỏ hơn trước khi chuyển đổi là một chiến lược còn tốt hơn.