Đại lƣợng sai số bậc hai (QEM)

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu một số kỹ thuật rút gọn bề mặt mô hình 3d (Trang 54)

Tập các mặt ứng với một đỉnh và tổng các bình phƣơng khoảng cách tới đỉnh đó là ý tƣởng của thuật toán này khi thiết kế phƣơng án để đo hàm giá, tuy

nhiên để có thể cài đặt đƣợc trong một ngôn ngữ lập trình nào đó, những đại lƣợng và đối tƣợng này cần đƣợc biến đổi một cách thích hợp hơn nhƣ sau:

Ta biến đổi công thức (2.11): D2 v (n vT d)2

trở thành: (n vT d n v)( T d) (2.13) 2 2 (v nn vT T dn vT d ) (2.14) 2 (vT nnT v 2 dnT v d ) (2.15) trong đó : nnT làma trận : 2 2 2 T a ab ac nn ab b bc ac bc c (2.16) Chúng ta định nghĩa một đại lƣợng Q là bộ ba : Q = (A,b,c) (2.17) trong đó: A = nnT,b = (dnT)T và c = d2.

Với mỗi một mặt phẳng cho trƣớc ta có duy nhất một đại lƣợng Q và bình

phƣơng khoảng cách của một điểm v tới mặt phẳng đó đƣợc xác định bởi:

Q(v) = v AvT 2b vT c (2.18)

Cần chú ý là tập các mặt Q(v) = ε sẽ tạo nên tập các đƣờng đồng mức có

dạng mặt ellipse, parabol, hoặc hyperbol hoặc mặt phẳng.

Một điều rất thuận tiện ở đây là Q làmột đại lƣợng đặc trƣng cho một mặt, ngoài việc biểu thị đƣợc bình phƣơng khoảng cách của một điểm bất kỳ đến mặt đó, nó còn là một đại lƣợng tuyến tính, nghĩa là, nếu ta có hai mặt phẳng ij cho trƣớc thì : ( ) ( ) ( )( ) i j j Q v Q v Qi Q v (2.19) Trong đó : Qi Qj Ai Aj, bi , bj ci cj (2.20) Tổng quát hơn, ta có : 2 ( ) ( ) ( ) ( ) Q i i i i E v D v Q v Q v (2.21)

Nhƣ vậy, để tính tổng bình phƣơng khoảng cách từ một điểm tới một tập

các mặt phẳng cho trƣớc, chúng ta chỉ cần tính tổng các đại lƣợng Q ứng với

các mặt phẳng đó. Khi cài đặt, Q có thể đƣợc cài đặt trong một cấu trúc có 10

trƣờng (A là ma trận đối xứng nên cần 6, b là ma trận 3x1 cần 3 và c là đại

lƣợng vô hƣớng cần 1), cho dù QEM có đại diện cho một hay một tập các mặt

thì kích thƣớc của nó cũng không đổi. Điều này rất thuận tiện cho các thao tác hợp, thêm và xoá các mặt trong vòng lặp loại bỏ cặp đỉnh của thuật toán QEM.

Dùng đại lƣợng Q hay tổng bình phƣơng khoảng cách để đánh giá sự xấp

xỉ hình học trong quá trình biến đổi cho ta các kết quả có chất lƣợng cao. Có một vấn cần phải đề đƣa ra là đối với hai đỉnh tạo nên một cạnh của đa diện thì hai tập hợp mặt ứng với chúng sẽ có hai mặt trùng lặp, nếu ta thực hiện phép hợp hai tập mặt thì sự trùng hợp này sẽ bị loại trừ, nhƣng nếu dùng

phép cộng tuyến tính hai đại lƣợng Q thì hai mặt bị trùng đƣợc tính hai lần.

Thực tế trong quá trình thực hiện có thể một mặt bị tính tới ba lầnứng với ba cạnh của tam giác đã bị loại bỏ. Chúng ta sẽ xem xét cách giải quyết vấn đề này ở việc gán trọng số cho các mặt dƣới đây.

2.2.5.2. Xác định trọng số của các mặt

Nhƣ đã trình bày ở trên, các mặt đều có vai trò bình đẳng hay các trọng số của các mặt đều bằng 1. Trong thực tế, nếu áp dụng nhƣ vậy sẽ có trƣờng hợp cho ta một kết quả không tốt và kéo theo nhiều hệ lụy. Giả sử vật thể ban đầu của ta có vài mặt rất lớn còn các mặt khác lại rất nhỏ, nếu loại bỏ một mặt rất lớn nào đó thì rất có thể sẽ dẫn tới việc làm thay đổi đáng kể hình dạng của vật thể ban đầu. Phƣơng án đánh trọng số phải thể hiện đƣợc tính quan trọng của các mặt. Một tình huống khác nhƣ (Hình 2.8)

