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
11 trang |
Chia sẻ: Mr Hưng | Lượt xem: 882 | Lượt tải: 0
Nội dung tài liệu Ngôn ngữ mô hình hóa thực tại ảo VRML, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
lúc hữu hình
• Sự kiện exitTime – gửi thời gian vào vùng ra hay lúc không hữu
hình
• Sự kiện isActive – gửi true ở vùng 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 { . . . }
Các file đính kèm theo tài liệu này:
- l8_2694.pdf