Tải bản đầy đủ (.docx) (59 trang)

xây dựng chương trình mô phỏng khu hiệu bộ trường ðại học hàng hải trợ giúp cho việc tìm ðường trong không gian 3d

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.52 MB, 59 trang )

BỘ GIAO THÔNG VẬN TẢI
TRƯỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM

ĐỒ ÁN TỐT NGHIỆP

ĐỀ TÀI: XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG KHU HIỆU BỘ
TRƯỜNG ĐẠI HỌC HÀNG HẢI TRỢ GIÚP CHO VIỆC TÌM ĐƯỜNG
TRONG KHÔNG GIAN 3D

GIẢNG VIÊN HƯỚNG DẪN: ThS. NGUYỄN HẠNH PHÚC
GIẢNG VIÊN PHẢN BIỆN: ThS. PHẠM TRUNG MINH


2
TRƯỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM
KHOA CÔNG NGHỆ THÔNG TIN

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC
ĐỀ TÀI: XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG KHU HIỆU BỘ
TRƯỜNG ĐẠI HỌC HÀNG HẢI TRỢ GIÚP CHO VIỆC TÌM ĐƯỜNG
TRONG KHÔNG GIAN 3D

GIẢNG VIÊN HƯỚNG DẪN: ThS. NGUYỄN HẠNH PHÚC


3
MỤC LỤC


4


DANH MỤC CÁC HÌNH VẼ TRONG BÁO

Hình ảnh
Hình 2.2.1.
Hình 2.2.2.

Trang
9
9

Hình 2.2.3.

10

Hình 2.3.1.
Hình 2.4.1.
Hình 2.4.2.
Hình 2.4.3.
Hình 2.4.4.

11
11
12
13
13

Hình 2.4.5.
Hình 2.4.6.
Hình 2.4.7.
Hình 2.4.8

Hình 2.4.9
Hình 2.4.10
Hình 2.4.11
Hình 2.4.12
Hình 2.4.13
Hình 3.2.1.
Hình 3.2.2.

14
15
21
21
21
22
22
23
23
33
33

Hình 3.2.3
Hình 3.2.4.

35
36

Hình 3.2.5.

37


Hình 3.2.6.

38

Hình 3.2.7.
Hình 3.2.8.

39
40

Hình 3.2.9.
Hình 3.2.10.

41
42

Hình 3.2.11.

44

Hình 3.2.12.
Hình 3.2.13.
Hình 3.2.14.

45
46
46


5

Hình 3.2.15.
Hình 3.2.16.

48
49

Hình 3.2.17.

50

Hình 3.2.18

51

Hình 3.2.19

51

Hình 3.3.1

53

HÌnh 3.3.2

53

Hình 3.3.3

54


Hình 3.3.4

54

HÌnh 3.3.5

55

Hình 3.3.6

55

Hình 3.3.7

56

Hình 3.4.1

60

Hình 3.4.2

61


6

ỨNG DỤNG OPEN GL XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG
MỘT SỐ TÒA NHÀ KHU HIỆU BỘ
CHƯƠNG 1. MỞ ĐẦU

1. Giới thiệu
1.1. Thời kỳ 1956-1958 (Trường Sơ cấp Hàng hải).

Ngày 01/4/1956, Trường sơ cấp Lái tàu được thành lập tại Nhà máy
nước đá, đường Cù Chính Lan Thành phố Hải Phòng (nay là trụ sở
của Công ty vận tải thủy số 3). Đồng chí Kiều Công Quế, giám đốc
Cảng Hải Phòng, kiêm Hiệu trưởng; đồng chí Nguyễn Văn Quế làm
Phó Hiệu trưởng thường trực. Khóa đầu có 120 học sinh. Ngày
01/7/1956, tại số 5 Bến Bính Trường sơ cấp Máy tàu được thành
lập.
Đồng chí Nguyễn Văn Tiên làm Hiệu Trưởng. Đầu năm 1957, sáp
nhập Trường Sơ cấp Lái tàu và Trường Sơ cấp Máy tàu thành
trường Sơ cấp Hàng hải, trụ sở tại số 5 Bến Bính Hải Phòng. Đồng
chí Nguyễn Văn Tiên bổ nhiệm quyền Hiệu trưởng.
1.2. Thời kỳ 1959-1961 (Trường Trung cấp Hàng hải).

