Bài giảng Đồ họa hiện thực ảo - Bài 8: Ngôn ngữ mô hình hóa thực tại ảo VRML - Lê Tấn Hưng
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

Trang 1

Trang 2

Trang 3

Trang 4

Trang 5

Trang 6

Trang 7

Trang 8

Trang 9

Trang 10
Tải về để xem bản đầy đủ
Bạn đang xem 10 trang mẫu của tài liệu "Bài giảng Đồ họa hiện thực ảo - Bài 8: Ngôn ngữ mô hình hóa thực tại ảo VRML - Lê Tấn Hưng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Đồ họa hiện thực ảo - Bài 8: Ngôn ngữ mô hình hóa thực tại ảo VRML - Lê Tấn Hưng
ộ
Tr−ờng ra dữ liệu isActive : Để kích hoạt vị trí của một vật thể Interpolating positions
VRML cung cấp: Mỗi khoá vị trí cùng với đ−ờng
Ra dữ liệu là TRUE khi bộ thời gian bắt
• Một danh sách khoá về vị dẫn có:
đầu
trí key positions cho đ−ờng Một khoá giá trị key value
Ra dữ liệu là FALSE khi bộ thời gian di chuyển (nh− là một vị trí)
kết thúc
• Thời gian bắt đầu ở mỗi vị Một khoá thời gian phân đoạn
trí
Tr−ờng ra dữ liệu time : Phép nội suy sẽ điền vàu các giá
Nút interpolator có thể chuyển đổi trị vàu giữa các giá trị khoá:
Đ−a ra thời gian tuyệt đối một đầu vàu thời gian thành một
Fractional TimePosition
Tr−ờng ra dữ liệu fraction_changed : đầu ra toạ độ
0
• Khi thời gian ở giữa hai
Đ−a ra các giá trị từ 0.0 tới 1.0 trong 0.1
suốt một chu ký khoá vị trí, nút interpolator
sẽ tính toán vị trí trung gian ..
Đặt lại giá trị 0.0 lúc bắt đầu mỗi chu 1
kỳ
Xem code Chạy ví dụ
(c) SE/FIT/HUT 2002 (c) SE/FIT/HUT 2002
Nút positioninterpolator Sử dụng các nút interpolator khác
Nút PositionInterpolator miêu Sự kiện đầu vào set_fraction : Kích hoạt vị trí PositionInterpolator
tả vị trí của đ−ờng dẫn • Đặt thời gian phân đoạn Kích hoạt h−ớng OrientationInterpolator
• key – khoá thời gian phân hiện thời theo khoá đ−ờng Kích hoạt co giãn Position Interpolator
đoạn dẫn
Kích hoạt màu sắc ColorInterpolator
• keyValue –khoávị trí Sự kiện đầu ra value_changed :
Kích hoạt tính trong suốt ScalarInterpolator
PositionInterpolator { key [ 0.0, • Đ−a ra vị trí theo đ−ờng
. . . ] keyValue [ 0.0 0.0 0.0, . . . ] dẫn mỗi khi fraction đ−ợc
} đặt
Th−ờng để gửi vào sự kiện đầu Xem code Chạy ví dụ
vào set_translation của nút
Transform
(c) SE/FIT/HUT 2002 (c) SE/FIT/HUT 2002
Lờ Tấn Hựng CNTT- ĐHBK Hà nội
Email: hunglt@it-hut.edu.vn
Page 7
Colorinterpolator-scalarinterpotator
OrientationInterpolator PositionInterpolator ColorInterpolator ScalarInterpolator
Nút OrientationInterpolator mô Nút PositionInterpolator mô tả Nút ColorInterpolator mô tả đ−ờng Nút ScalarInterpolator mô tả
tả đ−ờng dẫn h−ớng đ−ờng dẫn vị trí hay tỷ lệ dẫn màu sắc đ−ờng dẫn vô h−ớng
• key – khoá thời gian phân • key –khoáthời • key – khoá thời gian phân • key – khoá thời gian phân
đoạn gian phân đuạn
đoạn đoạn
• keyValue – khoá về xoay • keyValue –khoá
(gồm cạnh và góc) vị trí (hoặc tỷ lệ) • keyValue –khoámàu • keyValue –khoávô
OrientationInterpolator { key [ • PositionInterpolator { (đỏ,xanh d−ơng,xanh da trời) h−ớng (dùng cho bất cứ
0.0, . . . ] keyValue [ 0.0 1.0 0.0 key [ 0.0, . . . ] keyValue [ ColorInterpolator { key [ 0.0, . . . ] vật thể nào)
0.0, . . . ] } 0.0 0.0 0.0, . . . ] } keyValue [ 1.0 1.0 0.0, . . . ] } ScalarInterpolator { key [ 0.0, . .
Th−ờng gửi giá trị về góc xoay • Th−ờng gửi giá trị vị trí vào Th−ờng gửi vàu sự kiện đầu vào . ] keyValue [ 4.5, . . . ] }
vào sự kiện set_rotation của nút sự kiện set_scale của nút set_diffuseColor hay Th−ờng gửi vào sự kiện
Transform Transform set_emissiveColor của nút set_transparency của nút
Material Material
Xem code Chạy ví dụ Xem code Chạy ví dụ
(c) SE/FIT/HUT 2002 (c) SE/FIT/HUT 2002
nút Sensor nút Sensor
Có 7 kiểu nút sensor . Nút ProximitySensor phát hiện ra vị trí quan sát gần nhất
Nút sensor dò các hành động của ng−ời dùng và phát ra một Nút TouchSensor phát hiện sự kiện kích chuột
sự kiên. Nút TimeSensor là bộ đếm thời gian
Bạn có thể liên kết các sự kiện này tới các nút khác để tạo ra Tất cả các nút CylinderSensor, PlaneSensor and
chu kỳ đơn gồm có nguyên nhân_kết quả. SphereSensor phát hiện trạng thái kéo các vật thể.
Bốn bài cuối cùng trong phần “VRML Resources | Example Nút VisibilitySensor nhận biết một đối t−ợng là hữu hình đối
VRML Worlds” của Website là nh−ng ví dụ hay về các nút với ng−ời dùng
sensor và liên kết với các sự kiện.
(c) SE/FIT/HUT 2002 (c) SE/FIT/HUT 2002
nút Sensor viewer Dùng visibilitysensor và proximitysensor
Motivation Hai nút VisibilitySensor và ProximitySensor cảm biến vùng vật thể
Cảm ứng vị trí ng−ời dùng cho phép kích hoạt các hoạt cảnh dạng hộp
• Khi một vùng hữu hình đối với ng−ời dùng • center – tâm vùng
• Khi ng−ời dùng ở trong một vùng nào đó
• size –kích th−ớc vùng
• Khi ng−ời dùng va chạm với một vật thể nào đó
LOD và Billboard là các nút đặc biệt có các đáp ứng với viewer sensors Cả hai nút có đầu ra giống nhau :
đ−ợc xây dựng săn • Sự kiện enterTime – gửi thời gian vào vùng vào hay lúc hữu hình
Có 3 kiểu nút viewer sensor: • Sự kiện exitTime – gửi thời gian vào vùng ra hay lúc không hữu
• Nút VisibilitySensor cảm biến nếu ng−ời dùng có thể thấy một hình
vùng nào đó a region
• Nút ProximitySensor cảm biến khi ng−ời dùng đến phạm vi xung • Sự kiện isActive – gửi true ở vùng vào, false ở vùng ra
quanh vật thể
• Nút Collision cảm biến xung đột giúp điều khiển và phát hiện
xung đột
(c) SE/FIT/HUT 2002 (c) SE/FIT/HUT 2002
Lờ Tấn Hựng CNTT- ĐHBK Hà nội
Email: hunglt@it-hut.edu.vn
Page 8
Nút VisibilitySensor nút ProximitySensor
Nút VisibilitySensor cảm biến nếu ng−ời dùng nhìn thấy hoặc ngừng Nút ProximitySensor cảm biến khi ng−ời dùng vào/ rời khỏi một vùng nào đó
quan sát 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
• center và size –tâm và kích th−ớc của vùng • isActive – gửi giá trị true/false nếu vào vùng vào/ vùng ra
• enterTime và exitTime – gửi thời gian vào\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
• isActive –gửi giá trị true/false vào vùng vào\vùng ra
ProximitySensor
DEF VisSense VisibilitySensor { center 0.0 0.0 0.0 size 14.0 14.0 14.0 • Nút ProximitySensor cảm biến khi ng−ời dùng đang ở trong
} ROUTE VisSense.enterTime TO Clock.set_startTime 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 (c) SE/FIT/HUT 2002
nút Collision
Các nút sensor hành động
Nút Collision cảm biến đ−ợc khi tầm Tối −u hoá việc phát hiện xung đột
Có 4 nút sensor hành động Cảm biến các vật thể
quan sát của ng−ời dùng v−ớng các vật Sự kiện collision luôn đ−ợc kích hoạt
thể theo ngầm định chính: Tất cả các cảm biến hành
collide – cho phép/không cho Tắt nó bất cứ khi nàu có thể! động cảm biến đ−ợc tất cả
phép cảm biến Tuy nhiên, một khi nút collision cha • TouchSensor cảm biến khi
tắt thì nút child không thể bật nó trở các vật thể cùng nhóm
proxy – vật thể đơn giản đ−ợc lại! chạm vào vật thể
cảm biến thay cho các nút con
Kết quả phát hiện xung đột là từ ng−ời • SphereSensor khi kéo chuột Cảm biến đ−ợc kích hoạt khi
children – các nút con đ−ợc cảm dùng va chạm với một vật thể chứ khi con trỏ của ng−ời dùng
biến không phải là vật thể va chạm với • CylinderSensor khi kéo
ng−ời dùng chạm phải vật thể đ−ợc cảm
collideTime – gửi thời gian khi Sử dụng nhiều nút sensor chuột
ng−ời dùng chạm vào vật thể biến
Một số nút sensor có thể cảm biến • PlaneSensor khi kéo chuột
DEF Collide Collision { collide TRUE cùng một lúc
proxy Shape { geometry Box { . . . } } Bạn có thể tạo ra nhiều Nút Anchor là nút cảm biến
children [ . . . ] } ROUTE nútvisibility, proximity, and Xem code Chạy ví dụ
Collide.collideTime TO collision sensor hành động có mục đích đặc biệt
OuchSound.set_startTime Các vùng cảm biến có thể chông mà các đáp ứng đ−ợc xây dựng
lên nhau
Xem code Chạy ví dụ sẵn
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) SE/FIT/HUT 2002
Touchsensor và spheresensor
Cylindersensor-planesensor
Nút TouchSensor cảm biến sự va Nút SphereSensor cảm biến sự Nút CylinderSensor nhận biết Nút PlaneSensor nhận biết con trỏ
chạm của con trỏ con trỏ đ−ợc rê và làm cho vật đ−ợc rê và làm dịch chuyển vật thể
dich chuyển con trỏ tạo ra sự trên một mặt phẳng
• isOver – gửi giá trị true/false xoayquanh hình cầu thể xoay quanh hình trụ
• isActive – gửi giá trị • isActive – gửi các giá trị
khi con trỏ đang ở trong hay • isActive –gửi các giá trị true/false khi chuột đ−ợc
ở ngoài vùng vật thể true/false khi chuột đ−ợc nhấn hay thả
true/false khi con chuột nhấn hay thả
• isActive – gửi giá trị đ−ợc nhấn hay thả • translation_changed –làm
true/false khi chuột đ−ợc • rotation_changed –làm cho vật thể dịch chuyển khi
nhấn hay thả • rotation_changed -đ−a cho vật thể quay khi kéo rê chuột
• touchTime –đ−a ra thời gian ra sự quay khi rê con Transform { children [ DEF Transform { children [ DEF
khi chuột đ−ợc thả chuột Rotator CylinderSensor { } Mover PlaneSensor { } DEF
MoveMe Transform { . . . } ] }
Transform { children [ DEF Transform { children [ DEF DEF RotateMe Transform { .
. . } ] } ROUTE ROUTE
Touched TouchSensor { } Rotator SphereSensor { } Mover.translation_changed TO
Shape { . . . } . . . ] } DEF RotateMe Transform { . Rotator.rotation_changed MoveMe.set_translation
TO RotateMe.set_rotation
Xem code Chạy ví dụ . . } ] } ROUTE
Xem code Chạy ví dụ
Rotator.rotation_changed Xem code Chạy ví dụ
TO RotateMe.set_rotation
(c) SE/FIT/HUT 2002 (c) SE/FIT/HUT 2002
Lờ Tấn Hựng CNTT- ĐHBK Hà nội
Email: hunglt@it-hut.edu.vn
Page 9
Sử dụng nhiều nút sensor
ví dụ sử dụng các nút sensor
Nhiều nút sensor có thể cảm biến cùng một vật thể nh−ng. . . #Clock to drive animations
• Nếu các nút sensor ở trong cùng một nhóm : DEF Clock TimeSensor { cycleInterval 10.0 loop TRUE }
• Tất cả đều có thể đáp ứng các sự kiện # Colour changes for sphere (red -> green -> blue -> red)
• Nếu các nút sensors có độ sâu khác nhau trong cấu trúc cây của DEF NewColour ColorInterpolator { key [0.0, 0.33, 0.66, 1.0 ]
nút : 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 ] }
• Nút sensor sâu nhất sẽ đáp ứng . . . (Above is Grouped with the object we’re changing)
• Các nút khác không đáp ứng
# 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) SE/FIT/HUT 2002
nút Script
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 Nút Script chọn một ch−ơng trình Định nghĩa giao tiếp các
• Tính toán đ−ờng đi (ví dụ lực hấp dẫn) kịch bản để chạy: ch−ơng trình kịch bản ứng
• Giải thuật về vật thể (eg. fractals) url –chọn ch−ơng trình kịch dụng
• Các môi tr−ờng cần sự công tác (ví dụ game) bản Nút Script cũng khai báo giao
Bạn có thể tạo ra các nút sensors, interpolators, vân vân , bằng cánh sử dụng DEF Bouncer Script { tiếp ch−ơng trình kịch bản
các ch−ơng trình kịch bản viết bằng các ngôn ngử url "bouncer.class" or... • field, eventIn, và
• Java – ngôn ngử lập trình rất mạnh url "bouncer.js" or... eventOut –làcác thao
• JavaScript – ngôn ngử kịch bản dễ học tác xuất nhập
• VRMLscript – giống JavaScript url "javascript: ..." or... • Mỗi cái có một tên và kiểu
Ngôn ngữ VRML không bắt buộc phải hỗ trợ các ngôn ngữ kịch bản url "vrmlscript: ..." } dữ liệu
• Hầu hết các trình duyêt đều hõ trợ JavaScript và • Các tr−ờng có một giá trị
• Nhiều trình duyêt hỗ trợ Java Xem code Chạy ví dụ khởi đầu
VRMLScript = JavaScript = ECMAScript DEF Bouncer Script { field
• JavaScript không giống Java SFFloat bounceHeight 3.0
• VRMLScript là phần mềm của Cosmo Software hỗ trợ JavaScript eventIn SFFloat set_fraction
• Các đặc tả kỹ thuật của ISO VRML gọi là ECMAScript, phiên bản có hỗ eventOut SFVec3f
trơ JavaScript value_changed }
(c) SE/FIT/HUT 2002 (c) SE/FIT/HUT 2002
Java Java class
So với các ngôn ngữ nh− Khai báo giao tiếp ch−ơng Nhập các package cho lớp Java
JavaScript/VRMLscript, Java có trình kịch bản File của ch−ơng trình kịch bảnphải import các package của VRML :
khả năng: • Đ−ợc cung cấp các công ty phân phối trình duyệt VRML
Với ch−ơng trình kịch bản viết import vrml.*;
• Mô đun ch−ơng trình tốt bằng ngôn ngữ Java tạo ra một import vrml.field.*;
hơn file class trong tr−ờng url củanút import vrml.node.*;
• Cấu trúc dữ liệu tốt hơn Script 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
• Khả năng thực hiện nhanh • file class đ−ợc biên dịch Script
hơn bằng ch−ơng trình kịch public class bounce2 extends Script { . . . }
• Truy cập mạng bản Java • Ph−ơng thức tuỳ chọn initialize đ−ợc gọi khi script đ−ợc tải
DEF Bouncer Script { field • public void initialize ( ) { . . . }
Với những công việc đơn giản thì
SFFloat bounceHeight 3.0 • Quá trình khởi tạo xẩy ra khi:
sử dụng JavaScript/VRMLscript • Nút Script đ−ợc tạo (th−ờng khi trình duyệt nạp thế giới các vật thể)
eventIn SFFloat • Ph−ơng thức shutdown đ−ợc gọi đến khi script thôi nạp
Những ch−ơng trình phức tạp thì set_fraction eventOut
dùng Java • public void shutdown ( ) { . . . }
SFVec3f value_changed url • Shutdown xẩy ra :
"bounce2.class" } • Nút Script bị xoá
• Trình duyệt nạp thế giới mới
(c) SE/FIT/HUT 2002 (c) SE/FIT/HUT 2002
Lờ Tấn Hựng CNTT- ĐHBK Hà nội
Email: hunglt@it-hut.edu.vn
Page 10
Sự kiện -event Tr−ờng eventout từ java
Đáp ứng một sự kiện Truy nhập các tr−ờng từ Java Truy nhập tr−ờng eventOuts từ Ví dụ Java script
• Ph−ơng thức Mỗi tr−ờng giao tiếp có thể đ−ợc Java Tạo nút interpolator vớiquả bóng
processEvent đ−ợc gọi đọc và viết Mỗi giao tiếp eventOut có thể đọc nẩy rồi tính trọng lực nh− chuyển
mỗi khi một sự kiện nhận • Gọi getField để đọc và ghi động nẩy ngang từ dữ liệu đầu
đ−ợc , chuyển một đối tr−ờng của đối t−ợng • gọi getEventOut để đọc vào là thời gian phân đoạn
t−ợng sự kiện chứa
obj = (SFFloat) getField( tr−ờng eventOut của đối Nút cần: DEF Ball Transform { .
• Giá trị của sự kiện "bounceHeight" ); t−ợng . . } DEF Clock TimeSensor { . .
• Thời gian • Gọi getValue để lấy giá trị obj = (SFVec3f) . } DEF Bouncer Script { . . . }
public void processEvent( của tr−ờng getEventOut(
"value_changed" );
Event event ) { . . . } lastval = obj.getValue( );
• Gọi setValue đặt giá trị • Gọi getValue đọc giá trị
Xem code vrml cho một tr−ờng cuối cùng đ−ợc gửi
lastval = obj.getValue( );
obj.setValue( newval );
• Gọi setValue để gửi một
Xem code java sự kiện
obj.setValue( newval );
(c) SE/FIT/HUT 2002 (c) SE/FIT/HUT 2002
Lờ Tấn Hựng CNTT- ĐHBK Hà nội
Email: hunglt@it-hut.edu.vn
Page 11File đính kèm:
bai_giang_do_hoa_hien_thuc_ao_bai_8_ngon_ngu_mo_hinh_hoa_thu.pdf