Hình 2.8. Mặt vuông được “lát” bằng các hình tam giác khác nhau

Ta có một mặt vuông đƣợc phủ bởi các tam giác theo hai cách khác nhau,

mỗi một tam giác sẽ có một Q nhƣ nhau, do vậy đại lƣợng Q cho mặt vuông 1

là 9Q còn ở trƣờng hợp thứ hai là 18Q. Rõ ràng là đối với cùng một hình vuông cho hai giá trị nhƣ vậy là không hợp lý. Phƣơng án đánh trọng số phải

đƣợc thiết kế sao cho cùng một vùng thì đại lƣợng Q phải nhƣ nhau bất kể nó

đƣợc phủ bởi các tam giác nhƣ thế nào.

Trong thuật toán QEM, trọng số cho đại lƣợng Q của một mặt nào đó là

diện tích của mặt đó. Khi đó một đại lƣợng Q tổng đƣợc tính theo công thức sau:

, , ( ) Q wA wb wc (2.22) ( ) T( ) 2( )T ( ) Q v v wA v wb v wc (2.23) ( ) ( )( ) Q i i i i E wQ v wQ v (2.24)

Trong đó wi là diện tích của mặt i. Với cách đánh trọng số nhƣ vậy, hai

vấn đề đặt ra ở trên đã đƣợc giải quyết

Để giải quyết tình huống loại bỏ trùng lặp ở phần trƣớc đã nêu, chúng ta có thể tính thêm một yếu tố nữa trong việc đánh trọng số, đó là giá trị ở các

góc của tam giác, khi tính toán Q tổng ở mỗi một đỉnh, chúng nhân thêm giá

nếu coi mặt ở trong quan trọng hơn mặt ngoài biên thì sự lặp lại cũng là một trọng số.

2.2.5.3. Xác định vị trí đỉnh mới

Với mỗi cặp đỉnh (vi, vj ) đã cho ta cầntìm một vị trí của đỉnh vsao cho

( ) ( ) ( )( )

i j i J

Q v Q v Q Q v đạt giá trị cực tiểu.

Nhƣ ta đã biết, Q là đại lƣợng bậc hai, để nó đạt cực tiểu tại v thì tại đó ta có:

0

Q Q Q

x y z (2.25)

Lấy đạo hàm từng phần, ta có gradient của Q tại v là :

2 2

Q Av b (2.26)

Giải phƣơng trình : Q 0 (2.27)

Ta có :v A b1 (2.28)

Nghiệm của nó là vị trí tối ƣu của đỉnh v.

2.2.6. Kiểm tra tính toàn vẹn

Chúng ta phân tích thêm về một số yếu tố có thể ảnh hƣởng đến chất lƣợng của đầu ra mà thuật toán QEM đã xem xét và giải quyết bằng cách gia tăng thêm trọng số để vòng lặp không lựa chọn phải các phƣơng án kém đó.

Yếu tố thứ nhất là trên bề mặt các vật thể có các chi tiết đặc biệt dễ gây tác động đến ngƣời xem ví dụ nhƣ các nếp gấp, nếu trong quá trình thực hiện mà loại bỏ các chi tiết đó thì trong nhiều trƣờng hợp sẽ không chấp nhận đƣợc. Về mặt hình học, các chi tiết đó nằm ở các vùng có độ cong biến đổi lớn, có một số nghiên cứu đã chỉ ra rằng, trong việc đánh giá sai số bằng hàm bậc hai nhƣ QEM thì các vùng nhƣ vậy sẽ ít bị động chạm đến, do vậy, bản thân thuật toán đã loại bỏ đƣợc những yếu tố này.

đỉnh và thay vào đó là một cặp đỉnh mới thì hình dạng cuối cùng sẽ bị thay đổi đột ngột.

Chúng ta xem hình vẽ dƣới đây :

Hình 2.9. Sau khi loại bỏ một cặp thì xuất hiện 1 mặt bị ngược.