Đầu năm 1959, Trường Sơ cấp Hàng hải được nâng lên thành
Trường Trung cấp Hàng hải trực thuộc Tổng cục Giao thông thủy bộ
trụ sở tại số 5 Bến Bính Hải Phòng. Đồng chí Lê Văn Cường được
bổ nhiệm làm Hiệu trưởng, đồng thời giữ chức Bí thư Đảng ủy; đ/c
Nguyễn Văn Tiên làm phó Hiệu trưởng (các đ/c Đặng Văn Qua, Đào
Văn Quang sau đó thay đ/c Lê Văn Cường làm Hiệu trưởng).
Tháng 9/1959 Trường chuyển địa điểm về số 8 Trần Phú Hải Phòng,
thành lập bộ phận Điện tàu thủy và tạm thời nằm trong Ban Máy tàu
thủy do đ/c Lê Xuân Khảm phụ trách.
1.3. Thời kỳ 1962-1975 (Trường Hàng hải Việt Nam).

Tháng 5/1962 Nhà trường thành lập Ban Điện tàu thủy do đ/c Phan
Xuân Ngọc làm trưởng ban. Trường chuyển trụ sở từ số 8 Trần Phú
về tiếp quản Trường Học sinh Miền Nam số 19 và 21 ở Cầu Rào.

Đồng chí Lê Văn Cường làm Hiệu trưởng đến hết năm 1960. Tháng
1/1963 Trường đón đoàn chuyên gia Liên Xô gồm 4 người thuộc các
chuyên ngành: Kinh tế vận tải, Hàng hải, Máy tàu, Điện tàu thủy
sang giúp về bồi dưỡng giáo viên và xây dựng mục tiêu đào tạo.
Năm 1965 Trường sơ tán về các Xã ngoại thành thuộc Huyện Tiên
Lãng Hải Phòng.


7

Thành lập Ban Vỏ tàu thủy do đ/c Nguyễn Văn Phiêu phụ trách. Mở
thêm lớp Sơ cấp Thương vụ, Sơ cấp Hàng giang học 18 tháng. Mở
thí điểm lớp Đại học Tại chức các ngành Hàng hải như: Lái tàu,
Máy tàu, Điện tàu thủy (gọi là lớp Đại học Chống Mỹ). Đến năm
1966, chính thức thành lập Khoa Đại học Hàng hải tại Huyện Quỳnh
Phụ, Tỉnh Thái Bình, các đ/c Nguyễn Minh Thuyết phụ trách ngành
Lái tàu; đ/c Nguyễn Diên Niên phụ trách ngành Máy tàu thủy; đ/c
Phan Xuân Ngọc phụ trách ngành Điện tàu thủy. Năm 1968, Nhà
trường mở thêm lớp đào tạo giáo viên ngành Hàn tàu.
Năm 1970, hợp nhất các tổ Vỏ tàu, Hàn tàu, Sửa chữa máy thành
Ban Cơ khí thủy. Từ 1971-1975 Trường chuyển về 338 Lạch Tray
(Cầu Rào) chuẩn bị cho bước phát triển mới. Thời kỳ 1974-1975 đ/c
Đỗ Viết Sử được giao quyền Hiệu trưởng; đ/c Hoàng Văn Nhuận
làm Bí thư Đảng ủy thời kỳ 1975-1976.
1.4. Thời kỳ 1971-1984 (Phân hiệu Đại học Giao thông đường thủy)

Phân hiệu Đại học Giao thông đường thủy (GTĐT) được thành lập
theo Quyết định số 115/CP của Chính phủ trên cơ sở các ngành Đại
học Cơ khí thủy, Công trình thủy, Vận tải thủy của Trường Đại học
Giao thông vận tải (GTVT) và Khoa Đại học Hàng hải, đ/c Vũ Lăng

được bổ nhiệm Phân Hiệu trưởng. Năm 1973 Trường được Chính
phủ giao đào tạo 10 ngành học. Tháng 01/1973 Bộ GTVT giao
nhiệm vụ cho Trường Hàng hải Việt Nam đón các ngành học thuộc
Khoa Hàng hải từ Phân hiệu GTĐT về, chiêu sinh khóa mới, chuẩn
bị thành lập Trường Đại học Hàng hải. Tháng 4 năm 1974 các ngành
thuộc khoa Hàng hải từ Phân hiệu đã được bàn giao xong. Trường
Hàng hải chuyển từ nơi sơ tán về số 338 Lạch Tray, Hải Phòng.
1.5. Thời kỳ 1976-1983 (Trường Đại học Hàng hải)

