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