Bài giảng Computer Graphics - Chương 9: Ngôn ngữ mô hình hóa thực tại ảo VRML

VRML Lịch sử

 VRML là một ngôn ngữ văn bản dùng để mô tả các môi trường tương tác

và các vật thể 3-D

 Các file text VRML có đuôi là .wrl

 VRML 1.0 dựa trên ngôn ngữ mô tả Silicon Graphics 3D gọi là “Open Inventor”. VRML

1.0 cho phép mô tả các cảnh tỉnh và không tương tác.

 VRML 2.0 là một ngôn ngữ mô tả dựa trên Silicon Graphics và đưc goi là “Moving

Worlds”.

 VRML1 (1994) & VRML2 (1997) có mở rộng thêm các chủ đề liên quan

 

pdf11 trang | Chuyên mục: Đồ Họa Máy Tính | Chia sẻ: yen2110 | Lượt xem: 232 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng Computer Graphics - Chương 9: Ngôn ngữ mô hình hóa thực tại ảo VRML, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
g vào, false ở vùng ra 
Page 9
Lờ Tấn Hựng CNTT- ĐHBK Hà nội
Email: hunglt@it-hut.edu.vn 
(c) SE/FIT/HUT 2002
Nút VisibilitySensor
„ Nút VisibilitySensor cảm biến nếu ng−ời dùng nhìn thấy hoặc ngừng 
quan sát một vùng nào đó
• center và size –tâm và kích th−ớc của vùng
• enterTime và exitTime – gửi thời gian vào\ra
• isActive –gửi giá trị true/false vào vùng vào\vùng ra 
„ DEF VisSense VisibilitySensor { center 0.0 0.0 0.0 size 14.0 14.0 14.0 
} ROUTE VisSense.enterTime TO Clock.set_startTime
(c) SE/FIT/HUT 2002
nút ProximitySensor
„ Nút ProximitySensor cảm biến khi ng−ời dùng vào/ rời khỏi một vùng nào đó
• center và size – kích th−ớc và vị trí của vùng
• enterTime và exitTime –gửi thời gian vào vùng vào/vùng ra
• isActive – gửi giá trị true/false nếu vào vùng vào/ vùng ra 
„ DEF ProxSense ProximitySensor { center 0.0 0.0 0.0 size 14.0 14.0 14.0 } 
ROUTE ProxSense.enterTime TO Clock.set_startTime 
„ ProximitySensor
• Nút ProximitySensor cảm biến khi ng−ời dùng đang ở trong 
vùng 
• position và orientation –gửi vị trí và h−ớng khi ng−ời dùng 
đang ở trong vùng
• DEF ProxSense ProximitySensor { . . . } ROUTE
• ProxSense.position_changed TO
PetRobotFollower.set_translation
Xem code Chạy ví dụ
(c) SE/FIT/HUT 2002
nút Collision
„ Nút Collision cảm biến đ−ợc khi tầm 
quan sát của ng−ời dùng v−ớng các vật 
thể
„ collide – cho phép/không cho 
phép cảm biến 
„ proxy – vật thể đơn giản đ−ợc 
cảm biến thay cho các nút con 
„ children – các nút con đ−ợc cảm 
biến
„ collideTime – gửi thời gian khi 
ng−ời dùng chạm vào vật thể
„ DEF Collide Collision { collide TRUE 
proxy Shape { geometry Box { . . . } } 
children [ . . . ] } ROUTE 
Collide.collideTime TO
OuchSound.set_startTime 
„ Xem code Chạy ví dụ
„ Tối −u hoá việc phát hiện xung đột
„ Sự kiện collision luôn đ−ợc kích hoạt 
theo ngầm định 
„ Tắt nó bất cứ khi nàu có thể! 
„ Tuy nhiên, một khi nút collision cha 
tắt thì nút child không thể bật nó trở
lại! 
„ Kết quả phát hiện xung đột là từ ng−ời 
dùng va chạm với một vật thể chứ
không phải là vật thể va chạm với 
ng−ời dùng 
„ Sử dụng nhiều nút sensor
„ Một số nút sensor có thể cảm biến 
cùng một lúc 
„ Bạn có thể tạo ra nhiều 
nútvisibility, proximity, and 
collision sensor
„ Các vùng cảm biến có thể chông 
lên nhau 
„ Nếu nhiều nút sensor đ−ợc kích 
hoạt, chúng sẽ thực hiện 
(c) SE/FIT/HUT 2002
Các nút sensor hành động
„ Có 4 nút sensor hành động 
chính:
• TouchSensor cảm biến khi 
chạm vào vật thể
• SphereSensor khi kéo chuột
• CylinderSensor khi kéo 
chuột
• PlaneSensor khi kéo chuột
„ Nút Anchor là nút cảm biến 
hành động có mục đích đặc biệt 
mà các đáp ứng đ−ợc xây dựng 
sẵn
„ Cảm biến các vật thể
„ Tất cả các cảm biến hành 
động cảm biến đ−ợc tất cả
các vật thể cùng nhóm
„ Cảm biến đ−ợc kích hoạt khi 
khi con trỏ của ng−ời dùng 
chạm phải vật thể đ−ợc cảm 
biến
Xem code Chạy ví dụ
(c) SE/FIT/HUT 2002
Touchsensor và spheresensor 
„ Nút TouchSensor cảm biến sự va 
chạm của con trỏ
• isOver – gửi giá trị true/false 
khi con trỏ đang ở trong hay 
ở ngoài vùng vật thể
• isActive – gửi giá trị 
true/false khi chuột đ−ợc 
nhấn hay thả
• touchTime –đ−a ra thời gian 
khi chuột đ−ợc thả
„ Transform { children [ DEF 
Touched TouchSensor { } 
Shape { . . . } . . . ] }
Xem code Chạy ví dụ
„ Nút SphereSensor cảm biến sự
dich chuyển con trỏ tạo ra sự
xoayquanh hình cầu
• isActive –gửi các giá trị 
true/false khi con chuột 
đ−ợc nhấn hay thả
• rotation_changed - đ−a 
ra sự quay khi rê con 
chuột
„ Transform { children [ DEF 
Rotator SphereSensor { } 
DEF RotateMe Transform { . 
. . } ] } ROUTE 
Rotator.rotation_changed 
TO RotateMe.set_rotation
(c) SE/FIT/HUT 2002
Cylindersensor-planesensor
„ Nút CylinderSensor nhận biết 
con trỏ đ−ợc rê và làm cho vật 
thể xoay quanh hình trụ
• isActive – gửi giá trị 
true/false khi chuột đ−ợc 
nhấn hay thả
• rotation_changed – làm 
cho vật thể quay khi kéo 
„ Transform { children [ DEF 
Rotator CylinderSensor { } 
DEF RotateMe Transform { . 
. . } ] } ROUTE 
Rotator.rotation_changed 
TO RotateMe.set_rotation
„ Xem code Chạy ví dụ
„ Nút PlaneSensor nhận biết con trỏ
đ−ợc rê và làm dịch chuyển vật thể
trên một mặt phẳng
• isActive – gửi các giá trị 
true/false khi chuột đ−ợc 
nhấn hay thả
• translation_changed – làm 
cho vật thể dịch chuyển khi 
rê chuột 
„ Transform { children [ DEF 
Mover PlaneSensor { } DEF
MoveMe Transform { . . . } ] } 
ROUTE 
Mover.translation_changed TO
MoveMe.set_translation
„ Xem code Chạy ví dụ
Page 10
Lờ Tấn Hựng CNTT- ĐHBK Hà nội
Email: hunglt@it-hut.edu.vn 
(c) SE/FIT/HUT 2002
Sử dụng nhiều nút sensor
Nhiều nút sensor có thể cảm biến cùng một vật thể nh−ng. . .
• Nếu các nút sensor ở trong cùng một nhóm :
• Tất cả đều có thể đáp ứng các sự kiện
• Nếu các nút sensors có độ sâu khác nhau trong cấu trúc cây của 
nút : 
• Nút sensor sâu nhất sẽ đáp ứng 
• Các nút khác không đáp ứng
(c) SE/FIT/HUT 2002
ví dụ sử dụng các nút sensor
#Clock to drive animations
DEF Clock TimeSensor { cycleInterval 10.0 loop TRUE }
# Colour changes for sphere (red -> green -> blue -> red)
DEF NewColour ColorInterpolator { key [0.0, 0.33, 0.66, 1.0 ]
keyValue [1.0 0.2 0.2, 0.2 1.0 0.2, 0.2 0.2 1.0, 1.0 0.2 0.2 ] }
. . . (Above is Grouped with the object we’re changing)
# use clock to run a ColorInterpolator, generating smoothly varying colour
ROUTE Clock.fraction_changed TO NewColour.set_fraction
# use varying colour value to feed material's diffuseColor field
ROUTE NewColour.value_changed TO
SphereColour.set_diffuseColor
(c) SE/FIT/HUT 2002
các ngôn ngữ kịch bản
„ Nhiều hành động quá phức tạp đối với các nút hoạt cảnh 
• Tính toán đ−ờng đi (ví dụ lực hấp dẫn)
• Giải thuật về vật thể (eg. fractals) 
• Các môi tr−ờng cần sự công tác (ví dụ game)
„ Bạn có thể tạo ra các nút sensors, interpolators, vân vân , bằng cánh sử dụng 
các ch−ơng trình kịch bản viết bằng các ngôn ngử
• Java – ngôn ngử lập trình rất mạnh 
• JavaScript – ngôn ngử kịch bản dễ học
• VRMLscript – giống JavaScript 
Ngôn ngữ VRML không bắt buộc phải hỗ trợ các ngôn ngữ kịch bản 
• Hầu hết các trình duyêt đều hõ trợ JavaScript và
• Nhiều trình duyêt hỗ trợ Java
„ VRMLScript = JavaScript = ECMAScript
• JavaScript không giống Java
• VRMLScript là phần mềm của Cosmo Software hỗ trợ JavaScript 
• Các đặc tả kỹ thuật của ISO VRML gọi là ECMAScript, phiên bản có hỗ
trơ JavaScript 
(c) SE/FIT/HUT 2002
nút Script
„ Nút Script chọn một ch−ơng trình 
kịch bản để chạy:
„ url – chọn ch−ơng trình kịch 
bản 
„ DEF Bouncer Script {
url "bouncer.class" or...
url "bouncer.js" or...
url "javascript: ..." or...
url "vrmlscript: ..." }
Xem code Chạy ví dụ
„ Định nghĩa giao tiếp các 
ch−ơng trình kịch bản ứng 
dụng
„ Nút Script cũng khai báo giao 
tiếp ch−ơng trình kịch bản
• field, eventIn, và
eventOut – là các thao 
tác xuất nhập
• Mỗi cái có một tên và kiểu 
dữ liệu 
• Các tr−ờng có một giá trị 
khởi đầu 
„ DEF Bouncer Script { field
SFFloat bounceHeight 3.0
eventIn SFFloat set_fraction
eventOut SFVec3f 
value_changed }
(c) SE/FIT/HUT 2002
Java
„ So với các ngôn ngữ nh−
JavaScript/VRMLscript, Java có 
khả năng: 
• Mô đun ch−ơng trình tốt 
hơn 
• Cấu trúc dữ liệu tốt hơn
• Khả năng thực hiện nhanh 
hơn 
• Truy cập mạng
„ Với những công việc đơn giản thì
sử dụng JavaScript/VRMLscript
„ Những ch−ơng trình phức tạp thì
dùng Java 
„ Khai báo giao tiếp ch−ơng 
trình kịch bản
„ Với ch−ơng trình kịch bản viết 
bằng ngôn ngữ Java tạo ra một 
file class trong tr−ờng url củanút 
Script
• file class đ−ợc biên dịch 
bằng ch−ơng trình kịch 
bản Java
„ DEF Bouncer Script { field
SFFloat bounceHeight 3.0
eventIn SFFloat
set_fraction eventOut
SFVec3f value_changed url
"bounce2.class" }
(c) SE/FIT/HUT 2002
Java class
„ Nhập các package cho lớp Java
„ File của ch−ơng trình kịch bảnphải import các package của VRML : 
• Đ−ợc cung cấp các công ty phân phối trình duyệt VRML
„ import vrml.*; 
„ import vrml.field.*; 
„ import vrml.node.*;
„ Tạo ra các file Java class
„ Các ch−ơng trình kịch bản phải định nghĩa một lớp có tính public kế thừa từ lớp 
Script 
„ public class bounce2 extends Script { . . . }
• Ph−ơng thức tuỳ chọn initialize đ−ợc gọi khi script đ−ợc tải 
• public void initialize ( ) { . . . }
• Quá trình khởi tạo xẩy ra khi: 
• Nút Script đ−ợc tạo (th−ờng khi trình duyệt nạp thế giới các vật thể) 
• Ph−ơng thức shutdown đ−ợc gọi đến khi script thôi nạp
• public void shutdown ( ) { . . . }
• Shutdown xẩy ra : 
• Nút Script bị xoá
• Trình duyệt nạp thế giới mới 
Page 11
Lờ Tấn Hựng CNTT- ĐHBK Hà nội
Email: hunglt@it-hut.edu.vn 
(c) SE/FIT/HUT 2002
Sự kiện -event
„ Đáp ứng một sự kiện
• Ph−ơng thức 
processEvent đ−ợc gọi 
mỗi khi một sự kiện nhận 
đ−ợc , chuyển một đối 
t−ợng sự kiện chứa 
• Giá trị của sự kiện
• Thời gian 
„ public void processEvent( 
Event event ) { . . . }
Xem code vrml
Xem code java
„ Truy nhập các tr−ờng từ Java
„ Mỗi tr−ờng giao tiếp có thể đ−ợc 
đọc và viết 
• Gọi getField để đọc 
tr−ờng của đối t−ợng
„ obj = (SFFloat) getField( 
"bounceHeight" );
• Gọi getValue để lấy giá trị 
của tr−ờng
„ lastval = obj.getValue( );
• Gọi setValue đặt giá trị 
cho một tr−ờng
„ obj.setValue( newval );
(c) SE/FIT/HUT 2002
Tr−ờng eventout từ java
„ Truy nhập tr−ờng eventOuts từ 
Java
„ Mỗi giao tiếp eventOut có thể đọc 
và ghi 
• gọi getEventOut để đọc 
tr−ờng eventOut của đối 
t−ợng
„ obj = (SFVec3f)
getEventOut( 
"value_changed" );
• Gọi getValue đọc giá trị 
cuối cùng đ−ợc gửi
„ lastval = obj.getValue( );
• Gọi setValue để gửi một 
sự kiện
„ obj.setValue( newval );
„ Ví dụ Java script 
„ Tạo nút interpolator vớiquả bóng 
nẩy rồi tính trọng lực nh− chuyển 
động nẩy ngang từ dữ liệu đầu 
vào là thời gian phân đoạn
„ Nút cần: DEF Ball Transform { . 
. . } DEF Clock TimeSensor { . . 
. } DEF Bouncer Script { . . . }

File đính kèm:

  • pdfbai_giang_computer_graphics_chuong_9_ngon_ngu_mo_hinh_hoa_th.pdf