Ngày 27/10/1976 Thủ tướng Chính phủ ra Quyết định số 426/TTG
nâng Trường Hàng hải Việt Nam lên thành Trường Đại học Hàng
hải, đ/c Trần Thiện Vụ trưởng Vụ Giáo dục Bộ GTVT kiêm Hiệu
trưởng Nhà trường, đ/c Trần Ngọc Ân làm Bí thư Đảng ủy. Trường
thành lập khoa Tại chức-bổ túc, mở lớp bồi dưỡng sĩ quan cấp
trưởng, mở thêm ngành Điện tàu thủy. Tháng 01 năm 1977 Bộ
GTVT bổ nhiệm đ/c Trần Hữu Nghị Trưởng khoa Máy tàu; đ/c
Nguyễn Hữu Lý Trưởng khoa Lái tàu, đ/c Phan Xuân Ngọc Trưởng
khoa Điện. Tháng 4/1979 đ/c Lê Đức Toàn được bổ nhiệm làm Hiệu
trưởng.


8
1.6. Thời kỳ xây dựng và trưởng thành 1984-2000

Tháng 3/1984 Bộ GTVT Quyết định số 419QĐ/TCCB nhập trường
ĐHGTĐT vào Trường Đại học Hàng hải. Trường Đại học Hàng hải
giữ nguyên phiên hiệu, dấu và tài khoản; Đ/c Lê Đức Toàn được cử
làm Hiệu trưởng. Tháng 8/1989 Bộ GTVT chuẩn y mục tiêu,
chương trình, nội dung đào tạo các ngành học của Trường gồm: 10
ngành Đại học 5 năm, 01 ngành Đại học 4 năm và 2 ngành Trung

học đào tạo 3 năm. Tháng 9/1992, Nhà trường được Bộ Giáo dục và
Đào tạo cho mở đào tạo Cao học các ngành Bảo đảm an toàn Hàng
hải, Thiết bị năng lượng tàu thuyền, Điện tàu thủy, Đóng tàu, Xây
dựng công trình thủy, Kinh tế vận tải thuỷ…Tháng 4 năm 1997
PGS-TS Trần Đắc Sửu được bổ nhiệm làm Hiệu trưởng thay đ/c Lê
Đức Toàn.
Năm 1998 được mở thêm 3 ngành đào tạo hệ đại học: Điện tự động
công nghiệp, Kinh tế ngoại thương, Xây dựng dân dụng và công
nghiệp.
1.7. Trường Đại học Hàng hải phát triển và hội nhập (từ năm 2000

đến nay).
Năm 2004, Đ/c Đặng Văn Uy Phó Hiệu trưởng được bổ nhiệm chức
vụ Hiệu trưởng thay đ/c Trần Đắc Sửu.. được Bộ GTVT điều động
đảm nhiệm chức vụ Cục trưởng Cục Đường sông Việt Nam, đ/c
Phạm Tiến Tỉnh được Thảnh ủy cử làm Bí thư Đảng ủy. Tháng
9/2005 tại Đại hội Đảng bộ lần thứ XXIV nhiệm kỳ 2005 - 2008 đ/c
Đặng Văn Uy được bầu làm Bí thư.
Năm 2012, Đ/c Lương Công Nhớ Phó Hiệu trưởng được bổ nhiệm
chức vụ Hiệu trưởng thay đ/c Đặng Văn Uy.
2. Mục đích của đề tài

- Sử dụng OpenGL mô phỏng khu hiệu bộ và các khu nhà khác
giúp đưa hình ảnh trường tới gần mọi người.
- Mô phỏng giới thiệu về trường Đại Học Hàng Hải,Chỉ
đường,Quảng bá.

CHƯƠNG 2. CƠ SỞ LÝ THUYẾT
1. Giới thiệu.
Open GL: Được phát triển đầu tiên bởi Silicon Graphic, Inc., là một giao

diện phần phần mềm hướng thủ tục theo chuẩn công nghiệp hộ trợ đồ họa 3


9

