So sánh giữa hai thuật toán

Một phần của tài liệu nghiên cứu một số kỹ thuật tạo bóng khối trong đồ họa ba chiều (Trang 61)

Bảng 2.1. So sánh giữa hai thuật toán [2]

-Pass -fail

(Cap)

) Nhanh hơn Z-fail.

. . (Self- shadow) -pass. . . . (Self- Shadow)

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

53

CHƢƠNG 3. CHƢƠNG TRÌNH THỬ NGHIỆM 3.1. Bài toán

Chương trình xây dựng mô hình hóa và hiển thị một cảnh ba chiều bao gồm: Đầu vào gồm:

Nguồn sáng: Có thể thay đổi vị trí Vật thể chắn sáng

Vật thể trong vùng bóng

Đầu ra: Quan sát bóng của vật thể. Vùng bóng khối Các yêu cầu của bài toán này là:

Thể hiện được nguồn sáng, vật thể

Phải thể hiện được một số hiệu ứng bóng – ánh sáng đây là yêu cầu nhằm thể hiện cho những kết quả mà luận văn đã đưa ra trong các phần trên.

3.2. Phân tích, lựa chọn giải pháp

Với bài toán đã được nêu đầu tiên chúng ta phải tiến hành xây dựng các mô hình ba chiều để thể hiện không gian, và đối tượng.

Các mô hình cần xây dựng là : Mô hình không gian ba chiều, mô hình các đối tượng vật thể trong không gian. Với yêu cầu này học viên chọn giải pháp là tìm, lựa chọn sử dụng các mô hình miễn phí trên mạng.

Bước tiếp theo là xây dựng bóng khối của vật thể trong không gian. Với yêu cầu hệ thống thì một số công việc cần giải quyết:

Thể hiện hiệu ứng bóng bề mặt trong ứng dụng này học viên sử dụng hai phương pháp chính đó là Gauraud và Phong cho các loại hiệu ứng bề mặt khác nhau.

Thể hiện hiệu ứng bóng đổ hệ thống đã cài đặt và thể hiện được hiệu ứng bóng đổ bằng bóng khối.

Thể hiện vùng bóng và các vật thể trong vùng bóng

Để thực hiện công việc trên với mô hình học viên lựa chọn chuẩn mô hình là chuẩn VRML (một chuẩn rất phổ biến trong lĩnh vực ba chiều). Việc cài đặt, hệ thống được lựa chọn cài đặt bằng bộ phát triển Microsoft Visual studio.Net phiên

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

54

bản 7.0(2003) của Microsoft. Ngoài ra hệ thống sử dụng một số bộ thư viện bao gồm: Bộ thư viện đồ họa OpenGL, bộ thư viện cho âm thanh là OpenAL.

Tìm danh sách cạnh viền

for(int ring=1; ring<torusPrecision+1; ring++) {

for(int i=0; i<torusPrecision+1; i++) { vertices[ring*(torusPrecision+1)+i].position=vertices[i].position.Get Rotated Y(ring*360.0f/torusPrecision); vertices[ring*(torusPrecision+1)+i].normal=vertices[i].normal.GetRo tatedY( ring*360.0f/torusPrecision); } }

//calculate the indices

for(int ring=0; ring<torusPrecision; ring++) {

for(int i=0; i<torusPrecision; i++) { indices[((ring*torusPrecision+i)*2)*3+0]=ring*(torusPrecisio n+1)+i; indices[((ring*torusPrecision+i)*2)*3+1]=(ring+1)*(torusPrec ision+1)+i; indices[((ring*torusPrecision+i)*2)*3+2]=ring*(torusPrecisio n+1)+i+1; indices[((ring*torusPrecision+i)*2+1)*3+0]=ring*(torusPrecis ion+1)+i+1; indices[((ring*torusPrecision+i)*2+1)*3+1]=(ring+1)*(torusP recision+1)+i;

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 55 indices[((ring*torusPrecision+i)*2+1)*3+2]=(ring+1)*(torusP recision+1)+i+1; } }

//Calculate the plane equation for each face planeEquations=new PLANE[numTriangles]; if(!planeEquations)