Về mặt hình học, những mặt bị thay thế có véctơ pháp tuyến gần nhƣ ngƣợc với mặt ban đầu. Giải pháp phổ biến và dễ hình dung nhất là phải kiểm tra véctơ pháp tuyến so với ban đầu, nếu góc tạo bởi hai véctơ này lớn hơn một ngƣỡng nào đó thì biến đổi đó coi là kém và sẽ đƣợc gán trọng số rất lớn. Thuật toán QEM sử dụng một phƣơng án khác. Chúng ta xem hình vẽ

Hình 2.10. Giải pháp của QEM

Mỗi một đỉnh vi có một tập các cạnh đối diện trên các tam giác tƣơng ứng

và không chứa vj, lập một tập các mặt phẳng đi qua các cạnh đó và vuông góc

với chính mặt tam giác chứa các cạnh đó, để tránh cho vị trí v mới không tạo

ra hiện tƣợng lật ngƣợc mặt nhƣ đã trình bày thì vivà v phải cùng phía với tất

.Nếu một trong hai phép kiểm tra bị vi phạm thì phép loại bỏ hai cặp đỉnh này sẽ bị gán một trọng số lớn.

CHƢƠNG 3.CHƢƠNG TRÌNH THỬ NGHIỆM

Chương này trình bày về một số cài đặt thử nghiệm bằng kỹ thuật QEM đã được trình trong chương II áp dụng cho bài toán “Rút gọn mô hình 3D của một số vật thể”.

3.1. Yêu cầu bài toán

Cho một mô hình 3D (dạng lƣới tam giác) lƣu trữ trong một tệp *.obj của

một vật thể nào đó. Áp dụng các kỹ thuật đã nêu trong chƣơng II để rút gọn mô hình theo một yêucụ thể và đƣa ra tệp *.out.obj. Sau đây là ví dụ:

Hình 3.1. Ví dụ về yêu cầu rút gọn mô hình 3D

Ví dụ trên cho thấy tệp tin đầu vào là một mô hình con thỏ có 69,451 tam giác bề mặt, áp dụng thuật toán để đƣa ra mô hình với số bề mặt ít hơn với hình b là 1000 tam giác, với hình c là 100 đa giác nhƣng vẫn đảm bảo hình dạng ban đầu của vật thể, với hình c ta vẫn dễ dàng nhận ra đó là mô hình và hình hài của con thỏ.

Trong chƣơng này tôi lựa chọn thuật toán QEM đã trình bày để giải quyết bài toán đặt ra.

3.2.Mô tả dữ liệu thử nghiệm.

Input: Tệp tin *.obj; trong đó „*‟ là tên vật thể nhƣ “box”, “Bunny”,

Box.obj

Tệp *.obj có cấu trúc

-m dòng đầu, mỗi dòng là tọa độ của các đỉnh (vertex) của mô hình bắt đầu bằng v sau đó là 3 giá trị x,y,z là tọa độ của đỉnh đó các nhau bởi dấu cách trống nhƣ ví dụ bên trái bảng này.

- n dòng tiếp theo, mỗi dòng là một mặt (triangle) của mô hình, đầu dòng là f, 3 số tiếp theo là chỉ số của các đỉnh hợp thành mặt đó. Ví

dụ mặt 0 (f0) đƣợc hợp thành từ 3 đỉnh 0,4,5. Mỗi giá trị cách nhau

bởi dấu cách trống nhƣ ví dụ bên trái bảng này.

Bảng bên cho thấy mô hình hình hộp gồm 10 đỉnh (v0..v9), 16 mặt

(f0-f15) là số tam giác bao phủ bề mặt vật thể.

#9 15 v 0 0 0 v 1 0 0 v 1 1 0 v 0 1 0 v 0 0 1 v 1 0 1 v 1 1 1 v 0 1 1 v .5 .5 0 v .5 .5 1 f 0 4 5 f 0 5 1 f 1 5 6 f 1 6 2 f 2 6 7 f 2 7 3 f 3 7 4 f 3 4 0 f 8 5 4 f 8 6 5 f 8 7 6 f 8 4 7 f 9 5 4 f 9 6 5 f 9 7 6 f 9 4 7

Output:Từ mô hình đã cho đƣa ra mô hình với số mặt ít hơn mô hình ban đầu.Ví dụ trên cho thấy rút gọn thỏ (bunny.obj) với số tam giác bề mặt xuống 100.

3.3. Phân tích thiết kế và chƣơng trình thử nghiệm. 3.3.1. Phân tích thiết kế 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ột phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu một số kỹ thuật rút gọn bề mặt mô hình 3d (Trang 54)

Tải bản đầy đủ (PDF)

(75 trang)