chiều. Cung cấp khoảng 120 tác vụ để vẽ các primitive trong nhiều mode khác
nhau. Với OpenGL, bạn có thể tạo ra ảnh 3 chiều cả tĩnh và động với chất lượng
cao.
Là một giao diện phần mềm độc lập với phần cứng (hardware –
independent software interface) hộ trợ cho lập trình đồ họa. Để làm được điều
này, OpenGL không thực hiện các tác vụ thuộc về hệ điều hành cũng như không
nhận dữ liệu nhập của người dùng (người dùng giao tiếp với OpenGL thông qua
OpenGL API). Nó là lớp trung gian giữa người dùng và phần cứng. Nghĩa là nó
giao tiếp trực tiếp với driver của thiết bị đồ họa.
OpenGL - Open Graphics Library là một tiêu chuẩn kỹ thuật đồ họa có mục
đích định ra một giao diện lập trình ứng dụng API đồ họa 3 chiều. OpenGL cũng
có thể được dùng trong các ứng dụng đồ họa 2 chiều.
Giao diện lập trình này chứa khoảng 250 hàm để vẽ các cảnh phức tạp từ
những hàm đơn giản. Nó được dùng rộng rãi trong các trò chơi điện tử. Ngoài ra
nó còn dùng trong các ứng dụng CAD, thực tế ảo, mô phỏng khoa học, mô
phỏng thông tin, phát triển trò chơi.
2. Lập trình hiện đại.
2.1. Giới thiệu GLSL.
 Ngôn ngữ OpenGL Shading (viết tắt: GLSL hoặc GLslang ), là một cấp
cao ngôn ngữ bóng dựa trên cú pháp của ngôn ngữ lập trình C. Nó được tạo ra
bởi các ARB OpenGL để cung cấp cho các nhà phát triển kiểm soát trực tiếp
của đường ống dẫn đồ họa mà không cần phải sử dụng ngôn ngữ lắp ráp
ARB hoặc ngôn ngữ phần cứng cụ thể.
Sơ đồ tổng quan quá trình truyền dữ liệu:


Hình 2.2.1.
Sơ đồ về quá trình dựng hình:


10

Hình 2.2.2.
Thay thế các chức năng cố định và các API:
 Card đồ họa gần đây cung cấp cho các lập trình viên khả năng xác định các chức

năng của hai giai đoạn được mô tả ở trên:
 Shaders đỉnh có thể được viết cho giai đoạn chuyển đổi Vertex.
 Fragment shaders thay thế Fragment Texturing và chức năng cố định màu của
đối tượng.
Vertex:
 Bộ xử lý đỉnh chịu trách nhiệm để chạy các shaders đỉnh. Đầu vào cho một

Shader đỉnh là các dữ liệu đỉnh, cụ thể là vị trí, màu sắc, normals của nó, vv, tùy
thuộc vào những gì các ứng dụng OpenGL gửi.
/*OpenGL mã sau sẽ gửi cho các bộ vi xử lý đỉnh một màu sắc và
vị trí đỉnh cho mỗi đỉnh*/
glBegin(...);
glColor3f(0.2,0.4,0.6);
glVertex3f(-1.0,1.0,2.0);
glColor3f(0.2,0.4,0.8);
glVertex3f(1.0,-1.0,2.0);
glEnd();


11


2.2. OpenGL/GLSL: Mô hình tổng quát:

Hình 2.2.3.
3. Nội dung.
3.1. Các hiệu ứng đã sử dụng trong dự án:
 Hiệu ứng Bump Maping:
Bump maping: là một kỹ thuật trong đồ họa máy tính để mô phỏng va
chạm mạnh và nếp nhăn trên bề mặt của một đối tượng. Điều này đạt được bằng
cách xáo trộn normals bề mặt của đối tượng và sử dụng các xáo trộn bình
thường trong quá trình tính toán chiếu sáng. Kết quả là một bề mặt rõ ràng gập
ghềnh hơn là bề mặt trơn mịn mặc dù bề mặt của các đối tượng cơ bản là không
thực sự thay đổi. Lập bản đồ băng được giới thiệu bởi Blinn vào năm 1978

Hình ảnh:

Hiệu ứng ánh sáng:
Hình 2.3.1.


12

4.1.Ánh sáng điểm:
Ánh sáng: là rất phức tạp. Sự tương tác giữa bề mặt và ánh sáng chủ yếu
được hiểu rõ về tính chất vật lý. Nhưng thực sự làm các công việc tính toán đầy
đủ cho sư tương tác giữa ánh sáng và bề mặt như hiện nay được hiểu là tốn kém.
Một mô hình chiếu sáng: là một thuật toán, một hàm toán học, xác định
mức độ bề mặt tương tác với ánh sáng.
Một bề mặt có màu xanh dưới ánh sáng trắng vì bề mặt hấp thụ tất cả các
tia sáng không có màu xanh của ánh sáng và chỉ phản ánh màu xanh.Nếu một

nguồn sáng chiếu một ánh sáng màu đỏ trên bề mặt, bề mặt sẽ rất tối, do bề mặt
hấp thụ ánh sáng không phải màu xanh.