{

errorLog.OutputError("Unable to allocate memory for %d planes", numTriangles);

return false; }

for(unsigned int j=0; j<numTriangles; ++j) {

planeEquations[j].SetFromPoints(vertices[indices[j*3+0]].position, vertices[indices[j*3+1]].position, vertices[indices[j*3+2]].position);

}

Xác định các tứ giác bao quanh bóng khối

isFacingLight=new bool[numTriangles]; if(!isFacingLight)

{

errorLog.OutputError ("Unable to allocate memory for %d booleans", numTriangles);

return false; }

//Create space for connectivity data

neighbourIndices=new GLint[numTriangles*3]; if(!neighbourIndices)

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

56

errorLog.OutputError("Unable to allocate memory for %d neighbour indices", numTriangles*3);

return false; }

//Create space for "is silhouette edge" booleans

isSilhouetteEdge=new bool[numTriangles*3]; if(!isSilhouetteEdge) {

errorLog.OutputError("Unable to allocate memory for %d booleans", numTriangles*3);

return false; }

//Calculate the neighbours SetConnectivity(); return true; } Tất cả các mặt trƣớc của bóng từ vị trí điểm nhìn void SHADOW_MODEL::SetConnectivity() {

//set the neighbour indices to be -1

for(unsigned int i=0; i<numTriangles*3; ++i) neighbourIndices[i]=-1;

//loop through triangles

