3.3.1. Phân tích thiết kế
Có nhiều định dạng khác nhau để lƣu trữ mô hình 3D nhƣ: *.3Ds, *.off,
*.ply, *.obj… trong chƣơng này xin trình bày với tệp dữ liệu input với tệp *.obj.
Dòng đầu tiên của tệp là chú thích bắt đầu với #, Ví dụ “#3D Model A”.
Định nghĩa đỉnh bắt đầu với v và đƣợc theo sau bởi 3 hoặc 4 giá trị thực của đỉnh. Mỗi đỉnh đƣợc gán một chỉ số. Đỉnh đầu tiên có chỉ số là 1.
Ví dụ v -1.53 2.06 3.82
v 6.98 -11.3 -0.008 1.0
Tọa độ kết cấu đƣợc quy định bởi các vt biểu tƣợng tiếp theo là hai hoặc ba giá trị dấu chấm động trong khoảng [0, 1]. Tọa độ texture đƣợc ánh xạ tới đỉnh phối thông qua các mặt (polygon). Tập đầu tiên có chỉ số là 1.
Ví dụ vt 0.25 0.90
v 0.0 0.5 0.5
Đỉnh thông thƣờng đƣợc quy định bằng cách sử dụng lệnh vn. Các thành phần đƣợc gán cho một đỉnh thông qua lệnh ('f'). Tập đầu tiên của đỉnh thƣờng đƣợc gán một chỉ số 1.
Ví dụ vn -0.256 0.1888 -0.756
Một định nghĩa đa giác sử dụng một lệnh bắt đầu với f và theo sau là một danh sách các số nguyên dƣơng là chỉ số đỉnh hợp lệ.
Ví dụ f 2 3 6
f 15 8 1 22
Lệnh f trên có một hình thức tổng quát hơn fv/vt/vn v/vt/vn v/vt/vn ... có thể đƣợc sử dụng để kết hợp kết cấu và bình thƣờng thuộc tính với đỉnh. Cả
hai trƣờng /vt và /vn là tùy chọn.
Ví dụ f 2/3/1 3/5/2 6/1/7
f 15/2 8/3 1/5 22/9
f 6//11 7//6 2//22
Ví dụ đầu tiên trên định nghĩa một tam giác bao gồm các kết cấu và tọa độ bình thƣờng ở các đỉnh. Ví dụ thứ hai chỉ kết cấu phối hợp tham chiếu đến mỗi đỉnh, trong khi ví dụ thứ ba chỉ sử dụng các vectơ bình thƣờng. Trong
chƣơng này chủ yếu dùng lƣới tam giác nên mỗi v hoặc f chỉ sử dụng ba giá trị
(một tam giác chỉ có ba đỉnh, mỗi đỉnh có một tọa độ gồm bộ ba giá trịx,y,z).
3.3.2. Chƣơng trình thử nghiệm
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.
3.3.3. Đánh giá kết quả đạt đƣợc
Các minh họa sau đây cho thấy việc bảo quản hình dạng cũng nhƣ các chi tiết quan trọng của vật thể.
Hình 3.6. Bunny 69665 mặt - 34835 đỉnh
Hình 3.7. Bunny 500 mặt 252 đỉnh
Hình 3.8. Bunny 100 mặt 52 đỉnh
Hình 3.10. Dragon 500mặt 250 đỉnh
Hình 3.11. Dragon 100 mặt 51 đỉnh
Hình 3.12. Horse 96966 mặt 48485 đỉnh
Hình 3.14. Horse 100mặt 52 đỉnh
Từ Hình 3.3 đến Hình 3.5 cho ta thấy các mô hình giảm thiểu với các mức độ khác nhau, giảm số lƣợng tam giác cực lớn chỉ tính bằng giây nên thuật toán đáp ứng đƣợc các ứng dụng thực tại ảo và thời gian thực rất tốt. Với hình 3.5 thời gian xử lý 226ms tức là 1/5s từ 96966 tam giác xuống còn 500 tam giác bề mặt.
Từ các Hình từ 3.6 đến Hình 3.14 cho ta thấy mức độ giảm thiểu là rất lớn song các mô hình đối tƣợng vẫn giữ đƣợc dáng vẻ tƣơng đối giống với mô hình gốc. Ta thấy tỉ lệ rút gọn của mô hình Horse: 100(mặt rút gọn)/96966(mặt gốc)=0,103%. Nhƣ vậy một vật thể với mức giảm thiểu 99.9% mà vẫn giữ đƣợc dáng vẻ bề ngoài nhƣ trên là đáng hiệu quả.
Hình 3.16. Car 1686 mặt 425931 đỉnh
Bảo toàn các ranh giới vật chất và đƣờng gấp khúc, đứt đoạn: Với mô hình chiếc xe Car, với tỷ lệ giảm thiểu 1686/8160=20.7% về số bề mặt nhƣng các đỉnh vẫn không giảm về số lƣợng do các chi tiết phức tạp của mô hình nhƣ bánh xe, cánh, ghế… và các chi tiết phụ phức tạp khác. Nhƣ vậy thuật toán rất coi trọng bảo toàn các ranh giới, các vùng tạo nên đặc tính riêng của mô hình.
Về mặt hiệu năng của thuật toán, ta thử nghiệm mô hình dragon.obj (209227 mặt tam giác bao phủ, 104885 đỉnh). Ta thử nghiệm trên máy có cấu hình:
CPU Core 2 Duo 1.7GHz; RAM DRII 2Gb; Chipset: Intel 965;
Hệ điều hành Windows 10.
(1) Rút gọn về 20.000 mặt thu đƣợc lƣới 10023 đỉnh với thời gian là 1786 ms (xấp xỉ 2 giây); (2) Rút gọn về 10.000 mặt thu đƣợc lƣới 5015 đỉnh với thời gian là 2122 ms (xấp xỉ 2,1 giây); (3) Rút gọn về 5.000 mặt thu đƣợc lƣới 1512 đỉnh với thời gian là 2275 ms (xấp xỉ 2,2 giây); (4) Rút gọn về 500 mặt thu đƣợc lƣới 262 đỉnh với thời gian là 2612 ms (xấp xỉ 2,26 giây).
Nhƣ vậy ta nhận thấy thuật toán xử lý một mô hình với không gian104885 đỉnh với cả bốn thử nghiệm trên về thời gian không chênh lệch nhau nhiều nhƣng ta thấy không gian đỉnh bị loại bỏ cực kỳ nhanh chóng, với
(1) là 10023/104885 ta thấy không gian lƣu trữ của mô hình giảm đi còn 1/10; tƣơng tự với (4) là 262/104885 là con số quá nhỏ về không gian lƣu trữ nhƣng vẫn đảm bảo các yêu cầu cơ bản về hình dạng ban đầu của mô hình vật thể. Vậy nó có thể đáp ứng trong các ứng dụng thời gian thực và bộ nhớ nhƣờng cho các yêu cầu điều khiển khác trong đồ họa 3D.
PHẦN KẾT LUẬN
Nội dung đã đạt được:
Sau một thời gian tìm hiểu và đƣợc sự hƣớng dẫn tận tình, luận văn của tôi đã đạt đƣợc một số kết quả bƣớc đầu nhƣ sau:
- Luận văn đã trình bày tổng quan về đối tƣợng 3D, bài toán rút gọn mô
hình bề mặt 3Dvà các cách tiếp cận giải quyết bài toán.
- Hệ thống và trình bày lý thuyết về hai kỹ thuật rút gọnđối tƣợng3D:
Kỹ thuật rút gọn lƣới lũy tiến (PM – Progressive Mesh)và kỹthuật rút gọn đối tƣợng dựa trên đại lƣợng sai số bậc 2 (QEM – Quadric Error Metrics).
- Cài đặt thử nghiệm kỹ thuật rút gọn là: Kỹthuật rút gọn đối tƣợng dựa trên đại lƣợng sai số bậc 2 (QEM – Quadric Error Metrics).
Hạn chế
- Luận văn này chủ yếu tập trung vào xử lý mô hình lƣới tam giác, trên thực tế lƣới có rất nhiều dạng nhƣ đã trình bày ở Chƣơng I.
- Chỉ tập trung vào xử lý bề mặt lƣới, chƣa quan tâm đến các yếu tố khác nhƣ Texture, tạo bóng, tƣơng tác với vật thể…
Hướng phát triển tiếp theo
Trong thời gian tới, tác giả sẽ tiếp tục phát triển các vấn đề nghiên cứu của luận văn là: tiếp tục nghiên cứu cài đặt và mở rộng với các mô hình lƣới đa giác, các đƣờng cong, mặt cong và chất liệu che phủ bề mặt tiến tới cài đặt và thử nghiệm bƣớc đầu với một số kỹ thuật xử lý song song khác nhằm làm tăng tốc độ tính toán phục vụ cho các ứng dụng thời gian thực.
TÀI LIỆU THAM KHẢO
TIẾNG VIỆT
[1] Đ. N. Toàn và N. V. Huân, “Tạp chí khoa học và công nghệ,” Một thuật toán rút gọn biểu diễn bề mặt mô hình 3D, 2, pp. 123-133, 2010.
[2] N. V. Thắng, “Phục dựng hình ảnh 3D từ dữ liệu ảnh y tế DICOM,” trong Luận văn thạc sĩ, Thái Nguyên, 2012, p. 51.
TIẾNG ANH
[3] C. 4.6.3, "Triangulated Surface Mesh," CGAL.ORG, 29 9 2015. [Online]. Available: http://doc.cgal.org/latest/Surface_mesh_simplification/. [Accessed 29 9 2015].
[4] Jarek Rossignac and Paul Borrel, "Multi-resolution 3d approximation for rendering complex scenes," in Geometric Modeling in Computer Graphics, Springer Verlag, 1993, p. 455–465. [5] Schroeder, W., Zarge, J. and Lorensen, W., Decimation of triangle meshes, Computer Graphics
(SIGGRAPH, 1992.
[6] Michael Garland and Paul S. Heckbert, "Surface simplification using quadric error metrics," in
Proceedings of the 24th annual conference on Computer graphics and interactive techniques, New York, NY, USA, 1997, p. 209–216.
[7] G. Turk, Re-tiling polygonal surfaces.Computer Graphics, SIGGRAPH ‟92 Proceedings, 1992. [8] M. H. Gross, O. G. Staadt and Roger Gatti, "Efficient triangular surface approximation using
wavelets and quadtree data structures," in IEEE Transaction on Visualization and Computer Graphics, 1996, p. 130–143.
[9] Hoppe,H., DeRose, T., Duchamp, T., McDonald, J. and Stuetzle, W., "Mesh optimization," in
Computer Graphics (SIGGRAPH ’93 Proceedings), SIGGRAPH ‟93 Proceedings, 1993, pp. 19-26. [10] Lounsbery, M., DeRose, T. and Warren, J., Multiresolution analysis for surfaces of arbitrary
topological type., Washington: Dept. of Computer Science and Engineering, 1994.
[11] J. M. Lounsbery, Multiresolution analysis for surfaces of, University of Washington: Department of Computer Science and Engineering, 1994.
[12] M. Deering, Geometry compression, SIGGRAPH ‟95 Proceedings, 1995.
[13] Taubin, G. and Rossignac, J., "Geometry compression through topological surgery," Research Report RC-20340, IBM, 1996.
[14] G. Turan, "Succinct representations of graphs," in Discrete Applied Mathematics 8, 1984, pp. 289-294.
[15] Witten, I., Neal, R. and Cleary, J., Arithmetic coding for data compression, Communications of the ACM, 1987.