Hình 2.4.1.
Vì vậy, màu sắc của một bề mặt là một sự kết hợp của các đặc điểm hấp thụ
của bề mặt (có bước sóng được hấp thụ hoặc phản xạ) và các bước sóng của ánh
sáng chiếu vào bề mặt đó.
Xấp xỉ đầu tiên được thực hiện là không phải tất cả các bước sóng vật
chất. Thay vì theo dõi hàng triệu bước sóng trong quang phổ nhìn thấy được,
chúng ta chỉ theo dõi 3 màu đỏ, xanh lá cây và xanh dương(RGB).
RGB cường độ ánh sáng phản xạ từ bề mặt tại một điểm đặc biệt là sự kết
hợp của ánh sáng RGB đặc điểm hấp thụ của bề mặt tại thời điểm đó và RGB
cường độ ánh sáng chiếu vào thời điểm đó trên bề mặt. Tất cả trong số này, ánh
sáng phản chiếu, ánh sáng nguồn, và sự hấp thụ bề mặt, có thể được mô tả trong
3 màu RGB, trên phạm vi [0, 1].


13

Cường độ ánh sáng chiếu trên một bề mặt phụ thuộc vào (ít nhất) hai
điều. Đầu tiên, nó phụ thuộc vào cường độ ánh sáng đi tới bề mặt từ một nguồn
ánh sáng. Và thứ hai, nó phụ thuộc vào góc giữa bề mặt và ánh sáng.
Xem xét một bề mặt phẳng hoàn toàn. Nếu chiếu một tia sáng với một
cường độ trực tiếp lên bề mặt, cường độ ánh sáng mà tại mỗi điểm dưới bề mặt
sẽ là một giá trị được biết, dựa trên cường độ của ánh sáng chia cho diện tích dự
được chiếu sáng trên bề mặt, diện tích bị ảnh hưởng bới góc chiếu sáng.

Hình 2.4.2.

Hình 2.4.3.



14

Ánh sáng khuếch tán: dùng để chỉ một tính chất đặc biệt của ánh sáng ảnh
hưởng tới bề mặt được tương tác, nơi ánh sáng đi từ nguồn ánh sáng và được
phản chiếu từ bề mặt với nhiều góc độ, thay vì phản chiếu như một tấm gương
hoàn hảo.

Hình 2.4.4.
Phương trình khuếch tán:

Trong đó: Cosin là góc tới của ánh sáng . Khi góc tới là 0 °, cosin của góc
này ở mức 1,0. Ánh sáng sẽ ở mức sáng nhất của nó. Khi góc tới là 90 °, cosin
của góc này sẽ được 0,0, vì vậy ánh sáng sẽ là 0. Giá trị nhỏ hơn 0 được kẹp 0.
4.2. Hướng nguồn sáng:
Góc tới là góc giữa các vector pháp tuyến của bề măt và hướng của ánh
sáng.
Nếu ta có một nguồn ánh sáng rất gần với một đối tượng, sau đó hướng về
phía ánh sáng có thể thay đổi đáng kể trên bề mặt của đối tượng đó. Như là
nguồn ánh sáng di chuyển xa hơn và xa hơn, hướng về phía ánh sáng khác nhau
ngày càng ít trên bề mặt của đối tượng.
Đèn gần và xa:


15

Hình 2.4.5.
4.3. Ánh sáng toàn cầu( ánh sáng hướng).
Ánh sáng toàn cầu khác ánh sáng điểm ở chỗ ánh sáng toàn cầu không có

hệ số suy giảm cường độ ánh sáng, khi đó hướng ánh sáng song song với nhau.

Hình 2.4.6.
Áp dụng:
Trong dự án sử dụng ánh sáng toàn cầu:
//C++
struct AnhSang
{


16

glm::vec4 ToaDoAnhSang;
glm::vec4 CuongDoAnhSang;
glm::vec4 CuongDoAnhSangMoiTruongXungQuanh;
};
//Shader:
uniform AnhSang
{
vec4 ToaDoAnhSang;
vec4 CuongDoAnhSang;
vec4 CuongDoAnhSangMoiTruongXungQuanh;
}AS;
//C++
struct VatLieu
{
glm::vec4 MauVL;
glm::vec4 MauKhuyechTan;
float CuongDoKhuyechTan;
float pendding[3];

};
//Shader
uniform VatLieu
{
vec4 MauVL;
vec4 MauKhuyechTan;
float CuongDoKhuyechTan;
}VL;
Sự khác biệt trên Shader và C++ trong struct vật liệu có thêm một
pendding[3] đó là một trong các đặc điểm kỹ thuật của OpenGL,
Để khởi tạo và chuyền dữ liệu dữa OpengGL và Shader ta phải khởi tạo và
truyền tham số cho shader:
VL.CuongDoKhuyechTan=45.0;
VL.MauKhuyechTan=glm::vec4(0.3f,0.3f,0.3f,1.0f);
VL.MauVL=glm::vec4(1.0f,0.0f,1.0f,1.0f);
glGenBuffers(1, &uniformVL);
glBindBuffer(GL_UNIFORM_BUFFER, uniformVL);
glBufferData(GL_UNIFORM_BUFFER, sizeof(VatLieu), &VL,


17

GL_STREAM_READ);
glBindBufferRange(GL_UNIFORM_BUFFER,
uniformVL,0, sizeof(VatLieu));