for(unsigned int i=0; i<numTriangles-1; ++i) {

//loop through edges on the first triangle for(int edgeI=0; edgeI<3; ++edgeI) {

//continue if this edge already has a neighbour set if(neighbourIndices[i*3+edgeI]!=-1)

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

57

//loop through triangles with greater indices than this one

for(unsigned int j=i+1; j<numTriangles; ++j) {

//loop through edges on triangle j for(int edgeJ=0; edgeJ<3; ++edgeJ)

{

//get the vertex indices on each edge int edgeI1=indices[i*3+edgeI];

int edgeI2=indices[i*3+(edgeI+1)%3]; int edgeJ1=indices[j*3+edgeJ];

int edgeJ2=indices[j*3+(edgeJ+1)%3];

//if these are the same (possibly reversed order), these faces are neighbours

if((edgeI1==edgeJ1 & edgeI2==edgeJ2) || (edgeI1==edgeJ2 &edgeI2==edgeJ1)) {

neighbourIndices[i*3+edgeI]=j; neighbourIndices[j*3+edgeJ]=i;

Tất cả các mặt sau của bóng từ vị trí điểm nhìn

void SHADOW_MODEL::CalculateSilhouetteEdges(VECTOR3D lightPosition) {

//Calculate which faces face the light for(unsigned int i=0; i<numTriangles; ++i) {

if(planeEquations[i].ClassifyPoint(lightPosition)==POINT_IN_FRONT_OF _ PLANE)

isFacingLight[i]=true; else

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

58

isFacingLight[i]=false; }

//loop through edges

for(unsigned int i=0; i<numTriangles*3; ++i) {

//if this face is not facing the light, not a silhouette edge if(!isFacingLight[i/3])

{

isSilhouetteEdge[i]=0; continue;

}

//this face is facing the light

//if the neighbouring face is not facing the light, or there is no neighbouring face,

//then this is a silhouette edge

if(neighbourIndices[i]==-1 || !isFacingLight[neighbourIndices[i]]) { isSilhouetteEdge[i]=1; continue; } isSilhouetteEdge[i]=0; } }

Vẽ bóng: đậy nắp 2 đầu của khối

void SHADOW_MODEL::DrawInfiniteShadowVolume(VECTOR3D lightPosition, bool drawCaps)

{

glBegin(GL_QUADS); {

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

59

for(unsigned int i=0; i<numTriangles; ++i) {

//if this face does not face the light, continue if(!isFacingLight[i])

continue;

//Loop through edges on this face for(int j=0; j<3; ++j)

{

//Draw the shadow volume "edge" if this is a silhouette edge if(isSilhouetteEdge[i*3+j]) { VECTOR3D vertex1=vertices[indices[i*3+j]].position; VECTOR3D vertex2=vertices[indices[i*3+(j+1)%3]].position; glVertex3fv(vertex2); glVertex3fv(vertex1); glVertex4f( vertex1.x-lightPosition.x, vertex1.y-lightPosition.y, vertex1.z-lightPosition.z, 0.0f); glVertex4f( vertex2.x-lightPosition.x, vertex2.y-lightPosition.y, vertex2.z-lightPosition.z, 0.0f); } } }

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

60

}

glEnd();

//Draw caps if required if(drawCaps)

{

glBegin(GL_TRIANGLES); {

for(unsigned int i=0; i<numTriangles; ++i) { for(int j=0; j<3; ++j) { VECTOR3D vertex=vertices[indices[i*3+j]].position; if(isFacingLight[i]) glVertex3fv(vertex); else glVertex4f( vertex.x-lightPosition.x, vertex.ylightPosition.y, vertex.zlightPosition. z, 0.0f); } } } glEnd(); } } 3.3. Kết quả thử nghiệm

Bằng cách cài đặt hệ thống như phần trên học viên đã cơ bản hoàn tất hệ thống. Yêu cầu tối thiểu để chạy hệ thống này là: Hệ điều hành của Microsoft Window95

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

61

trở lên, yêu cầu CPU tối thiểu là 1.8Ghz, bộ nhớ ram tối thiểu là 512MB, tối thiểu ổ cứng còn trống tối thiểu là 300MB. [6]

n:

Chuột trái: Để dịch chuyển vật chắn sáng Chuột phải: Hiện menu chọn cách tạo bóng Hệ thống có các chức năng chính như sau:

Giao diện chính của hệ thống:

Hình 3.1. Giao diện mô tả bóng khối Một mặt phẳng

trong không gian ba chiều Nguồn sáng Các vật thể trong vùng bóng Bóng khối Vật chắn sáng

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

62

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

63

3.3. Giao diện mô tả b -fail

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

64

3.4. Giao diện mô tả b -

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

65

KẾT LUẬN Các kết quả đạt đƣợc

Luận văn đã tìm hiểu cách hiển thị trong đồ họa ba chiều, các dữ liệu đầu vào và đầu ra của bài toán tạo bóng trong đồ họa ba chiều

Luận văn hệ thống, so sánh hai kỹ thuật tạo bóng khối trong đồ họa ba chiều: kỹ thuật tạo bóng khối Z – pass, Z – fail

Từ đó vận dụng thuật toán xây dựng chương trình cài đặt mô tả kỹ thuật tạo bóng khối trong đồ họa ba chiều

Hƣớng phát triển của đề tài

Luậ ề một số ậ , đưa ra được

mô phỏ ậ khối. Nhưng hiện nay với tốc độ phát triể

ủa ngành công nghệ ủ ật đồ

riêng thì đòi hỏi cần phải đi sâu hơn nữa để ậ

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

66

TÀI LIỆU THAM KHẢO A. Tiếng Việt

1. (2006), ,

Nhà xuất bản Khoa họ ật, Hà Nội.

2. Nguyễn Hải Thanh (2005), Shadow Technique_Thesis, Khoá luận tốt nghiệp đại học, Khoa Công nghệ - ọc Quốc Gia, Hà Nội.

3. Đỗ Năng Toàn, Phạm Thế Anh, Lê Hải Khôi (2005), Một cách tiếp cận cho

hiển thị hình ảnh 3 chiều, Kỷ yếu Hội thảo Quốc gia về “Các vấn đề chọn lọc

của CNTT”, Hải Phòng 25-27/8/2005, tr 396-404.

B. Tiếng Anh

4. Andrew V.Nealen (2007), Shadow Volume and Shadow Mapping, Recent Development in Real-time Shadow Rendering, University of British Columbia.

5. Ikrima Elhassan (2007), Shadow Algorithms.

C. Internet

6. Các website nói về vấn đề tạo bóng trong đồ họa ba chiều: www.gameprogramming.com, www.gamasutra.com, www.opengl.org, www.nehe.gamedev.com, www.gamedev.net

Một phần của tài liệu nghiên cứu một số kỹ thuật tạo bóng khối trong đồ họa ba chiều (Trang 61)