6. Ý nghĩa khoa học của đề tài
3.1. Bài toán mô hình hóa các vật thể 3D
Ngày nay, nhờ sự phát triển của khoa học kỹ thuật và công nghệ mà loài người đã có những bước tiến lớn trong nhiều lĩnh vực khác nhau. Và một trong số đó là vấn đề khôi phục và biểu diễn các đối tượng 3D. Khôi phục đối tượng 3D đã trở thành một nhu cầu cần thiết trong các lĩnh vực khác nhau như: Tạo ảnh trong y học, các ứng dụng mỹ thuật, thiết kế sản phẩm, tạo nguyên mẫu nhanh và trong các phạm vi khác. Việc tạo mô hình 3D bằng phương pháp thủ công tốn nhiều thời gian và do vậy chi phí sẽ đắt đỏ. Vì lý do đó, các kỹ thuật đã và đang tiếp tục được nghiên cứu, các kỹ thuật này cho phép khôi phục tự động các đối tượng 3D. Các kỹ thuật này có thể chia thành 2 phương pháp: phương pháp chủ động và phương pháp bị động. Nhược điểm của các phương pháp chủ động là quá trình khôi phục có thể trở thành một công trình tiêu tốn ngân sách cao. Vì lý do đó, cách tiếp cận được giới thiệu thuộc về các phương pháp bị động, nó yêu cầu ít thiết bị hơn và có thể áp dụng một cách tổng quát hơn.
Các phương pháp khôi phục các đối tượng 3D truyền thống không thực hiện tốt ở hai hướng:
Thứ nhất: Chúng không thể xử lý các trường hợp có độ phức tạp cao được tìm thấy trong tự nhiên như các bộ phận cơ thể của con người hay các ảnh cực nhỏ của mô.
Thứ hai: Chúng không đưa dữ liệu bề mặt vào một định dạng làm cho nhỏ gọn và thích hợp để mô phỏng, hiển thị hoặc định vị
Có 5 trường hợp khôi phục các đối tượng 3D.
Trường hợp đầu tiên là với các ảnh được chụp bằng máy ảnh không định cỡ, làm việc với loại ảnh này có thể khôi phục lại đối tượng so sánh với các phép biến đổi ánh xạ.
Hai là, khôi phục từ các máy ảnh định cỡ làm việc với loại ảnh này có thể khôi phục lại đối tượng so sánh với các phép biến đổi đồng dạng.
Ba là, các thuộc tính đại số của các hàm đa tuyến tính và các lý tưởng phát sinh bởi chúng được nghiên cứu.
Trường hợp thứ tư sử dụng kỹ thuật khôi phục Ơ-clít khi một số thông tin của các máy ảnh được đưa ra.
Trường hợp cuối cùng là khôi phục một ảnh của một đối tượng hoặc bản vẽ nét được biết tới là mảnh 2 chiều.
Như vậy có thể thấy rằng bài toán khôi phục và biểu diễn các đối tượng 3D là một bài toán có ý nghĩa rất lớn và quan trọng.
3.2. Phép nội suy và mịn hóa đƣờng cong
Trong các lĩnh vực ứng dụng số, nhiệm vụ của chúng là phải biểu diễn số liệu, thường là các số đo bằng các chức năng phân tích. Có hai cách giải quyết vấn đề này, trong phương pháp nối điểm hay nội suy (interpolation) thì dữ liệu được coi là đúng và cái chúng ta cần là cách biểu diễn dữ liệu không nằm giữa các giá trị đo được, theo phương pháp thứ hai gọi là phương pháp mịn hóa đường cong (curve fitting or regression), ta tìm một đường cong không gấp khúc mà phù hợp nhất với dữ liệu đã có, nhưng không cần thiết phải đi qua một cách chính xác bất kỳ một điển nào trên bảng số liệu. Hình 3.1 minh họa hai phương pháp trên, chữ o đánh dấu các điểm biểu diễn dữ liệu, các đoạn thẳng bằng nét liền nối các đường biểu diễn dữ liệu lại với nhau theo
phương pháp nối điểm còn đường chấm chấm là một đừng cong vẽ theo phương pháp mịn hoa dữ liệu.
Hình 3.1 Phép nối điểm và mịn hóa đường cong
3.2.1. Nối điểm một chiều
Như đã giới thiệu thì nối điểm được định nghĩa như là một phương pháp dự đoán giá trị của hàm giữa những điểm cho trước. Nối điểm là một công cụ hữu hiệu khi chúng ta không thể tính toán nhanh chóng được giá trị của hàm tại các điểm trung gian. Phương pháp này được sử dụng rộng rãi đối với dữ liệu là giá trị của các phép đo thực nghiệm hoặc là kết quả của các chuỗi tính toán. Ví dụ đơn giản nhất của việc nối điểm chính là phương pháp vẽ từng điểm của MATLAB, tức là vẽ những đoạn thẳng nối những điểm dữ liệu liên tiếp để tạo thành một đồ thị.
Đây là phương pháp nối điểm tuyến tính, theo phương pháp này các giá trị của hàm nằm giữa hai điểm cho trước sẽ rơi vào khoảng giữa hai đầu của
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 -2 0 2 4 6 8 10 12
đoạn thẳng nối hai điểm đó. Hiển nhiên là khi số lượng các điểm dữ liệu tăng lên và khoảng cách giữa chúng giảm đi thì phương pháp nối điểm tuyến tính càng trở nên chính xác.
3.2.2. Xấp xỉ hóa hai chiều
Xấp xỉ hóa hai chiều dựa trên cùng một nguyên lý của xấp xỉ hóa một chiều. Tuy nhiên như tên của nó đã chỉ ra, xấp xỉ hóa hai chiều là xấp xỉ một hàm phụ thuộc vào hai biến độc lập z = f(x,y).
Cũng giống như trong trường hợp xấp xỉ hoa một chiều, xấp xỉ hoa hai chiều cũng có nhiều phương pháp, mà phương pháp đơn giản nhất là phương pháp nối bằng đoạn thẳng, hay còn gọi là nối tuyến tính. Ta có thể xấp xỉ hóa để cho đồ thị trở nên mịn hơn với độ phân giải cao hơn.
3.3. Tìm điểm kiểm soát cho đƣờng cong B-Spline
Trong các mục trước ta đã tìm hiểu cách xác định phương trình đường cong B-Spline qua đa giác kiểm soát của chúng. Ta sẽ xét vấn đề ngược lại là nếu biết trước một số điểm của đường cong liệu ta có thể xác định được các đa giác kiểm soát của đường cong đó hay không? Câu trả lời là có và đường cong B-Spline xác định bởi các điểm kiểm soát này được gọi là đường cong B-Spline phù hợp (B-Spline curve fit).
Hình 3.2 Xác định đa giác kiểm soát của đường cong B-Spline qua một số điểm đã biết nằm trên đường cong.
B2
B3
B4
3.4. Vẽ một số đối tƣợng 3D
Thiết kế các đối tượng là một phần trung tâm quan trọng của đồ họa máy tính.Có nhiều phương pháp để xây dựng các đối tượng hình học. Ở đây, ta sẽ tìm hiểu phương pháp xây dựng dựa trên mô hình B-Spline phân cấp (hierarchical building system) [7].
Xét ví dụ cụ thể là một chiếc máy bay có thể gồm các bộ phận bánh xe, thân, cánh … trong đó các cánh quạt của nó có thể xoay khi cất cánh nhưng thân của nó thì đứng yên. Mô hình của chiếc máy bay có thể biểu diễn bằng hàng chục các chi tiết hình học. Như vậy để mô hình hóa một đối tượng đồ họa ta sẽ xây dựng hệ thống bao gồm các hình đơn giản của các đối tượng sau đó kết hợp lại với nhau để được vật thể sinh động. Các mô hình được xây dựng bằng hai phương pháp:
Mô tả bằng các bề mặt: Có thể là các mặt đơn giản như hình cầu và có thể là các mặt B-Spline phức tạp.
Xây dựng các khối hình, khung hình, sau đó chuyển đổi sang các bề mặt, và có thể kết hợp với các bề mặt.
Để lập trình trong Matlab, ta gom nhóm mỗi mô hình cơ bản (như hình cầu, hình trụ ...) trong một hàm Matlab. Sau đó sử dụng các hàm renderpatch để chuyển đổi một hình ảnh sang dạng bóng mờ, hàm renderwire để chuyển đổi các khung hình.
3.4.1. Vẽ quả táo
Function Apple:
function [cordX, cordY, cordZ] = apple(sizeTheta, sizeFai) if nargin ==0
sizeTheta = 30; sizeFai = 40; elseif nargin < 2
error('NotEnoughArugments', ''); end;
theta = linspace(0, pi, sizeTheta)'; nudge = 0.0001;
fai = linspace(0 + nudge, pi/2 - nudge, round(sizeFai/4)); a = 9/4;
b = 9/80;
A = 1+(a-1)*(sin(theta).^2) * (sin(fai).^2);
B = (sin(theta).^2.*cos(theta).^3) * (1 + (b-1)*(sin(fai).^2)); rou = zeros(size(A));
for iLoop = 1:numel(A); curA = A(iLoop); curB = B(iLoop);
polyFactors = [curA^3, -curB, -3*curA^2, 0, 3*curA, 0, -1]; solutions = roots(polyFactors);
realRou = real(solutions(abs(imag(solutions))< 1e-9)); rou(iLoop) = realRou(realRou>0);
end
x = rou .* (sin(theta) * cos(fai)); y = rou .* (sin(theta) * sin(fai));
z = rou .* (cos(theta) * ones(size(fai))); cordX = [x, -fliplr(x) , -x, fliplr(x)]; cordY = [y, fliplr(y) , -y, -fliplr(y)]; cordZ = [z, fliplr(z), z, fliplr(z)];
Đoạn code dùng để vẽ lọ hoa, sử dụng hàm paintSurface(var)ở trên. close all; [x,y,z] = apple; bottomZ = min(z(:)); radius = abs(bottomZ); axis vis3d axis off daspect([1.6, 1, 1.875]); hold on; markerColor = [0.8, 0.8, 0.8]; lineColor = [0.7, 0.7, 0.7]; figWidth = 600 figHeight = 500;
screenSize = get(0, 'ScreenSize'); X0 = (screenSize(3)-figWidth)/2; Y0 = (screenSize(4)-figHeight)/2;
set(gcf, 'Position', [X0,Y0, figWidth, figHeight]); camtarget([0, 0, 0]); set(gcf,'Renderer','zbuffer'); set(gcf,'DoubleBuffer','on'); set(gcf, 'color', [100 105 100]/255); startAZ = 20; satrtEL = 40; view(startAZ, satrtEL); for iLoop = 1:size(x, 1)
plot3(x(iLoop, :), y(iLoop,:), z(iLoop, :), 'Marker', '.', 'MarkerEdgeColor', markerColor, 'LineStyle', 'none');
end
for iLoop = 1:size(x, 1)
plot3(x(iLoop, :), y(iLoop,:), z(iLoop, :), 'color', lineColor, 'LineStyle', '-');
end
for iLoop = 1:size(x, 2)
plot3(x(:, iLoop), y(:, iLoop), z(:, iLoop), 'color', lineColor, 'LineStyle', '-'); end for i=1:36 camorbit(10,0,'data'); end delete(get(gca, 'Children')); camlight left; newLineColor = [0.7, 0.4, 0.4];
h = surf(x,y,z, 'EdgeColor', newLineColor, 'FaceColor', 'r'); for i=1:36
camorbit(10,0,'data'); end
mediumColor = [0.8, 0.3, 0.3];
set(h, 'EdgeColor', mediumColor,'FaceLighting','gouraud'); for i=1:36
camorbit(10,0,'data'); drawnow;
set(h, 'EdgeColor', 'none'); drawnow;
deltaZ = linspace(-.3, 0, 5); deltaZ = [fliplr(deltaZ), deltaZ]; deltaZ = repmat(deltaZ, 1, 3); zlim('manual');
for iLoop = 1:length(deltaZ)
curDeltaZ = deltaZ(mod(iLoop,length(deltaZ))+1); ratio = (radius+curDeltaZ)*radius;
newZ = z*ratio + curDeltaZ;
if exist('h', 'var')&& ishandle(h), delete(h);end; h = surf(x,y, newZ, 'EdgeColor', 'none', 'FaceColor', 'r','FaceLighting','gouraud'); camorbit(-1, 0, 'data'); drawnow; end deltaZ = generateSimulatedBouncingPath; zlim([-1, 3]); rotate3d on
Hình 3.3: Biểu diễn quả táo 3.4.2. Vẽ lọ hoa Function paintSurface: function surface=paintSurface(var) if (var>100) var=100; elseif (var<1) var=1; end var=1/var; [x,y,z]=meshgrid(-1:var:1, -1:var:1, -1:1:1); w=z; surface=isosurface(x,y,z,w,0);
Đoạn code dùng để vẽ lọ hoa, sử dụng hàm paintSurface(var)ở trên.
clf s1= paintSurface (100); s1.facelighting='flat'; s1.facecolor='red'; V=s1.vertices; r=1.5 + abs(V(:,2)).*cos(2*pi*V(:,2));
s1.vertices=[cos(pi*V(:,1)).*r, sin(pi*V(:,1)).*r, 3*V(:,2)]; count=renderpatch(s1); axis off; grid on daspect([1 1 1]) light('position',[100,-100,100]) set(gca,'projection','perspective') set(gca,'CameraViewAngle',8) set(gcf,'color', [.6,.8,.8]) xlabel('x');ylabel('y');zlabel('z'); view(-40,30) drawnow rotate3d on
kết quả ta được hình biểu diễn lọ hoa như sau:
3.4.3. Vẽ máy bay Function paintSphere: Function paintSphere: function sphere=paintSphere(var) if (var>10) var=10; elseif (var<1) var=1; end var=1/var; [x,y,z]=meshgrid(-1-var:var:1+var, -1-var:var:1+var, -1- var:var:1+var); w=sqrt(x.^2+y.^2+z.^2); sphere=isosurface(x,y,z,w,1); Function paintCylinder: function cylinder=paintCylinder(var) if (var>10) var=10; elseif (var<1) var=1; end var=1/var; [x,y,z]=meshgrid(-1-var:var:1+var, -1-var:var:1+var, - 1:1:1); w=sqrt(x.^2+y.^2); cylinder=isosurface(x,y,z,w,1);
Đoạn code dùng để vẽ máy bay, sử dụng 2 hàm paintSphere và paintCylinder ở trên.
clear all; clf; ground.facecolor=[.6 .6 .6]; ground.vertices= ... [-10, -10, 0; -10, 10, 0; 10, 10 ,0; 10, -10, 0]; ground.faces=[1 2 3 4]; tower.facecolor=[.4,.8,.4; sphere1=paintSphere(2); sphere1.facecolor='white'; nose=translate(scale(sphere1,3,1,1),-4.5,0,1.01); tailcap=translate(scale(sphere1,2,1,1),4.5,0,1.01); cockpit=translate(scale(paintSphere(1.5),1.5,.75,.5),-2.5,0,2.0); cockpit.facecolor='none'; cyl1=paintCylinder(2); cyl1=translate(rotateY(scale(cyl1,1,1,5),90),0,0,1.01); cyl1.facecolor='blue';
fusilage=combine(cyl1, nose, tailcap, cockpit);
wing=translate(scale(paintSphere(3),1,10,.2),-2,0,1); wing.facecolor='white';
htail=translate(scale(paintSphere(2),1,4,.2),5,0,1);
vtail=translate(rotateY(scale(paintSphere(2),1,.2,2),30),5,0,2); wingtail=combine(wing, htail, vtail);
for time=0:.1:1
motor.facecolor='white';
motors={ translate(motor,-2,3,1) translate(motor,-2,-3,1) }; prop=rotateX(scale(paintSphere(1.5),.1,2,.2), time*90); prop.facecolor='black';
props=combine(...
translate(prop,-3.1,-3,1),... translate(prop,-3.1,3,1) );
motorprop=combine( motors, props );
plane=combine( fusilage, wingtail, motorprop); plane=translate(plane,0,0,1);
clf
scene=combine( ground, tower, plane ); count=renderpatch(scene); axis off; grid on daspect([1 1 1]) light('position',[10,10,10]) set(gca,'projection','perspective') set(gca,'CameraViewAngle',6) set(gcf,'color', [.4,.8,.4]) xlabel('x');ylabel('y');zlabel('z'); view(-160,20) drawnow; end rotate3d on
Kết quả ta được hình biểu diễn máy bay như sau:
3.4.4. Giao diện chƣơng trình chính
Hình 3.6 sau đây là giao diện chương trình ứng dụng B-Spline xây dựng các đường cong, mặt cong và một số vật thể 3D.
KẾT LUẬN
Trong luận văn này, chúng tôi đã trình bày về đường cong và mặt cong B-Spline và đưa ra ứng dụng trong đồ họa máy tính thông qua việc mô hình một số vật thể 3D được cài đặt trên Matlab.
Luận văn đã tìm hiểu, tổng hợp và trình bày một số kết quả, cũng như xây dựng được ứng dụng cụ thể là:
Những kiến thức tổng quan về mô hình hóa hình học.
Lý thuyết về đường cong B-Splines, mặt cong B-Splines.
Ứng dụng B-Splines vào bài toán mô hình hóa vật thể 3D. Hướng phát triển của luận văn:
Tiếp tục xây dựng thêm những vật thể 3D phức tạp, sinh động hơn.
Nghiên cứu ứng dụng trong bài toán khôi phục mặt người từ hộp sọ, một bài toán có ý nghĩa thực tiễn rất lớn trong Y học và Pháp y.
TÀI LIỆU THAM KHẢO Tiếng Việt
[1].Đặng Quang Á, Giáo trình Phương pháp số, Nxb Đại học Thái Nguyên, 2009.
[2].Trịnh Thị Vân Anh, Giáo trình Kỹ thuật Đồ họa, Nxb Thông tin và truyền thông, 2006.
[3].Phạm Anh Phương, Giáo trình Lý thuyết Đồ họa, 2003.
[4].Đỗ Năng Toàn, Giáo trình Xử lý ảnh, NXB Đại học Thái Nguyên, 2007. [5].Nguyễn Thế Tranh, Giáo trình Công nghệ CAD/CAM, NXB Đại học Bách khoa Đà Nẵng, 2007.
Tiếng Anh
[6].Andrés iglesias, B-Splines and nurbs curves and surfaces, 2001.
[7].David William Bullock, Computer Assisted 3D Craniofacial Reconstruction, 1996.
[8].Katrina Marie Archer, Craniofacial reconstruction using hierarchical B- Spline interpolation, B.Eng, Mcgill University, 1992.
[9].Hemant Narendra Khatod, Towards automation of forensic facial reconstruction, B.A. Marathwada University, 2001.
[10].Hartmut Prautzsch, B´ezier- and B-Spline techniques, 2002.
[11].R. Sevilla, 3D nurbs-enhanced finite element method, 7th Workshop on Numerical Methods in Applied Science and Engineering, 2008.
[12].Sung Soo Han, The NURBS human body modeling using local knot removal, Fibers and Polymers, 2008.
[13].Thomas W. Sederberg, An Introduction to B-Spline Curves, 2005. [14].Vincent Prat, Nurbs curves and surfaces tutorial, 2001.
[16].Edmond Nadler, Interactive NURBS Tutorial in Virtual Reality, Eng 477 Project Fair, October 10, 2006.
[17].Kenneth I. Joy, Biquadratic uniform b-spline surface refinement, 2000.
Website [18].http://www.rw-designer.com/NURBS [19].http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES [20].http://www.mathworks.com/matlabcentral/fileexchange [21].http://en.wikipedia.org/wiki/Non-uniform_rational_B-Spline [22].http://interactive-mathvision.com/mck/CalculusII/BezierCurves