indexVL,

AS.CuongDoAnhSang=glm::vec4(1.0f,1.0f,1.0f,1.0f);
AS.CuongDoAnhSangMoiTruongXungQuanh=glm::vec4(0.3f,0.3f,0.3

f,1.0f);
AS.ToaDoAnhSang=glm::vec4(100000.0f,1000.0f,1000.0f,1.0f);
glGenBuffers(1, &uniformAS);
glBindBuffer(GL_UNIFORM_BUFFER, uniformAS);
glBufferData(GL_UNIFORM_BUFFER,
sizeof(AnhSang),
&AS, GL_STREAM_READ);
glBindBufferRange(GL_UNIFORM_BUFFER,
indexAS,
uniformAS,0, sizeof(AnhSang));
Trong xử lý mảnh:
out vec4 MauXuatRa;
vec4 TinhToanMauSac()
{
vec3 HuongAS;
if(KichHoatAnhSangCoDinh==0)
HuongAS=vec3(MatranBienDoi*AS.ToaDoAnhSang);
else
HuongAS=vec3(AS.ToaDoAnhSang);
vec3
BTVectorN=normalize(VectorPhapTuyenKhongGianMayAnh);
float GocToiAS=dot(BTVectorN,HuongAS);
GocToiAS = GocToiAS < 0.0001 ? 0.0: GocToiAS;
vec3
HuongNhinCuaMat=normalize(ToaDoKhongGianMayAnh);
vec3
VectorPhanGoc=normalize(HuongAS+HuongNhinCuaMat);
float GocToiPhanGoc=acos(dot(VectorPhanGoc,BTVectorN));
float EMu=GocToiPhanGoc/VL.CuongDoKhuyechTan;
EMu=-(EMu*EMu);

float Gauss=exp(EMu);
Gauss = GocToiAS != 0.0 ? Gauss: 0.0;


18

vec4
AnhSangTT=VL.MauVL*AS.CuongDoAnhSang*GocToiAS;
AnhSangTT+=VL.MauKhuyechTan*AS.CuongDoAnhSang*Gauss;
return AnhSangTT;
}
void main()
{
vec4
MauVLAS=VL.MauVL*AS.CuongDoAnhSangMoiTruongXungQua
nh;
MauVLAS += TinhToanMauSac();
MauXuatRa= MauVLAS;
}
- Sử dụng hiệu ứng Bump Mapping.
Bump Mapping là một trong những kỹ thuật chiếu sáng điểm ảnh, có
nghĩa là tất cả các tính toán chiếu sáng (ứng dụng của các phương trình
ánh sáng) được tính cho mỗi điểm ảnh. Sức mạnh của bộ vi xử lý đồ họa
hiện tại (hoặc GPU) làm cho nó có thể đạt được độ chính xác này trong
khi vẫn giữ tốc độ khung hình chấp nhận được.
Nhưng những khác biệt giữa Texture thường và Bump mapping là:
Thứ nhất, Bump mapping về cơ bản là một kỹ thuật multitexturing.
Thứ hai là tất cả các tính toán ánh sáng được thực hiện cho mỗi điểm ảnh.
Màu sắc cuối cùng của các điểm ảnh hiển thị trên màn hình được cho bởi
công thức sau:

If = Ia + Id + Is
Trong đó:
If: là cường độ của màu sắc cuối cùng pixel
Ia: là cường độ của màu sắc xung quanh
Id: là cường độ của màu khuếch tán
ls: của màu sắc phản chiếu
Ia là thành phần môi trường xung quanh Ia là kết quả của phép nhân giữa
các thành phần môi trường xung quanh của ánh sáng và các vật liệu của đối
tượng 3D.
Ia = Al * Am


19

