Chương trình WAVE có thể được đóng gói để chạy nhưmột ứng dụng riêng biệt,
tuy nhiên, vì trong chương trình chúng ta sử dụng các thư viện của WAVE để chạy nên
chúng ta sẽ gộp chung chương trình hiển thị và WAVE vào chung một project của
Netbeans cho thuận tiện hơn khi chạy.
143 trang |
Chia sẻ: lylyngoc | Lượt xem: 2959 | Lượt tải: 3
Bạn đang xem trước 20 trang tài liệu Luận văn -Xây dựng hệ thống mô phỏng và thực tại ảo sử dụng ngôn ngữ WAVE, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
,1) và
CREATEGRID(5,5;6,1). Tuy nhiên CREATEGRID(5,5;6,1) có các điểm được quy
ước ngầm như bên dưới:
Hình 3-19 minh họa cho lưới thực địa ngầm định trong trường hợp gốc tọa độ ở vị
trí (6-1)
Mã được viết trong chương trình để tạo ra một lưới rất đơn giản.Ban đầu, chương
trình đặt biến trạng thái status. Khi khởi tạo chương trình, biến này sẽ có giá trị bằng 0.
6 7 9 8
1
10
4
2
5
3
Hình 4-19.Lưới thực địa với gốc là tọa độ (6-1)
68
Khi chương trình hiển thị nhận được một thông điệp và kiểm tra xem thông điệp đó có
chứa lệnh điều khiển để tạo ra một lưới hay không, nếu đó là lệnh tạo lưới, chương trình
sẽ phân tích lệnh này tiếp nhằm kiểm tra các tham số của lệnh có phù hợp và đúng với
định dạng của lệnh tạo lưới hay không. Đoạn mã dưới được cài đặt vào trong chương
trình:
69
Sau khi phân tích dữ liệu và lấy được ra tham số phù hợp với lệnh, chương trình sẽ
gọi đến hàm tạo lưới:
Hàm này, thực chất chỉ thay đổi biến status thành 1 và thiết lập độ dài và độ rộng
cho lưới, còn việc hiển thị lưới được đặt trong trong hàm paintComponent:
4.4.5. Tạo chướng ngại vật
Chướng ngại vật là tập hợp của các hình vuông. Mỗi một chướng ngại vật khi được
thiết lập chương trình hiển thị sẽ thiết lập và tạo ra tại nút tương ứng một hình vuông
được tô màu, để tạo ra một chướng ngại vật liên tiếp tại nhiều nút khác nhau cần truyền
vào cho chương trình hiển thị vị trí của các nút tương ứng và chương trình sẽ hiển thị hình
vuông tại mỗi nút đó.
if (status == 1) {
int x_grid = translation_x;
int y_grid = translation_y;
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
g.drawRect(x_grid, y_grid,
similar_width, similar_width);
x_grid += similar_width;
}
x_grid = translation_x;
y_grid += similar_width;
}
}
private void createGrid(int num_x, int num_y) {
x = num_x;
y = num_y;
status = 1;
repaint();
}
70
Để tạo ra một chướng ngại vật, câu lệnh để tạo có định dạng:
CREATEOBST(x,y):
Trong đó:
CREATEOBST: mã lệnh tạo chướng ngại vật
x: vị trí của chướng ngại vật theo chiều ngang
y: vị trí của chướng ngại vật theo chiều dọc
Ví dụ, chúng ta muốn tạo một chướng ngại vật tại nút có tọa độ (4,4), câu lệnh tạo
chướng ngại vật là: CREATEOBST(4,4)
Hình 4-20. Chướng ngại vật tại tọa độ (4,4)
Muốn tạo một chướng ngại vật theo hình tam giác tại (2,2), (2,3), (3,2) chúng ta phải
sử dụng liên tiếp: CREATEOBST(2,2), CREATEOBST(2,3), CREATEOBST(3,2)
71
Hình 4-21. Chướng ngại vật được tạo liên tiếp
4.4.6. Di chuyển
Sự di chuyển vị trí của một nút từ vị trí này đến vị trí khác thực ra chỉ là các thủ tục:
xóa nút ở vị trí cũ và tạo ra một nút giống hệt nút cũ ở vị trí mới.
Để tạo ra một nút mới, cần truyền cho chương trình hiển thị một lệnh có định dạng:
CREATENODE(x,y,color)
Để xóa một nút, cần truyền cho chương trình hiển thị một lệnh có dạng:
DELETENODE(x,y,color)
Trong đó:
CREATENODE: mã lệnh tạo nút
DELETENODE: mã lệnh xóa nút
72
x: vị trí của nút theo chiều ngang
y: vị trí của nút theo chiều dọc
color: màu của nút
Màu của nút được quy ước:
0: Black (màu đen)
1: White (màu trắng)
2: Red (màu đỏ)
3: Blue (màu xanh)
Để di chuyển một nút từ tọa độ(x1,y1) có màu color đến tọa độ(x2,y2), câu lệnh di
chuyển như sau:
MOVEFROMTO(x1,y1,color;x2,y2)
Ví dụ, chúng ta tạo ra một nút có màu đỏ tại tọa độ (1,1) và một nút màu xanh tại tọa
độ (3,2):
CREATENODE(1,1,2)
73
Hình 4-22. Tạo node với tọa độ (1-1) và màu đỏ
Hình 4-22 minh họa cho việc tạo node với màu đỏ trên lưới thực địa
CREATENODE(3,2,3)
Hình 4-23.Tạo node với tọa độ (3-2) và màu xanh
Hình 4-23 minh họa cho việc tạo node với màu xanh trên lưới thực địa
Sau đó, chúng ta di chuyển nút màu đỏ sang tọa độ (2,2):
74
MOVEFROMTO(1,1,2;2,2)
Hình 4-24. Di chuyển node trên lưới thực địa
Hình 4-24 minh họa cho việc di chuyển một node trên lưới thực địa sang một vị trí
mới.Trong hình trên, màu đỏ đã di chưyển từ vị trí (1-1) sang (2-2).
75
CHƯƠNG 5. CÁC BÀI TOÁN MÔ PHỎNG PHỨC TẠP
5.1. Bài toán “Hồng cầu, Bạch cầu, Virus”
5.1.1. Mô tả chung
Trong chương trước, chúng ta đã làm quen được với các bài toán cơ bản khi sử dụng
ngôn ngữ Wave trong việc mô phỏng. Chương này sẽ giới thiệu một bài toán phức tạp
hơn, ứng dụng đầy đủ các bài toán trước. Đó là bài toán mô phỏng hồng cầu, bạch cầu,
virus. Chúng ta sẽ sử dụng lưới để mô phỏng không gian thực địa. Các đối tượng sẽ có thể
di chuyển theo 4 hướng trong lưới: đi lên, đi xuống, sang bên phải, sang bên trái. Chúng
ta có ba loại đối tượng đó là đối tượng hồng cầu, đối tượng bạch cầu, và đối tượng virus.
Hồng cầu là đối tượng di chuyển tự do trong không gian.Virus luôn tìm cách tiếp cận
hồng cầu và ăn hồng cầu đồng thời sản sinh ra virus mới. Bạch cầu luôn tìm virus để tiêu
diệt.Tùy vào độ lớn của virus mà cần 1 số lượng bạch cầu để tiêu diệt.
5.1.2. Hồng cầu
Mô tả
Đây là đối tượng di chuyển tự do. Hồng cầu khởi đầu có số lượng nhiều nhất. Khi
gặp virus, hồng cầu sẽ bị virus ăn và biến mất.
Thuật toán
76
5.1.3. Bạch cầu
Mô tả
Đối tượng bạch cầu khi di chuyển luôn tìm kiếm virus. Nếu không thấy, nó sẽ di
chuyển tự do trong không gian. Khi gặp virus, hồng cầu sẽ chết đi và làm cho virus bị suy
yếu.
Thuật toán
77
5.1.4. Virus
Mô tả
Đối tượng virus luôn tìm hồng cầu để gây bệnh. Nếu không tìm thấy hồng cầu, virus
sẽ di chuyển tự do. Khi ăn được hồng cầu, virus sẽ sinh ra một virus khác. Mỗi virus sẽ có
một chỉ số sức khỏe nhất định. Khi gặp bạch cầu, virus sẽ bị suy yếu, giảm chỉ số sức
khỏe. Nếu chỉ số sức khỏe xuống mức 0, virus sẽ bị chết.
Thuật toán
78
79
5.2. Bài toán “Rầy nâu”
5.2.1. Mô tả chung
Sơ bộ về cây lúa
Lúa (Oryza sativa L.) gồm 3 loại: Indica, Japonica, Javanica. Các giống lúa nhiệt đới
thuộc loại Indica, các giống lúa ôn đới thuộc loại Japonica, còn loại Javanica có hạt rất
dài, hàm lượng amylose từ 20 - 25 thì rất ít gặp. Giống địa phương là những giống cổ
truyền được gieo trồng theo tập quán địa phương, thường cao gầy, dễ đổ, năng suất thấp,
yêu cầu phân bón ít.
Chu kỳ sinh trưởng của cây lúa trải qua 6 giai đoạn: mạ, đẻ nhánh, làm đòng, ngậm
sữa, trổ bông và chín rộ.
Hạt lúa sau khi chín có thời gian ngủ nghỉ vài ba tuần hoặc lâu hơn. Đặc tính này có
lợi cho vùng nhiệt đới nóng và ẩm, đặc biệt khi bị ngập nước và lúa đổ.
Sơ bộ về sâu rầy nâu
Chu kỳ sinh trưởng và phát triển sâu rầy nâu
Rầy nâu hay còn gọi là muội nâu,có tên khoa học là Nilaparvata lugens Stal, thuộc
họ muội bay (Delphacidae), bộ cánh đều (Homoptera). Nó có ở các vùng trồng lúa trong
nước và thế giới. Ngoài cây lúa, rầy nâu còn có thể phá hoại trên các cây ngô, mì, mạch,
kê, cỏ gấu, cỏ lồng vực...
Vòng đời của rầy nâu thay đổi theo mùa, trải qua 3 giai đoạn chính: thời gian trứng,
rầy non, rầy trưởng thành.
Rầy trưởng thành sau khi vũ hoá 3 - 5 ngày thì bắt đầu đẻ trứng, thời gian đẻ trứng
dài. Mỗi con cái có khả năng đẻ từ 71 - 408 quả trứng, thường đẻ vào buổi chiều. Thời
gian trứng nở phụ thuộc nhiều vào yếu tố ngoại cảnh. Trứng rầy nâu ở nhiệt độ 18.7 -
21.6o C, qua 13 - 14 ngày thì nở, ở nhiệt độ 23.4 - 29.6o C qua 5 - 9 ngày nở. Trứng nở rải
rác trong một ngày. Tỉ lệ trứng nở cao trên 90%.
80
Rầy non ít di động, thường tập trung hút dịch cây ở phần dưới khóm lúa. Nếu khua
động có thể nhảy hoặc bỏ trốn.
Rầy trưởng thành có hai dạng: cánh dài và cánh ngắn. Tỉ lệ xuất hiện cửa các dạng
phụ thuộc vào điều kiện nhiệt độ, độ ẩm, và dinh dưỡng. Nhiệt độ thấp, độ ẩm cao, thức
ăn phong phú thì xuất hiện dạng cánh ngắn nhiều. Nhiệt độ cao, độ ẩm thấp, thức ăn
không thích hợp thì xuất hiện dạng cánh dài nhiều. Rầy dạng cánh ngắn có tuổi sống dài,
tỉ lệ cái/đực cao, số lượng rầy đẻ trứng cao hơn cánh dài. Do đó khi rầy cánh ngắn xuất
hiện nhiều thì có khả năng thành dịch. Rầy trưởng thành có thể sống từ 3 - 50 ngày.
Nhìn chung, thời gian sinh trưởng phát dục các giai đoạn của rầy nâu biến động như
sau:
• Trứng: 5.5- 14 ngày.
• Rầy non: 12.5 - 32.5 ngày.
• Rầy trưởng thành: 3 - 50 ngày.
Quy luật phát sinh phát triển và các yếu tố ảnh hưởng
Rầy thường tập trung thành đám ở trên thân cây lúa dưới khóm để hút nhựa, làm cho
cây khô héo và chết. Khi bị khua động thì bỏ trốn bằng cách bò ngang, nhảy sang cây
khác, hoặc xuống nước, hoặc bay xa đi chỗ khác. Ban ngày rầy ít hoạt động ở trên lá lúa,
chiều tối bò lên phía trên thân lúa hoặc lá lúa. Khi lúa ở thời kỳ chín, phần dưới của thân
lúa đã cứng khô thì ban ngày rầy tập trung phía trên cây lúa hoặc gần chỗ non mềm của
cuống bông để hút nhựa, làm cho bông lúa bị lép một nửa hoặc toàn bộ. Rầy nâu còn là
véc tơ truyền bệnh lúa lùn xoăn lá gây thiệt hại rất lớn cho mùa màng.
Kinh nghiệm thực tế nhiều năm cho thấy khi ruộng lúa xuống giống được khoảng
20-25 ngày, lúa bắt đầu “phát” thì cũng là lúc Rầy nâu cánh dài từ nơi khác di chuyển đến
đẻ trứng tạo thế hệ Rầy non thứ nhất. Nếu gặp điều kiện thuận lợi Rầy sẽ nhanh chóng
tích lũy số lượng và tạo thế hệ rầy non thứ hai vào khoảng 50-55 ngày sau khi gieo sạ (lúc
lúa làm đòng) và thế hệ Rầy non thứ ba vào khoảng 30 ngày sau đó (sau trổ-ngậm sữa).
81
Những năm có dịch thường Rầy sẽ gây “cháy rầy” vào hai đợt rầy sau (nhất là ở đợt rầy
non thứ ba), vì thế cần hết sức cảnh giác với hai đợt rầy này. Như vậy, một năm rầy nâu
có thể sinh thành 6 -7 lứa. Trong đó có 2 lứa cần được chú ý theo dõi để phòng trừ, đó là
lứa rầy phá hại vào tháng 4 - 5 (đối với vụ chiêm xuân, đặc biệt vùng chiêm trũng) và lứa
tháng 7 - 9 (đối với vụ mùa).
Rầy nâu phát sinh gây hại thường đầu tiên xuất hiện thành từng vạt giữa ruộng, sau
đó lan dần ra quanh ruộng. Qui luật phát sinh và mức độ gây hại liên quan nhiều đến yếu
tố sinh cảnh. Thường thường nếu trước một thời gian nào đó nhiệt độ không khí cao, độ
ẩm cao, lượng mưa nhiều, sau đó trời hửng nắng, nhiệt độ cao, độ ẩm thấp thì rầy nâu dễ
phát sinh thành dịch. Thông thường nhiệt độ 20 - 30oC và độ ẩm 80 - 85 % là điều kiện
thích hợp cho rầy nâu sinh sống và phát triển.
Mức độ và triệu chứng tác hại
Sâu rầy nâu là một trong những loại sâu được xếp vào hàng sâu bệnh nguy hiểm cho
cây lúa. Chúng chích hút nhựa làm cây khô héo và chết hoặc làm cho bông lúa bị lép một
nửa hoặc toàn bộ, làm giảm năng suất cây trồng và giảm chất lượng sản phẩm. Ngoài ra,
rầy nâu còn là vectơ truyền bệnh vàng lùn và lùn xoắn lá - một bệnh cực kỳ nguy hiểm,
gây nhiều thiệt hại cho cây trồng.
Năm 1958, rầy nâu phát sinh thành dịch phá hại lúa chiêm từ thời kỳ trổ - chín ở
các tỉnh phía Bắc. Vụ mùa năm 1962 và 1971, rầy nâu đã gây nhiều thiết hại lớn cho lúa
như ở Nghệ An. Ở các tỉnh phía Nam từ năm 1970, rầy nâu đã gây thiệt hại nặng trên các
giống lúa NN8, NN5, NN20 ở nhiều tỉnh thuộc đồng bằng sông Cửu Long, đồng bằng ven
biển khu 5 và Thừa Thiên.
Năm 1974, diện tích lúa bị rầy nâu hại ở các tỉnh phía Nam lên tới 97.869 ha. Từ
năm 1975, đặc biệt từ tháng 11/1977, trong suốt 3 tháng từ tháng 11 – 1, rầy nâu gây
thành dịch trên diện tích lúa rộng 200.000 ha. Các tỉnh Bến Tre, Tiền Giang và Long An
là nơi bị rầy hại nghiêm trọng nhất (Tài liêu Cục bảo vệ thực vật)
82
Trong những năm gần đây, đặc biệt là vụ hè thu năm 2005 - 2006, nạn rầy nâu,
kéo theo là dịch bênh vàng lùn xoắn lá lại trở lại, gây thiệt hại trên diện tích lúa rộng hơn
73.000 ha. Các tỉnh vùng Đồng bằng sông Cửu Long bị thiệt hại nặng nhất.
Bài toán dự đoán
Giới thiệu bài toán dự đoán tổng quát
Trong thực tế, có rất nhiều vấn đề cần được dự toán trước. Một ví dụ đơn giản, một
câu lạc bộ có truyền thống là tổ chức buổi tiệc thường niên cho tất cả các thành viên của
câu lạc bộ và cả bạn bè của họ, có thể gặp gỡ. Những người có ý định tham dự sẽ báo
trước cho ban tổ chức chậm nhất là trước nửa tháng. Vấn đề đặt ra là ban tổ chức muốn
dự đoán số người thực sự sẽ đến dựa trên cơ sở số người báo trước là bao nhiêu để tránh
phí phạm. Hay trong kinh kế, người ta muốn dự đoán giá cả thị trường tăng hay giảm để
quyết định việc mua hay bán các mặt hàng sao cho có lãi nhất. Rất nhiều nhiều các nhu
cầu dự đoán khác trong tương lai làm cơ sở cho phương hướng hoạt động của cá nhân, tập
thể trong thời gian tới. Bài toán đặt ra là, chúng ta có thể xây dựng một mô hình toán học
dựa trên các yếu tố ảnh hưởng tới vấn đề cần dự đoán để dự đoán một vấn đề nào đó hay
không.
Hướng tiếp cận bài toán
Có hai hướng tiếp cận chính để dự đoán. Hoặc là ước lượng giá trị tương lai dựa
trên phân tích các nhân tố có ảnh hưởng tới các giá trị tương lai (phương thức chứng minh
(the explanatory method)), hoặc là dự đoán dựa trên việc suy luận từ các dữ liệu tổng quát
trên thực tế đã xảy ra theo thời gian (phương thức ngoại suy - the extrapolation method).
Trong phương thức chứng minh, từ các nhân tố có ảnh hưởng tới các giá trị tương
lai, ta xây dựng một hàm tương quan. Từ đó, ta có thể dự đoán giá trị tương lai khi có giá
trị các nhân tố ảnh hưởng.
Trong phương thức ngoại suy, các dữ liệu tổng quát trên thực tế đã xẩy ra thường
biến thiên theo một quy luật nhất định. Bằng việc thu thập dữ liệu đã xẩy ra trong thời
gian dài, ta tìm ra quy luật biến thiên và từ đó, suy luận giá trị tương lai se xẩy ra
83
Giới thiệu bài toán đự đoán mật độ rầy nâu tên cây lúa
Như đã nói ở trên, sâu rầy nâu thường tập trung gây hại trên diện rộng ở một số thời
kỳ nhất định của vụ lúa. Bài toán đặt ra là chúng ta muốn dự đoán thời kỳ sâu gây hại
nặng nhất để có biện pháp phòng trừ thích hợp.
Hướng giải quyết
Để tìm được hướng giải quyết, ta nghiên cứu vòng đời, quy luật phát sinh gây hại của
rầy nâu và các yếu tố liên quan. Ta đã biết, qui luật phát sinh và mức độ gây hại của Rầy
nâu liên quan nhiều đến yếu tố sinh cảnh. Có hai yếu tố chính ảnh hưởng đến vòng đời và
mức độ gây hại của rầy nâu là: nhiệt độ và độ ẩm. Qua tài liệu thống kê, mặc dù mật độ
rầy nâu gây thiệt hại ở từng thời kỳ qua từng năm là có quy luật, song rất khó để xác định
được hàm tuyến tính để dự đoán mật độ rầy nâu gây hại trong thời gian tới một cách
chính xác chỉ bằng phương pháp mô hình hoá thống kê thông thường. Phương pháp dùng
ngôn ngữ WAVE để mô phỏng hành vi của Rầy từ đó tạo ra các dữ liệu thống kê theo
thời gian được đề xuất sử dụng rất hữu hiệu.
5.2.2. Chi tiết bài toán
Để đơn giản, coi nhiệt độ và độ ẩm là tham số theo ngày – tức là được cập nhật hàng
ngày.
Môi trường:
Môi trường trong bài toán này là ruộng lúa lớn. Môi trường được chia ra thành lưới
ô vuông, mỗi ô vuông ứng với một node, giữa các node cạnh nhau có link nối với nhau
thể hiện chúng tiếp giáp với nhau. Hàng ngày, số lượng lúa trong mỗi node sẽ tăng theo
một lượng nhất định. Rầy nâu đầu tiên sẽ xuất hiện trên khu vực giữa của lưới. Sau đó nó
sẽ lan rộng ra các node xung quanh, mỗi ngày lan được tối đa một node.
Tại mỗi node, ta định ra một số tham số sau:
• Nraytt: số lượng rầy trưởng thành trên 1 node
84
• Ntrung: số lượng trứng rầy trong 1 node
• Nlua: số lượng đơn vị thức ăn cho rầy trong 1 node
Mỗi Đối tượng Rầy có những tham số sau:
• Tuổi (tính theo ngày):
o Tuổi <14: dưới dạng trứng
o 14<Tuổi <32:rầy non
o Tuổi >32: rầy trưởng thành
• Di chuyển: Nếu node bên cạnh có Nlua lớn và Nraytt ít thì sẽ di chuyển đến node
đó. Nếu không nó sẽ ở lại node hiện tại đợi đến ngày tiếp theo.
• Ăn:
o rầy non ăn 1lúa/ngày
o rầy trưởng thành ăn 2 lúa/ngày
• Đẻ: rầy trưởng thành đẻ 8 trứng / ngày
• Chết: Rầy chết khi xảy ra các trường hợp sau
o Tuổi >60
o Nlua tại node hiện tại bằng 0 và nó cũng không di chuyển được vì xung
quanh không đạt được đủ điều kiện di chuyển.
Thuật toán
85
Với hệ thống:
86
Khởi tạo Nlua trên các node bằng 100
Khởi tạo thời gian Ntime bằng 1. Cứ sau một khoảng thời gian, ta sẽ tăng Ntime lên
1. Ntime tăng đến 110 (gần 4 tháng cho một vụ lúa).
Song song với việc tăng Ntime, ta sẽ tăng thêm Nlua ở mỗi node thêm một lượng
nào đó.
Cách thể hiện của chương trình
Chúng ta sẽ sử dụng hệ thống đi theo lượt. Cứ mỗi khi chạy xong một bước, chuỗi
wave rầy sẽ phải tạm dừng lại đợi chuỗi wave tăng Ntime và Nlua chạy thì mới tiếp tục
chạy tiếp.
87
CHƯƠNG 6. 3D VÀ THỰC TẠI ẢO
6.1. Giới thiệu công nghệ 3D
6.1.1. Công nghệ 3D
Các ứng dụng đồ họa thường thấy trên tivi hoặc trên máy tính thực ra chỉ là tập
hợp của các bức ảnh hai chiều. Các bức ảnh này, chỉ đưa ra hình chiếu của vật thể theo
một góc nào đó. Để theo dõi được hết vật thể, chúng ta cần chụp lại một số lượng lớn ảnh
hai chiều. Điều này đã gây nên sự hạn chế khác lớn của con người với vật thể được quan
sát. Công nghệ này được gọi là công nghệ 2D.
Ví dụ, nếu bạn muốn mua một chiếc xe đạp, bạn ghé thăm một trang web bán xe đạp
và tìm chiếc xe mà mình ưng ý. Tuy nhiên, trang web này chỉ có thể đưa cho bạn các
thông tin về chiếc xe và một số hình ảnh chụp được về nó.
Hình 6-1.Xe đạp được thể hiện với công nghệ 2D
88
Công nghệ 3D ra đời đã tạo ra một sự biến đổi to lớn giúp con người có thể quan
sát vật thể dưới dạng 3 chiều. Bạn có thể quan sát từng chi tiết trên vật thể, có thể quay
mọi hướng tương tự như ngoài đời vậy.
Hình 6-2.Xe đạp được thể hiện với công nghệ 3D
6.1.2. Giới thiệu về Java 3D
Java 3D được phát triển bởi Sun Microsystems. Java 3D thực ra là một giao diện
lập trình ứng dụng cho phép lập trình viên thiết kế và xây dựng các ứng dụng 3D. Chương
trình được viết bằng Java 3D có thể là một chương trình ứng dụng hoặc được nhúng vào
Applet. Các chương trình được viết bằng Java 3D có thể chạy trên bất cứ hệ điều hành
nào có cài đặt máy ảo Java và các thư viện hỗ trợ Java 3D.
6.2. Chương trình GnuPlot
GnuPlot là một chương trình mô phỏng được ứng dụng rộng rãi trong các ngành
khoa học với khả năng đưa ra đồ thị của các hàm và dữ liệu được đưa ra từ dòng lệnh.
89
Gnuplot được phát triển trên nhiều nền tảng khác nhau nên nó có nhiều phiên bản để chạy
trên các hệ thống cài đặt hệ điều hành riêng, do vậy nó chạy được trên Unix, Linux, IBM
OS/2, MS Windows, DOS, Macintosh, VMS, Atari và nhiều hệ điều hành khác.
GnuPlot được thiết kế nhằm mục đích phục vụ cho sinh viên và các nhà khoa học
để trực quan hóa các hàm và dữ liệu toán học, do vậy GnuPlot được phân phối miễn phí.
GnuPlot hỗ trợ vẽ đồ thị dưới dạng 2D và 3D. Nó có thể vẽ được hầu hết các đối
tượng hình học cơ bản và nâng cao như điểm, đoạn thẳng, hình hộp, vec tơ, bề mặt vật
thể, …
Bên dưới là đồ thị hàm sin(x) với x nằm trong khoảng từ -5 đến 5 dưới dạng 2D:
Hình 6-3.Đồ thị hàm sin(x)
Đồ thị được hiển thị dưới dạng 3D của hàm x2 + y2:
90
Hình 6-4.Đồ thị hàm x2 + y2 hiển thị 3D
6.3. Ngôn ngữ VRML
6.3.1. Khái niệm VRML và các phiên bản của VRML
VRML (Virtual Reality Modeling Language) là ngôn ngữ mô hình hóa thực tại ảo,
sử dụng mô hình phân cấp trong việc thể hiện các tương tác với đối tượng của mô hình.
Phiên bản đầu tiên của VRML là 1.0, nó được ra đời vào tháng 10 năm 1994. Các
file VRML 1.0 phải khai báo tại dòng đầu tiên của file nội dung #VRML V1.0 ascii.
Dưới đây là một file VRML 1.0:
91
Sau một thời gian VRML được cải tiến lên phiên bản 2.0 với nhiều ưu điểm hơn so
với 1.0 với các chức năng mạnh mẽ và trở thành một chuẩn phát triển cho các ứng dụng
đồ họa. Các file VRML 2.0 bắt buộc phải có #VRML V2.0 utf8 tại dòng đầu tiên.
#VRML V1.0 ascii
Separator {
Separator{
Material {
diffuseColor 0 1 1
}
Sphere { radius 10 }
}
Transform {
rotation 1 100 8 1
}
Separator {
Transform { translation 0 20 20 }
Material { diffuseColor 0 0 1 }
Sphere { radius 2 }
}
}
92
Ví dụ một một file VRML 2.0:
VRML ra đời nhằm mục đích xây dựng lên một ngôn ngữ internet 3D để phát triển
đồ họa 3D trên web.
6.3.2. Ngôn ngữ VRML
Các file VRML có phần mở rộng *.wrl, *.wgz, *.wrz. Trong đó wrl là định dạng
chuẩn, còn hai định dạng còn lại là các định dạng nén của VRML.
Thực chất các file VRML chỉ là các file văn bản nhưng nó được sắp xếp theo một
trật tự và quy tắc nhất định để mô tả về vật thể trong thế giới 3D.
#VRML V2.0 utf8
Transform {
translation -4 4 0
children
Transform {
rotation 0 1 1 0
children
Shape {
appearance
Appearance {
material
Material {
diffuseColor 1 0 0
}
}
geometry
Cylinder {
}
}
}
}
93
Một file VRML được cấu tạo từ các nút cơ bản. Các nút cơ bản này là các khối
hình học cơ sở dùng để tạo nên thế giới 3D. Các đối tượng hình học này bao gồm: hình
hộp (Box), hình trụ (Cylinder), hình nón (Cone), hình cầu (Sphere), …
Tọa độ trong VRML được quy ước như hình vẽ:
Với VRML 1.0, để vẽ một hình cầu với bán kính là 10, chúng ta chỉ cần khai báo:
Sphere { radius 10 }
Hình 6-6.Khối cầu với bán kính 10 trong VRML
VRML có các phép biến đổi là: phép quay, phép dịch chuyển, phép tỉ lệ.
x
y
z
Hình 5-5.Tọa độ trong VRML 6
94
Phép quay (Rotation): được sử dụng để cho phép quay trong không gian 3 chiều.
Cú pháp của phép quay: rotation x y z a – với x, y, z tương ứng là ba trục, a là góc quay.
Phép dịch chuyển (Translation): dịch chuyển đối tượng tới vị trí bất kỳ trong
không gian. Cú pháp của phép dịch chuyển: translation x y z - với x, y, z là các toạ độ
theo ba trục tương ứng.
Phép tỉ lệ (Scale): được hiểu như phép đồng dạng, cho phép nhân đối tượng với
các tỷ lệ khác nhau. Cú pháp của phép tỉ lệ: scale x y z - trong đó x, y, z là tỉ lệ theo ba
trục tương ứng.
Ba loại biến đổi trên được sử dụng bên trong nút Transform.
Ví dụ:
Transform {
translation 1 1 1
rotation 0 1 0 0.78
scale 2 1 2
}
6.4. Sử dụng Wave và GnuPlot
6.4.1. Giới thiệu chung
Trong các chương trước, chúng ta đã nói về việc sử dụng lưới thực địa trong môi
trường 2D. Nếu chúng ta thêm vào mỗi node giá trị Nodal z lưu giữ về độ cao, chúng ta
có thể làm việc được với môi trường 3D, đặc biệt là việc mô phỏng các địa hình động với
sự trợ giúp của các chương trình hiển thị đồ họa 3D, trong đó có GnuPlot.
95
6.4.2. Đọc file và tạo KN
Với sự trợ giúp của chương trình đọc file, ta sẽ lấy được tọa độ (x, y, z) tại mỗi
node. Từ đó ta sẽ có được tập các giá trị đầu vào để tạo KN. Việc tạo KN hoàn toàn giống
như tạo trong môi trường 2D nhưng chỉ khác một điểm là chúng ta có thêm một biến
Nodal Nz lưu giữ chiều cao (tọa độ z). Với sức mạnh của wave, chúng ta có thể lưu giữ
KN trên một hoặc nhiều máy, từ đó tạo điều kiện tốt cho việc xử lý song song trên nhiều
máy trong việc cập nhật hoặc duyệt KN để hiển thị file. Phần code tạo KN minh họa xin
xem thêm ở phần phụ lục A.
6.4.3. Cập nhật dữ liệu
Việc cập nhật dữ liệu có thể tiến hành hết sức đơn giản. Chúng ta chỉ việc thay đổi
giá trị độ cao bằng cách nhảy đến node có tọa độ (x-y) và thay đổi giá trị Nz(z) tương
ứng.
6.4.4. Duyệt KN và tạo file đầu vào cho GnuPlot
Việc duyệt KN có thể tiến hành bằng cách đi lần lượt qua từng node trong KN từ trái
qua phải, từ dưới lên trên. Cứ đi đến đâu, ta lưu ra giá trị x, y, Nz tương ứng. Nếu KN
phân tán trên nhiều máy, ta có thể làm tăng hiệu suất duyệt bằng cách sử dụng nhiều bộ
xử lý trên nhiều máy cùng duyệt KN một cách song song. Dữ liệu sau khi duyệt xong sẽ
trở thành đầu vào cho chương trình tạo file đầu vào cho GnuPlot. Phần hiển thị sẽ được
trình bày sau trong chương sau.
6.5. Thực tại ảo
6.5.1. Giới thiệu chung
Việc mô phỏng các đối tượng 3d trên máy tính ngày càng phổ biến. Các ngôn ngữ
hỗ trợ cho việc hiển thị cũng phát triển không ngừng. VRML là một trong những ngôn
ngữ hỗ trợ như thế. Trong mục này, chúng ta đề cập đến VRML 1.0. Kết hợp với ngôn
ngữ WAVE, chúng ta có thể mô phỏng được các thực thể 3d trong file VRML trên một
hoặc nhiều máy, tận dụng được sức mạnh xử lý song song và phân tán.
96
6.5.2. Đọc file và tạo KN
Với một chương trình parser VRML, chúng ta có thể dễ dàng đọc được các node
trong file VRML. Những node đó sẽ là đầu vào cho chuỗi wave tạo KN. Chương trình
Wave hiển thị cấu trúc của một file VRML dưới dạng cây. Sau khi tạo được KN từ file
VRML ban đầu, ta có thể tận dụng được sức mạnh của WAVE trong việc xử lý phân tán
trên nhiều máy, cập nhật trong lúc chạy và xử lý một cách song song, từ đó chúng ta đã
biến file VRML từ thực thể tĩnh thành thực thể động.
Ví dụ với 1 file VRML đơn giản:
#VRML V1.0 ascii
Separator
{
Separator
{
Material { diffuseColor 0 1 1}
Sphere { radius 10 }
}
Separator
{
Transform { translation 0 20 20 }
Material { diffuseColor 0 0 1 }
Sphere { radius 2 }
97
}
}
Thuật toán sinh Wave code tạo KN:
98
KN của chúng ta sau khi đọc file và tạo với WAVE
Hình 5-7 biểu diễn KN của Wave khi mô tả cấu trúc của file VRML. Việc duyệt nội
dung hoặc cập nhật file VRML đều rất đơn giản. Để duyệt nội dung một file VRML sau
đó sử dụng WAVE để tạo ra một KN cần phải qua một bước trung gian phân tích cú pháp
file VRML và trình bày dữ liệu của file VRML dưới một cấu trúc dữ liệu bao gồm các nút
và các nhánh con. Cấu trúc dữ liệu sẽ được sử dụng có cấu trúc dạng cây. Khi có cấu trúc
dữ liệu này và dữ liệu phân tích được gán chương trình sẽ lấy dữ liệu ra từ cây và đưa vào
KN một cách dễ dàng.
Chương trình phân tích dữ liệu của file VRML được gọi là parser, hiện tại chương
trình chỉ phân tích các file VRML đơn giản, hỗ trợ các dữ liệu phổ biến trong VRML 1.0.
Chương trình parser được thiết kế với thuật toán như sau:
1
start
3
2
1
2
1
1
2
1
1
1
1
p
Separator
Separator1
Material1 diffuseColor 0 1 1
Radius1 10Sphere1
Separator2
Material1 diffuseColor 0 1 1
Radius2 2Sphere1
Transform translation 0 20 20
1
Hình 6-7.KN dạng cây của file VRML
99
Thuật toán được thể hiện dưới dạng sơ đồ khối:
Bắt đầu
Đọc file VRML
Lấy nội dung file
Kiểm tra xem nội dung file có đúng chuẩn VRML 1.0 hay
không
Nếu không đúng, kết thúc
Nếu đúng chuyển sang bước tiếp theo
Lấy dữ liệu từng thành phần trong nội dung file VRML
Gắn dữ liệu nhận được vào từng nút tương ứng của dữ
liệu hình cây
Kết thúc
100
Nội dung file sau khi được đọc cần được duyệt lại và kiểm tra xem có tuân thủ theo
chuẩn VRML 1.0 hay không. Thuật toán kiểm tra được thiết kế với các dữ liệu trong file
VRML đơn giản, mặc dù chưa thể kiểm tra hết tất cả các trường hợp hợp lệ nhưng thuật
toán cũng đã kiểm tra được các cú pháp phổ biến của VRML 1.0 như tiêu đề file và dấu
kết thúc file. Đoạn chương trình kiểm tra sẽ được viết dưới dạng hàm, kết quả trả về của
hàm là TRUE hoặc FALSE. Nếu kết quả trả về là TRUE, nội dung của file được kiểm tra
là file VRML 1.0. Nếu kết quả trả về là FALSE, nội dung của file không tuân thủ đúng
tiêu chuẩn của file VRML 1.0. Đầu tiên, chúng ta sẽ gán một biến isVRML bằng FALSE,
biến này sẽ được dùng làm giá trị trả về của hàm kiểm tra. Sau đó kiểm tra dòng đầu và
ký tự cuối cùng của file để thay đổi giá trị của biến isVRML. Sau khi kiểm tra xong, hàm
trả về giá trị của isVRML là TRUE hay FALSE. Thuật toán có thể rút gọn bằng cách
kiểm tra đồng thời cả dòng đầu tiên lẫn ký tự cuối cùng để đưa ra kết quả, tuy nhiên, do
Bắt đầu
Đọc file
Lấy nội dung
file
Kết thúc
Lấy dữ liệu từng thành phần
Gắn dữ liệu nhận được và từng nút của cây
Không theo
chuẩn VRML 1.0
Theo chuẩn
VRML 1.0
Hình 6-8.Sơ đồ khối thuật toán Parser
101
trong quá trình duyệt là tuần tự nên ở đây, thuật toán kiểm tra từng điều kiện một sau đó
mới đưa ra kết quả.
Sơ đồ khối của thuật toán:
Bắt đầu
Đặt isVRML = FALSE
Duyệt nội dung file
Kiểm tra dòng đầu tiên của nội dung file
Nếu bắt đầu bằng #VRML V1.0 ascii (không phân
biệt hoa thường), gán isVRML = TRUE
Nếu không gán isVRML = FALSE
Kiểm tra ký tự kết thúc nội dung file VRML
Nếu ký tự là }, gán isVRML = isVRML ∩ TRUE
Nếu không phải là }, gán isVRML = isVRML ∩ FALSE
Trả về giá trị của isVRML
Kết thúc
102
Bắt đầu
isVRML = FALSE
line1 = Dòng đầu của file
endChar = Ký tự cuối cùng của file
line1 == “#VRML
V1.0 ascii”
isVRML = TRUE
Đúng
isVRML = FALSE
Sai
endChar == ‘}’
isVRML = isVRML ∩ TRUE isVRML = isVRML ∩FALSE
Đúng
Sai
Kết thúc
Sơ đồ khối thuật toán kiểm tra một file có phải là VRML hay khôngHình 6-9.Sơ đồ khối thuật toán kiể tra ột file có phải là VR L hay không
103
6.5.3. Cập nhật VRML
Sau khi kiểm tra nội dung của file tuân thủ đúng chuẩn của VRML 1.0, chúng ta cần
phải lấy dữ liệu từng thành phần của file sau đó gắn dữ liệu này vào cấu trúc cây của
chương trình.
Việc cập nhật file VRML rất đơn giản. Chúng ta chỉ cần thêm vào KN những node
tương ứng và cập nhật vào cây cấu trúc. Trong ví dụ dưới đây, chúng ta sẽ làm cho hình
cầu nhỏ quay quanh hình cầu lớn bằng cách thêm thuộc tính rotation cho nó. Node mới sẽ
kết nối với Seperator 2 theo link “1”. Số thứ tự của cách link cũ sẽ được cập nhật tăng lên
1 đơn vị để thể hiện thứ tự mới của các phần tương ứng trong file VRML. Với mỗi ba
giây, chúng ta sẽ cập nhật file một lần với giá trị rotation mới thể hiện việc hình cầu nhỏ
quay xung quanh hình cầu lớn.
104
6.5.4. Duyệt KN và tạo file VRML
Khi chúng ta đã có KN gồm tất cả các node, khâu cuối cùng trước khi hiển thị file
VRML đó là duyệt các node trên KN để đưa ra đầu vào cho chương trình tạo file VRML.
Thuật toán
Material1
Transform2
Separator
Separator1
star
Separator2
t ri l2
4
3
2
1
2
1
1
2
1
1
diffuseColor2 0 1 1
Sphere2
Transform1
Radius2 2
rotation1 0 20 20
Sphere1 Radius1 10
diffuseColor1 0 1 1 Material1
Translation1 0 20 20
1
1
1
1
1
Hình 6-10.KN sau khi thêm node mới
105
6.5.5. Thay đổi cách nhìn
Trong ngôn ngữ VRML, các đối tượng hình học được biểu diễn trong không gian
tại các vị trí đã xác định. Mặc dù là cố định nhưng chúng ta vẫn có thể thay đổi cách nhìn
của các vật thể này theo các hướng khác nhau, phụ thuộc vào việc chúng ta đặt nguồn
sáng ở đâu trong không gian và hướng nhìn của chúng ta từ phía nào. Hình bên dưới mô
tả một cách trực quan hơn về vấn đề này:
106
Để có thể thay đổi cách nhìn trong VRML, chúng ta sử dụng nút Transform và sử
dụng phép một trong các phép biến đổi dịch chuyển, xoay và tỉ lệ. Ban đầu nội dung của
file VRML được chuyển vào thành một KN như bên dưới:
Muốn thay đổi cách nhìn, chúng ta có thể sử dụng một, hai hoặc cả ba phép biến
đổi cùng một lúc. Ở đây chúng ta chỉ sử dụng phép biến đổi translation (dịch chuyển), chỉ
cần thay đổi giá trị của translation, file VRML có thể được nhìn thấy dưới một góc khác:
Separator
diffuseColor 0 1 1 0
Sphere
Transform
Radius 2
translation 0 20 20
Materia
Cách nhìn 1 Cách nhìn 2
Hình 6-11.Hai cách nhìn khác nhau trong VRML
Hình 6-12.Cách nhìn ban đầu
107
6.5.6. Hiển thị trên nhiều máy tính
Ngày nay, tính toán và xử lý song song là vấn đề được quan tâm nhiều nhất. Hiệu
năng của một máy tính dù cao đến đâu cũng chỉ đáp ứng được tối đa một số lượng công
việc nào đó. Tính toán và xử lý song song đem lại hiệu suất cao trong công việc. Để dễ
hình dung, chúng ta có ví dụ cụ thể về con người, với một khối lượng công việc A, theo
mô hình làm việc cũ, một người chỉ có thể làm công việc A, những người con lại không
thể tham gia vào công việc này. Thời gian để một người làm xong A là T. Ngày nay, công
việc A có thể được làm chung bởi một nhóm người, những người này cùng nhau làm công
việc A, thời gian để hoàn thành công việc giảm xuống rất nhiều, nhỏ hơn so với T nhiều
lần, phụ thuộc vào số lượng người tham gia. Như vậy, nhiều người tham gia làm cùng
một công việc sẽ nâng cao hiệu suất, giảm thời gian trễ.
Các tệp tin VRML được thiết kế đơn giản và cấu trúc dữ liệu của tệp tin VRML có
thể hình dung như cấu trúc dữ liệu của một cây với nhiều nhánh (lá) khác nhau. Bình
thường, việc hiển thị các tệp tin VRML cực kỳ đơn giản và nhanh chóng. Tuy nhiên, khi
dung lượng của tệp tin lớn dần, số nhánh tăng lên với số lượng cực kỳ lớn, lúc đó, vấn đề
hiển thị file bắt đầu phát sinh. Bộ nhớ của máy tính cần phải được cấp phát cho chương
trình hiển thị sẽ bắt buộc phải được nâng cấp đủ để hiển thị, bộ vi xử lý phải hoạt động
nhiều và chiếm tài nguyên của máy tính do số lượng đối tượng hình họa cần biểu diễn rất
lớn. Thông thường, các tệp tin VRML có kích thước lớn chiếm rất nhiều tài nguyên của
máy tính để hiển thị được, cũng có nhiều trường hợp không thể hiển thị được các tệp tin
Separator
diffuseColor 0 1 1 0
Sphere
Transform
Radius 2
translation 0 2 2
Materia
Hình 6-13.Một cách nhìn khác
108
có dung lượng lớn này. Như vậy, một máy tính có thể không đảm đương được nhiệm vụ
hiển thị một tệp tin VRML. Mục đích cuối cùng của người sử dụng là làm sao hiển thị
được nội dung này. Trong khi một máy tính là không thể nhưng nhiều máy tính sẽ là có
thể. Dựa vào cấu trúc linh hoạt của tệp tin VRML, chúng ta sẽ phân bổ các nhánh (nút)
trong tệp tin VRML tới các máy tính khác nhau để mỗi máy tính nhận nhiệm vụ hiển thị
từng nhánh. Tổng hợp tất cả các máy tính chúng ta sẽ quan sát được tổng thể nội dung cần
hiển thị của tệp tin VRML.
Trong thực tế, một trường đại học có nhiều cửa ra vào khác nhau, tại mỗi một cửa
ra vào sẽ có một khu vực bảo vệ. Mỗi khu vực bảo vệ chỉ có quyền kiểm soát và quản lý
khu vực của mình. Tất cả các khu vực đều chịu sự quản lý chung của một khu vực bảo vệ
Một máy tính không thể hiển thị được
Máy tính 1 Máy tính 2 Máy tính 3
Nhưng nhiều máy tính có thể hiển thị được
Hình 6-14.Hiển thị trên nhiều máy tính
109
cao nhất, khu vực này quản lý toàn bộ các khu vực khác và có quyền kiểm soát toàn bộ
mọi khu vực trong trường. Vấn đề nảy sinh trong trường này ở chỗ phải làm sao để mỗi
một khu vực khác nhau chỉ có quyền với khu vực đó mà không có quyền tại khu vực
khác, các sự việc tại khu vực này không làm xáo trộn khu vực kia và khu vực bảo vệ cao
nhất biết được việc làm và giải quyết được tại mọi khu vực.
Tương tự trong việc hiển thị tệp tin VRML, giả sử trong một chương trình, một file
VRML bao gồm 3 khu vực hiển thị, chúng ta cần mỗi một máy tính chỉ được nhìn thấy
một phần nội dung là mỗi môt khu vực hiển thị. Nếu để các máy tính đều hiển thị chung
một tệp tin VRML thì các máy này sẽ nhìn thấy được toàn bộ nội dung hình ảnh hiển thị
của tệp tin. Như vậy, vấn đề chưa được giải quyết. Phần trên, chúng ta đã biết, tệp tin
VRML có thể được hình dung việc tổ chức dữ liệu được thực hiện theo dạng cây nên ta
có thể phân chia việc hiển thị theo các nhánh khác nhau. Dựa vào đặc điểm này, chúng ta
sẽ chia từng nhánh, chính là các khu vực hiển thị, cho các máy tính. Mỗi máy tính sẽ chịu
trách nhiệm hiển thị từng nhánh. Do vậy đảm bảo được yêu cầu mỗi máy sẽ chỉ xem được
nội dung hình ảnh hiển thị là một phần hình ảnh của tệp tin VRML. Tại mỗi một máy
tính, công việc cập nhật nội dung cho nhánh đó sẽ không thể ảnh hưởng được tới các
nhánh còn lại, chính vì thế đảm bảo được quyền truy cập cho tệp tin được đặt ra ở trên đối
với một máy tính. Chúng ta sẽ thiết lập một máy tính có thể xem được toàn bộ nội dung
của tệp tin VRML, máy này đóng vai trò là máy tính trung tâm, nơi có thể biết được các
máy khác làm các công việc gì liên quan tới các nhánh, và cũng có thể sửa đổi nội dung
của các nhánh.
110
KN trong Wave có thể phân bố trên một hoặc nhiều máy. Trên một máy, chúng ta
có thể hiện thị từng phần hoặc toàn bộ file VRML. Bằng cách đặt node “start” và gắn
node đó với một nhánh trên cây KN trên một máy, ta có thể sử dụng duyệt và tạo ra file
VRML với nội dung là một phần hoặc toàn bộ file ban đầu. Bằng cách gọi chương trình
hiển thị VRML, ta có thể xem được file VRML vừa tạo được. Việc làm trên có thể làm
song song trên nhiều máy cùng lúc giúp chúng ta phân bố và hiển thị được file VRML
trên nhiều máy tính, góp phần làm tăng hiệu suất duyệt và hiển thị.
1
Máy tính trung tâm
3
2
1
Máy tính 1
2
Máy tính 2
3
Máy tính 3
Hình 6-15.Mỗi máy tính hiển thị một khu vực khác nhau
111
Material2
start2
1
1 Transform2
Separator
Separator1
start
Separator2
4
3
2
1
2
1
2
1
1
diffuseColor2 0 1 1
Sphere2
Transform1
Radius2 2
rotation1 0 20 20
Sphere1 Radius1 10
diffuseColor1 0 1 1 Material1
translation1 0 20 20
1
1
1
1
1
Hình 6-16. Đặt nút start tại một node khác node gốc
112
CHƯƠNG 7. CÀI ĐẶT VÀ THỬ NGHIỆM
7.1. Cài đặt
7.1.1. Các yêu cầu về phần cứng
Muốn cài đặt và chạy các chương trình mô phỏng và hiển thị tệp tin VRML, chúng
ta cần phải có những máy tính với phần cứng tối thiểu như sau:
- CPU Pentium 4
- Bộ nhớ màn hình 64MB
- RAM 128MB ( phụ thuộc vào yêu cầu tối thiểu của hệ điều hành được cài đặt)
- Màn hình, chuột, bàn phím
- Ổ đĩa cứng trống tối thiểu 30MB
Để chạy được các chương trình trên nhiều máy tính, chúng ta cần phải có từ hai máy
tính trở lên với cấu hình mỗi máy tối thiểu theo yêu cầu trên và mỗi máy phải có một card
mạng và kết nối mạng với nhau.
7.1.2. Các yêu cầu về phần mềm
Chương trình mô phỏng và hiển thị tệp tin VRML đòi hỏi từng phần mềm khác nhau
được cài đặt sẵn, để chạy được tất cả các chương trình, cần phải có tối thiểu các phần
mềm sau:
- Hệ điều hành Windows, Linux, Unix, … (Bắt buộc phải sử dụng Windows để
chạy chương trình GnuPlot và hiển thị tệp tin VRML tại các phiên bản hiện tại)
- JRE phiên bản 6
- Java 3D phiên bản 1.5.2
- Netbeans 6.1 (Dùng để chạy chương trình dễ dàng hơn)
- Bộ thư viện X3D
- GnuPlot phiên bản 4.2.5
113
7.2. Thử nghiệm
7.2.1. Sử dụng chương trình
Chương trình WAVE có thể được đóng gói để chạy như một ứng dụng riêng biệt,
tuy nhiên, vì trong chương trình chúng ta sử dụng các thư viện của WAVE để chạy nên
chúng ta sẽ gộp chung chương trình hiển thị và WAVE vào chung một project của
Netbeans cho thuận tiện hơn khi chạy.
Để chạy chương trình mô phỏng các bài toán ở dạng 2D, chúng ta cần phải chạy
chương trình là lớp Sim trong gói (package) sim của project WAVE. Khi mới được chạy,
chương trình sẽ xuất hiện cửa sổ chưa có nội dung.
Hình 7-1. Chương trình hiển thị khi mới được chạy
Sau khi chương trình hiển thị đã chạy, chúng ta chạy cả project WAVE (RUN
project) để chạy chương trình WAVE. Lúc này, chương trình WAVE cũng xuất hiện một
cửa sổ.
114
Hình 7-2. Chương trình WAVE khi bắt đầu chạy
Sau đó, để thực hiện mô phỏng cho một bài toán cụ thể, chúng ta chọn nút
Browse… của cửa sổ chương trình WAVE sau đó chọn các tệp tin tương ứng trong thư
mục Simulation để chạy tiếp chương trình.
115
7.2.2. Tạo lưới thực địa
Chúng ta muốn tạo lưới và hiển thị trên chương trình hiển thị, cần lựa chọn tệp tin
tạo lưới trong thư mục Simulation. Tùy thuộc vào nội dung mà chúng ta tạo lưới sẽ được
tạo khác nhau. Giả sử, ở đây, chúng ta tạo ra một lưới 5x5, chương trình hiển thị sẽ hiển
thị lưới ra màn hình:
Hình 7-3. Lưới 5x5
Chương trình WAVE cũng đưa ra thông báo, chúng ta có thể xem được tại cửa sổ
Output của Netbeans:
Hình 7-4. Cửa sổ output của Netbeans
116
7.2.3. Di chuyển tự do
Bài toán di chuyển tự do của một vật từ tọa độ (1-1) đến (5-5) được mô phỏng trong
chương trình có kết quả chạy như sau:
Hình 7-5. Vị trí đầu tiên 1-1
Hình 7-6. Chạy ngẫu nhiên tới vị trí tiếp theo
117
Hình 7-7. Các bước chạy ngẫu nhiên tiếp theo
118
Hình 7-9. Dừng khi chạy tới đích
7.2.4. Di chuyển tránh chướng ngại vật
Đối tượng di chuyển từ nút (1-1) đến (5-5) mà không đi qua chướng ngại vật
Hình 7-8. Tiếp tục chạy ngẫu nhiên
119
Hình 7-10. Di chuyển qua chướng ngại vật
120
7.2.5. Di chuyển vòng quanh chướng ngại vật
Hình 7-11. Vượt qua chướng ngại vật và về đến đích
121
Đối tượng đi vòng quanh chướng ngại vật mà không đi đến các điểm nằm cách xa
chướng ngại vật hoặc đi xuyên qua chướng ngại vật:
122
Hình 7-12. Di chuyển vòng quanh chướng ngại vật
123
Hình 7-13. Vòng quanh chướng ngại vật 1 vòng thì dừng
124
7.2.6. Di chuyển cùng nhau kiểu tịnh tiến
Hai đối tượng sẽ cùng nhau di chuyển đến đích:
7.2.7. Hiển thị hình ảnh 3D động bằng GnuPlot
Bằng cách sử dụng GnuPlot, chúng ta có thể hiển thị các hình ảnh 3D động trên
nhiều máy, mỗi máy hiển thị một phần hình ảnh động.
Hình 7-14. Di chuyển tịnh tiến cùng nhau
125
Hình ảnh hiển thị 3D trên máy thứ nhất với tọa độ x trong khoảng từ 1 đến 5:
Hình 7-15. Hình ảnh 3D trên máy thứ nhất sử dụng GnuPlot
Máy thứ hai hiển thị phần hình ảnh 3D tiếp theo với x nằm trong khoảng từ 6 đến
10:
Hình 7-16. Hình ảnh 3D trên máy thứ hai sử dụng GnuPlot
126
7.2.8. Hiển thị hình ảnh 3D của tệp tin VRML
Từ KN của WAVE, WAVE sẽ tạo ra một tệp tin VRML và chương trình sẽ hiển thị
tệp tin VRML này dưới dạng 3D:
Hình 7-17. Tệp tin VRML được hiển thị sau khi được tạo bởi KN
7.2.9. Hiển thị hình ảnh 3D với các góc nhìn khác nhau
Các vật thể được mô tả trong tệp tin VRML được mô tả giống như các vật thể trong
tệp tin VRML được hiển thị trong Hình 7-17, sau khi thay đổi Transform, nó lại được
hiển thị theo một cách khác:
127
Hình 7-18. Các đối tượng hiển thị theo cách khác thi thay đổi Transform
Hình 7-19. Một cách nhìn khác thi thay đổi Transform
128
7.2.10. Hiển thị hình ảnh 3D VRML trên nhiều máy
Các đối tượng khác nhau được đặt trên các máy khác nhau, mỗi một đối tượng được
hiển thị trên một máy. Từ một tệp tin VRML được hiển thị như Hình 7-17 bây giờ mỗi
máy sẽ nhận nhiệm vụ đưa ra từng đối tượng:
Trên máy thứ nhất hiển thị đối tượng đầu tiên là hình cầu to:
Hình 7-20. Hiển thị đối tượng đầu tiên trên máy 1
Máy 2 hiển thị hình cầu nhỏ:
129
Hình 7-21. Hiển thị đối tượng thứ hai trên máy 2
130
CHƯƠNG 8. PHỤ LỤC A – WAVE CODE
8.1. Tạo lưới đơn hướng
Fdimension_x=5.Fdimension_y=5.Fsign=`-'.
CR(
REPEAT(
Fcur_y+1.Fcur_y<=Fdimension_y.Fcur_x=1.
Fnode=Fcur_x.Fnode&Fcur_y.Fnode%Fsign.@#Fnode.
REPEAT(
(Fcur_y/=1.Frt=Frow:1.-y#Frt.FALSE!),
(Frow&CONTENT.
OS(
(Fcur_y/=1.Frow:1=NONE.FALSE!),
(Fcur_x<Fdimension_x.
Fcur_x+1.Fnode2=Fcur_x.
Fnode2&Fcur_y.Fnode2%Fsign.
+x#Fnode2
)
) )
)
) )
Tạo lưới trên nhiều máy
Fcomputer=`10.0.0.5’;`10.0.0.6’;`10.0.0.7’;`10.0.0.8’.
Fdimension_x=10.Fdimension_y=5.Fsign=`-'.
131
CR(
REPEAT(
Fcur_y+1.Fcur_y<=Fdimension_y.
MAP=Fcomputers:Fcur_y.
Fcur_x=1.
Fnode=Fcur_x.Fnode&Fcur_y.Fnode%Fsign.@#Fnode.
REPEAT(
(Fcur_y/=1.Frt=Frow:1.-y#Frt.FALSE!),
(Frow&CONTENT.
OS(
(Fcur_y/=1.Frow:1=NONE.FALSE!),
(Fcur_x<Fdimension_x.Fcur_x+1.
Fnode2=Fcur_x.Fnode2&Fcur_y.
Fnode2%Fsign.+x#Fnode2)
)
)
)
)
)
132
8.2. Tạo lưới theo đa hướng
Frow={
Fnode=Fcur_x.Fnode&Fcur_y.Fnode%Fsign.@#Fnode.
REPEAT(
(Fcur_y/=Fstart_y.Ftemp=Frow_address:1.
Flink_to_previous_row#Ftemp.FALSE!
),
(Frow_address&CONTENT.
OS(
(Fcur_y/=Fstart_y.Frow_address:1=NONE.FALSE!),
(
Fcur_x<Fdimension_x.Fcur_x+1.
Fnode2=Fcur_x.Fnode2&Fcur_y.Fnode2%Fsign.
+x#Fnode2
)
)
)
)
}.
Fdimension_x=5.Fstart_y=3.
CR(
133
MAP=`10.0.0.12'.Fcurrent_y=Fstart_y.^Frow.
(Fchange_y=1.Fstop_y=6.Flink_to_previous_row=-y),
(Fchange_y=-1.Fstop_y=0.
Flink_to_previous_row=+y.MAP=`10.0.0.13').
RP(Fcurrent_y+Fchange_y.Fcurrent_y/=Fstop_y.^Frow )
)
8.3. Di chuyển tự do
Fname=`a'.Fst=`1-5'.Finish_x=5.Finish_y=1.
Fdecom={Ft=C.Fdel=`-'.Ft|Fdel.Fx=Ft:1.Fy=Ft:2}.
@#Fst.Node_mark=2.
Fa=1;1.
Ft=`CREATENODE'.Ft&C.Ft&Node_mark.Fa:3=Ft.
Fa?program1.
RP(
Frout&C.^Fdecom.
OS
(
(C==Fst.TRUE!),
(Fcount+1.Fsource=Frout:Fcount.
Fcount+1.Fdes=Frout:Fcount.Fcount-1.
134
Ft=`Movefromto'.Ft&Fsource.Ft&`2'.
Ft&Fdes.Fa:3=Ft.Fa?program1.)
).
OS(
(Fx==Finish_x.Fy==Finish_y.
Ftemp=`route of'.Ftemp&Fname.Ftemp&`:'.Ftemp&Frout.
Fspace=` '.Ftemp%Fspace.ABORT!),
RANDOM(
((FyFinish_y.-y#)),
((FxFinish_x.-x#)) ),
STAY )
)
8.4. Di chuyển tránh chướng ngại vật
SQ(
(@#`2-4',@#`3-4',@#`2-3',@#`3-3'.Node_mark=4.
Fa=1;1.
Ft=`CREATEOBST'.Ft&C.Fa:3=Ft.Fa?program1),
(
Fname=a.Fstart=`1-5'.Finish_x=5.Finish_y=1.
Fdecom={Ft=C.Fdel=`-'.Ft|Fdel.Fx=Ft:1.Fy=Ft:2}.
@#Fstart.Node_mark=2.
Fa=1;1.
135
Ft=`CREATENODE'.Ft&C.
Ft&Node_mark.Fa:3=Ft.Fa?program1.
RP(
Frout&C.^Fdecom.
OS (
(C==Fstart.TRUE!),
(
Fcount+1.Fsource=Frout:Fcount.
Fcount+1.Fdes=Frout:Fcount.Fcount-1.
Ft=`Movefromto'.
Ft&Fsource.Ft&`2'.Ft&Fdes.Fa:3=Ft.
Fa?program1. )
).
OS(
(Fx==Finish_x.Fy==Finish_y.
Ft=`route of'.Ft&Fname.Ft&`:'.
Ft&Frout.Fdel=` '.Ft%Fdel.T=Ft.ABORT! ),
RANDOM(
(
(Fx<Finish_x.+x#),
(Fx>Finish_x.-x#)
),
(
(Fy<Finish_y.+y#),
(Fy>Finish_y.-y#)
136
).Node_mark==NONE.
),
STAY
)
)
)
)
8.5. Di chuyển vòng quanh chướng ngại vật
SQ(
(@#`3-3',@#`3-4',@#`4-4'.Node_mark=1.
Fa=1;1.
Ft=`CREATEOBST'.Ft&C.Fa:3=Ft.Fa?program1),
(Fstart=`3-5'.@#Fstart.Fa=1;1.
Ft=`CREATENODE'.Ft&C.Ft&`2'.Fa:3=Ft.Fa?program1.
RP(
Frout&C.
OS(
(C==Fstart.TRUE!),
(
Fcount+1.Fsource=Frout:Fcount.
137
Fcount+1.Fdes=Frout:Fcount.Fcount-1.
Ft=`Movefromto'.Ft&Fsource.
Ft&`2'.Ft&Fdes.Fa:3=Ft.Fa?program1. )
).
OS(
OP(
##.Node_mark==NONE.
AS(
(##.Node_mark/=NONE.TRUE!),
STAY
)
),
OP(
##.Node_mark==NONE.
AS(
(##.##.Node_mark/=NONE.TRUE!),
STAY
)
)
)
138
)
)
)
8.6. Nhìn trong không gian với độ sâu cho trước
SQ(
(
(@#`2-5'.Nobj=a),
(@#`2-3'.Nobj=b),
(@#`5-4'.Nobj=c),
(@#`2-1'.Nobj=w),
(@#`4-2'.Nobj=v)
),
(
Fob=`3-4'.Fdep_limit=2.
@#Fob.Freturn=C.
SQ(
RP(
Node_mark==NONE.Node_mark=1.
(Nobj/=NONE.Ftemp=Nobj.Ftemp&C.Fjoin=`:'.
139
Ftemp%Fjoin.Ftransit=Ftemp.
@#Freturn.Nwhat_you_see&Ftransit.DONE!
),
(Fdep+1.Fdep<=Fdep_limit.##)
),
(Ftemp=`object seen in'.Ftemp&C.
Ftemp&Nwhat_you_see.Fjoin=` '.Ftemp%Fjoin.
T=Ftemp)
)
)
)
8.7. Di chuyển cùng nhau kiểu tịnh tiến
8.7.1. Chuỗi wave chạy theo
Fode_mark=1.
Follower=b.Follower_start=`1-3'.
@#Follower_start.
Fa=1;1.
Ft=`CREATENODE'.Ft&C.Ft&Fode_mark.Fa:3=Ft.
Fa?program1.
140
RP(
Frout&C.
OS
(
(C==Follower_start.TRUE!),
(Fcount+1.Fsource=Frout:Fcount.
Fcount+1.Fdes=Frout:Fcount.Fcount-1.
Ft=`Movefromto'.Ft&Fsource.
Ft&Fode_mark.Ft&Fdes.Fa:3=Ft.Fa?program1. )
).
Nobj=Follower.
RP(Next_hop==NONE).Fnext=Next_hop.
Next_hop=NONE.Nobj=NONE.#Fnext
)
8.7.2. Chuỗi wave dẫn đầu
Flead=a.Follower=b.Fode_mark=3.
Flead_start=`2-3'.Follower_start=`1-3'.
@#Follower_start.#Flead_start.
Fa=1;1.
Ft&`CREATENODE'.Ft&C.
141
Ft&Fode_mark.Fa:3=Ft.Fa?program1.
RP(
Frout&C.
OS
(
(C==Flead_start.TRUE!),
(Fcount+1.Fsource=Frout:Fcount.
Fcount+1.Fdes=Frout:Fcount.Fcount-1.
Ft=`Movefromto'.Ft&Fsource.
Ft&Fode_mark.Ft&Fdes.Fa:3=Ft.Fa?program1.
)
).
SQ(
(#P.RP(Nobj/=Follower).DONE!),
(3?`sleep'.+x#),
(#P.Next_hop=P.DONE!)
)
)
142
CHƯƠNG 9. PHỤ LỤC B – TÀI LIỆU THAM KHẢO
TÀI LIỆU TIẾNG ANH
[1] Bell, G., A. Parisi, and M. Pesce, The Virtual Reality Modelling Language: Version
1.0 Specification, November 9, 1995.
[2] Bruno, J., and S. M. Altman, “A Theory of Asychronous Control Networks,” IEEE
Trans. Comput., Vol. C-20, No. 6, June 1971.
[3] Sapaty, P. S,. “Active Information Field as a Model for the Structural Solution of
Task on Graphs and Networds,” Proc. USSR Academy of Sciences: Technical
Cybernetics, No. 5, 1984 (in Russian).
[4] Varbanov, S., and P. S. Sapaty, “An Information System Based on the Wave
Navigation Techniques,” Abstr. International Conference, AIMSA’86, Varna,
Bulgaria, 1986.
[5] Sapaty, P.S., “The Wave-0 Language as a Framework of Navigational Structures
for Knowledge Bases Using Semantic Networks,” Proc. USSR Academy of
Sciences: Technical Cybernetics, No. 5, 1986 (in Russian).
[6] Borst, P., The First Implementation of the WAVE System for UNIX and TCP/IP
Computer Networks, TR 18/92, Faculty of Informatics, University of Karlsrule.
Karlsruhe, Germany, December 1992.
[7] Borst, P.M., H.-T Goetz, P. S. Sapaty, and W. Xorn, “Paralled Knowledge
Processing in Open Networks,” Proc. International Conference and Exhibition
“Hight- Perfor-mance Computing in Networks” (HPCN Europe ‘94), Munich,
Germany, April 1994.
[8] Corbin M. J., and P. S. Sapaty, “Distributed Object-Based Simulation in Wave,” J.
Simul. Pract. Theory, Vol. 3, No.3, pp. 157-181, 1995.
[9] Merchant F., L. F. Bic, P. M. Borst, M. J. Corbin, M. Dillencourt, M. Fukuda, and
P. S. Sapaty, “Simulating Autonomous Objects in a S patial Database Using
WAVE,” Proc. 9th European Simulation Multiconference, Prague, Czechoslovakia,
June 1995.
143
[10] Livatharas, C., “Integration of Heterogeneous Databases Using WAVE,”
M.Sc. Project Report, Department of Electrical Engineering, University of Surrey.
Surrey, England, August 1995.
[11] Vuong, S., and I. Ivanov, “Mobile Intelligent Agent Systems: WAVE vs.
JAVA,” Proc, etaCOM’96, Portland, Oreg., May 1996.
[12] Vuong, S., and L. Mathy, “Simulating the Mobile-IP Protocol Using Wave,”
Proc, etaCOM’96, Porland, Oreg., May 1996.
[13] Darling, J. C. C., P.S Sapaty, and M. J. Underhill, “Distributed Virtual Reality:
A Fully Dynamic Approach,” Proc. 15th Workshop on Standards for the
Interoperability of Distributed Simulations, Institute for Simulation and Training,
University of Central Florida, Orlando, Fla., September 1995.
[14] Tan, H. K. V,. “Distributed Dynamic 3D Virtual Reality,” M.Sc Telematics
Diploma Project (base on WAVE), Department of Electrical Engineering,
University of Surrey, Surrey, England, 1997.
[15] Peter Sapaty, “Mobile Processing in distributed and open environments”, 1998
WEBSITE THAM KHẢO
[16]
[17]
[18]
[19]
[20]
[21]
Các file đính kèm theo tài liệu này:
- LUẬN VĂN-XÂY DỰNG HỆ THỐNG MÔ PHỎNG VÀ THỰC TẠI ẢO SỬ DỤNG NGÔN NGỮ WAVE.pdf