Trong luận văn của mình tôi sử dụng chƣơng trình của tiến sĩ
Forstmann, J. Ohyadùng kỹ thuật QEM có tên gốc là “FastQuadricMeshSimplification” đƣợc viết trên môi trƣờng Visual Studio 2013, sử dụng ngôn ngữ lập trình Visual C++. Chƣơng trình gốc của tác giả chỉ chạy đƣợc với một mô hình tại một thời điểm vì tên tệp mô hình cần rút gọn đƣợc cố định trong chƣơng trình. Vì lời gọi thủ tục OBJ obj("../data/bunny.obj",1);) để mở tệp là cố định, muốn thay đổi mô hình thì cần vào hàm main() để gõ tên mô hình cần rút gọn.
Trong chƣơng trình gốc của tác giả,tham số mặt cần rút gọn và tên của tệp output cũng đƣợc cố định trong hàm main()nhƣ sau:
Simplify::simplify_mesh(20000);
Simplify::write_obj("../test_out.obj");nên rất bất lợi cho việc đóng gói và khó triển khai sử dụng rông rãi.
Để thuận thiện cho việc thử nghiệm, học viên đã sửa lại chƣơng trình nguồn để có thể đƣa tệp đầu vào nhƣ một tham số và chuyển chƣơng trình sang dạng dòng lệnh (commander) nhằm tham số hóa đầu vào, đầu ra giúp cho việc đóng gói sử dụng sau này đƣợc hiệu quả.
int main(int argc, char* argv[]) {
int temp_c; //Chứa số mặt cần giảm tới
char input_name[256]; //Chứa tên tệp mô hình vào
char output_name[256]; //Chứa tên tệp mô hình ra
float c;
if (argc == 1) {
OutputUsage(); // Đƣa ra hƣớng đẫn sử dụng
}
else if (argc = 4) {
strcpy(input_name, argv[1]); //Gán tệp vào
strcpy(output_name, argv[2]); //Gán tệp ra
sscanf(argv[3], "%f", &c); //Gán mặt cần giảm tới
} … obj.load_obj(input_name, 100); … Simplify::simplify_mesh((int)c); Simplify::write_obj(output_name); …
Nhƣ vậy ta đã tham số hóa đƣợc chƣơng trình, để sử dụng chƣơng trình sau khi biên dịch đóng gói, mang tới máy khác vô cùng đơn giản (cần cài thêm VC++ 2012 Runtime) và sử dụng với cú pháp nhƣ sau:
Simplification <tệp input><tệp output><số mặt cần có> Ví dụ: Gõ lệnh Simplification bunny.obj o_bun1000.obj 1000
Ví dụ trên cho thấy việc rút gọn mô hình bunny.obj và đƣa ra tệp kết quả o_bun1000.obj với số mặt cần có là 1000.
Để rút gọn nhiều mô hình ta chỉ cần soạn một tệp *.bat nhiều dòng với cú
pháp nhƣ trên. Ví dụ: tệp test.bat có nội dung:
Simplification bunny.obj b100.obj 100 //Rút gọn thỏ xuống 100
mặt
Simplification bunny.obj b1000.obj 10000 Simplification dragon.obj d500.obj 5000 Simplification horse.obj h2000.obj 2000
Lƣu ý tệp cần rút gọn phải nằm cùng thƣ mực với tệp chƣơng trình.
(Mã nguồn: https://github.com/sp4cerat/Fast-Quadric-Mesh- Simplification)
Thử nghiệm 1. Input: “bunny.obj” là mô hình con thỏ gốc Hình 3.3 a
Output: Hình 3.3 b, Hình 3.3 c
Hình 3.3. Thử nghiệm mô hình Bunny
Tệp gốc hình a 3,389Kb với hình b 397Kb (85%) thời gian xử lý 163ms, hình c 15Kb với thời gian xử lý là 187ms
Thử nghiệm 2. Input: “Dragon.obj” là mô hình con rồng gốc Hình 3.4a
Hình 3.4. Thử nghiệm mô hình Dragon
Tệp gốc hình a 9,342Kb với hình b 396Kb (92%) thời gian xử lý 706ms, hình c 14Kb với thời gian xử lý là 832ms
Thử nghiệm 3. Input: “Horse.obj” là mô hình con ngựa gốc Hình 3.5a
Output: Hình 3.5b, Hình 3.5c
Hình 3.5. Thử nghiệm mô hình Horse
Tệp gốc hình a 3,389Kb với hình b 393Kb thời gian xử lý 187ms, hình c 13Kb với thời gian xử lý là 226ms.