Al là cường độ môi trường xung quanh của ánh sáng
Am là cường độ môi trường xung quanh của vật liệu
Id là cường độ của màu khuếch tán được tính như sau:
Id = DL * Dm * LambertTerm
DL là thành phần khuếch tán của ánh sáng và Dm của vật liệu.
LambertTerm: là góc cosin đữa hướng ánh sáng và pháp tuyến bề mặt
LambertTerm = max (N dot L, 0.0)
N: là vector pháp tuyến bề mặt được chiếu sáng
L: là vector hướng ánh sáng
Is: là múc sắc phản chiếu
Is = Sm x Sl x pow( max(R dot E, 0.0), f )
Is là từ xa phức tạp nhất để tính toán
Sl là cường độ phản chiếu của ánh sáng
Sm là cường độ phản chiếu của vật liệu
E là vector hướng nhìn máy ảnh vector và R là
L là hướng ánh sáng

R thu được:
R = reflect(-L, N)
Áp dụng:
[Vertex_Shader]
varying vec3 lightVec;
varying vec3 eyeVec;
varying vec2 texCoord;
attribute vec3 vTangent;
void main(void)
{
gl_Position = ftransform();
texCoord = gl_MultiTexCoord0.xy;
vec3 n = normalize(gl_NormalMatrix * gl_Normal);
vec3 t = normalize(gl_NormalMatrix * vTangent);
vec3 b = cross(n, t);
vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex);
vec3 tmpVec = gl_LightSource[0].position.xyz - vVertex;
lightVec.x = dot(tmpVec, t);


20

lightVec.y = dot(tmpVec, b);
lightVec.z = dot(tmpVec, n);
tmpVec = -vVertex;
eyeVec.x = dot(tmpVec, t);
eyeVec.y = dot(tmpVec, b);
eyeVec.z = dot(tmpVec, n);
}
[Pixel_Shader]

varying vec3 lightVec;
varying vec3 eyeVec;
varying vec2 texCoord;
uniform sampler2D colorMap;
uniform sampler2D normalMap;
uniform float invRadius;
void main (void)
{
float distSqr = dot(lightVec, lightVec);
float att = clamp(1.0 - invRadius * sqrt(distSqr), 0.0, 1.0);
vec3 lVec = lightVec * inversesqrt(distSqr);
vec3 vVec = normalize(eyeVec);
vec4 base = texture2D(colorMap, texCoord);
vec3
bump
=
normalize(
texture2D(normalMap,
texCoord).xyz * 2.0 - 1.0);
vec4
vAmbient
=
gl_LightSource[0].ambient
*
gl_FrontMaterial.ambient;
float diffuse = max( dot(lVec, bump), 0.0 );
vec4
vDiffuse
=
gl_LightSource[0].diffuse

*
gl_FrontMaterial.diffuse *
diffuse;
float specular = pow(clamp(dot(reflect(-lVec, bump), vVec), 0.0,
1.0),
gl_FrontMaterial.shininess );
vec4
vSpecular
=
gl_LightSource[0].specular
*
gl_FrontMaterial.specular *
specular;
gl_FragColor = ( vAmbient*base + vDiffuse*base + vSpecular)
* att;
}
Hiệu ứng sử dụng sự pha trộn dữa 2 kết cấu màu sắc và bình thường kết
cấu:


21

Hình 2.4.7.
4.4. Thuật toán phát hiện va chạm sử dụng sphere.

- Kỹ thuật va chạm, cho phép bạn di chuyển một quả cầu thông qua một thế
giới và phát hiện va chạm, nhưng cũng phản ứng sau khi va chạm theo một
cách mà các game thủ mong chờ. Kỹ thuật này cũng cho phép trượt dọc theo
bề mặt cũng như thực hiện dễ dàng lực hấp dẫn.
- Một va trạm mặt phẳng với quả cầu.


Hình 2.4.8.
Hình 2.4.8 cho thấy rằng nhiệm vụ của chúng tôi là không đơn giản như xác
định nơi các vector vận tốc cắt mặt phẳng. Như bạn có thể thấy, điều này gây
ra một vụ va chạm không chính xác bởi vì quả cầu đi mặt phẳng tại một
điểm khác so với điểm va chạm quả cầu / mặt phẳng. Chúng ta hãy xem xét
kỹ hơn sự va chạm chính xác:

Hình 2.4.9.
Trong hình 2.4.9, bạn có thể thấy rõ rằng các vector hình thành bởi các điểm
giao nhau và tâm của hình cầu, trùng với vector pháp tuyến mặt
phẳng. Chúng ta có thể đảo ngược quá trình này để xác định các điểm trên bề


22

mặt của quả cầu sẽ giao nhau với mặt phẳng trước khi chúng va chạm. Cụ
thể hơn ở hai hình ảnh sau:

Hình 2.4.10.
Hình 2.4.10 cho thấy các vector pháp tuyến mặt phẳng có thể được sử dụng
để xác định các điểm trên bề mặt của quả cầu mà cuối cùng sẽ giao mặt
phẳng.
- Phản ứng sau khi va chạm. Cho đến nay, chúng tôi đã chỉ nóivề làm thế nào
để đối phó với va chạm. Bất kỳ chuyên gia vật lý sẽ cho bạn biết rằng vector
vận tốc đại diện cho năng lượng dưới dạng đà. Một khi một vụ va chạm xảy
ra, có năng lượng còn sót lại (khoảng cách còn lại đến đích.) Một số năng
lượng được hấp thụ trong vụ va chạm (điều này thay đổi theo góc tới của vụ
va chạm.) Bạn có thể làm bất cứ điều gì bạn muốn với năng lượng còn sót lại
này , như phản xạ và trượt. Tôi sẽ bao gồm trượt vì nó là phổ biến

nhất. trượt, ở dạng đơn giản nhất được thực hiện dọc theo mặt phẳng trượt.

Hình 2.4.11.
Hình 2.4.11 minh họa quá trình trượt. Đầu tiên, một vụ va chạm được phát
hiện, và vector vận tốc (dài đường chéo dòng màu xám) được cắt ngắn tại
điểm mà nó va chạm với máy bay. Số còn lại (năng lượng còn sót lại - tất cả
mọi thứ phía sau mặt phẳng) không được bỏ đi. Thay vào đó, điểm đến được
chiếu lên mặt phẳng cùng với vector pháp tuyến.

Hình 2.4.12.


23

Hình 2.4.12 cho chúng ta thấy rằng, như đã nói ở trên, khoảng cách trượt sẽ
thay đổi theo góc tới, thậm chí còn nghĩ các vectơ vận tốc ban đầu rất giống
nhau trong chiều dài.

Hình 2.4.13.
Hình 2.4.13 là các mặt phẳng trượt , giống như bất kỳ mặt phẳng, được xác
định bởi một nguồn gốc (một điểm) và một pháp tuyến. Nguồn gốc với mặt
phẳng trượt là điểm giao nhau với hình cầu. Pháp tuyến của mặt phẳng này là
vector từ điểm giao nhau đến trung tâm của hình cầu.
CHƯƠNG 3. XÂY DỰNG HỆ THỐNG
1. Xây dựng đối tượng đồ họa.
-

Cấu trúc chung lưu dữ liệu của đối tượng trong file *.xml:
<?xml version="1.0" encoding="utf-8"?>
<mesh>

<attribute index="0" type="float" size="3" >
<!--===========Point===============-->
</attribute>
<attribute index="1" type="float" size="3" >
<!--==========VecN=========-->
</attribute>
<attribute index="2" type="float" size="2" >
<!--===========TextCoord=========-->
</attribute>
<!--========VAO========-->
<vao name="5_HAT_NhaC8_BacThang_NhaC8_Plane.002" >
<source attrib="0" />
<source attrib="1" />
<source attrib="2" />
</vao>
<indices cmd="triangles" type="ushort">
<!--===========Index===============-->
</indices>
</mesh>
Trong đó:


24
 Point là tọa độ đỉnh.
 VecN là vector pháp tuyến của đỉnh .
 TextCoord là tọa độ của kết cấu của đỉnh.
 VAO là một đối tượng đại diện cho một đối tượng trong đồ

họa.
 Index là một mảng chứa thứ tự vẽ .

2. Các đối tượng
- Bể bơi hàng hải.
Được tạo bởi tổng cộng 13770 đỉnh và lưu trong 5 file *.xml
 1_BeBoiHangHai.xml
<?xml version="1.0" encoding="utf-8"?>
<mesh>
<!--===========Point===============-->
<attribute index="0" type="float" size="3" >
-140.6345 0.06892 -131.88
-140.6345 3.905406 -131.88
-140.981 3.905406 -131.88
.....
-142.5317 4.441772 -131.347
-142.5317 4.224913 -131.347

</attribute>
<!--==========VecN=========-->
<attribute index="1" type="float" size="3" >
0 0 -1
0 0 -1
0 0 -1
001
.....


25

001
001
001


</attribute>
<!--===========TextCoord=========-->
<attribute index="2" type="float" size="2" >
0.802631 0.688248
0.802631 0.792851
.....
0.863748 0.532611
0.874725 0.497476
0.864047 0.497423

</attribute>
<!--========VAO========-->

-->

×