Tải bản đầy đủ (.pdf) (11 trang)

Bài giảng Đồ họa máy tính: Bài 8 - Lê Tấn Hùng

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 (869.63 KB, 11 trang )

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








(c) SE/FIT/HUT 2002

(c) SE/FIT/HUT 2002

Cấu trúc file VRML

Tính chất







Bạn có thể xem các file VRML nhờ trình duyệt VRML :
Một ứng dụng hỗ trợ VRML
Một ứng dụng VRML nhúng vào một trình duyệt HTML
Bạn có thể xem các file VRML từ đĩa cứng , hay qua mạng Internet
„ Toµn bé trang Web
„ Nhóng vµo trang Web
„ Toµn bé khung cđa trang Web
„ Nhóng vµo khung cđa trang Web
Nhúng vào các ứng dụng đa thời gian
Bạn có thể tạo các file VRML nhờ :
Một trình soạn thảo văn bản đơn giản
Một chơng trình ứng dụng
Một trình dịch định dạng và mô hình hóa 3D
Một ngôn ngữ tạo vật thể (nh ngôn ngữ kịch bản Perl )



Trong file VRML gồm có :
Đầu đề cđa file
„ Comments – chó thÝch
cđa b¹n
„ Nodes – nót chứa các
thông tin quan trọng của
cảnh vật
Fields các thuộch tính
của nút mà bạn có thể
thay đổi
Values các thuộc tính

giá trị
Và . . .

(c) SE/FIT/HUT 2002

Comments-chú thích







Lời chú thích bắt đầu với ký tự # .
Ký tự # trong nháy kép không phải bắt đầu chú thích.
Chú ý rằng dòng đầu của VRML 2.0 là :
#VRML 2.0 utf8
và là bắt buộc !
Từ khóa utf dùng để nói đến bộ ký tự quốc tế UTF-8 đợc
dùng trong file.
Lời chú thích và khoảng trắng có thể không đợc bảo toàn
bởi VRML document server.

(c) SE/FIT/HUT 2002

Lờ Tn Hựng CNTT- ĐHBK Hà nội
Email:

#VRML V2.0 utf8
# example1.wrl - a yellow box

Shape
{
geometry
Box{ } # default box
appearance Appearance
# override
appearance
{material Material
# with a new
material
{diffuseColor 1.0 1.0 0.0
#
yellow
}
}
}
(c) SE/FIT/HUT 2002

Phần tử cơ bản của VRML: Nót
„
„
„
„
„
„
„

Mét file VRML gåm cã mét danh s¸ch c¸c nút, mỗi nút chứa một phần
thông tin mô tả toàn cảnh.
Một nút có thể định nghĩa hình dạng vật thể, hay thuộc tính của của một

đối tợng , nh màu màu sắc và hệ tọa độ của nó.
Mỗi nút có một tên, theo sau là cặp dấu { } có thể không chứa trờng nào
hoặc nhiều trờng.
Một câu lệnh trờng gồm có tên trờng sau đó có thể có một hay nhiều
giá trị.Các trờng có thể đợc viết theo các trật tự khác nhau.
Tên của nút bắt đầu bằng ký tự hoa, tên trờng bắt đầu bằng ký tự
thờng (case sensitive).
VÝ dụ về nót
Shape, Box, Appearance, Material,lights, sounds, .

(c) SE/FIT/HUT 2002

Page 1


Cấu trúc phân lớp









Cấu trúc cảnh

Nút Shape chứa hai trờng, geometry và appearance, mỗi trờng lại
chứa các nút khác đợc coi nh giá trị của chúng.
Shape

{
appearance
NULL exposedField
SFNode
geometry
NULL exposedField
SFNode
}
Đôi khi nút Shape cã mét tr−êng Appearance nh−ng kh«ng cã tr−êng
geometry (vÝ dụ nh các vật thể không nhìn thấy!)
Trờng geometry chứa nút Box và trờng appearance coi nút
Appearance nh là giá trị của có.
Nút Appearance lại chứa một nút khác là Material.
Câu trúc cây của nút mà nút lại đợc chứa trong nút khác gọi là scene
graph.

z Shape

ã
ã
ã
ã
ã

Box
Cone
Cylinder
Sphere
Text




Các trờng của nút Geometry
điều khiển kích thớc
Kích thớc thờng có đơn vị là m,
nhng có thể bất cứ đơn vị gì




Box
{size 8 12 10
d)
}
Xem code
Cone
{
bottomRadius
units wide
height
side
bottom
Xem code
}

„
„
„
„


# x, y, z (=w, h,

„

Ch¹y vÝ dơ
5

# so 10

12
TRUE
TRUE
Ch¹y vÝ dơ

Nót text
„
„

VRML gióp b¹n chia mét lớp thành các khoanh có thể quản lý đợc .
Mỗi nút riêng lẻ thì rất đơn giản, sự kết nối giữa các nút cho phép tạo ra
các lớp phức tạp.
Nút shape đợc tạo nên trung tâm của thế giới VRML .
Mét file VRML cã thĨ chøa nhiỊu nót shape
C¸c nót shape có thể trùng lên nhau khi chúng đợc tạo nên ở cùng một
vị trí.
Bạn nên xem và sử dụng một trong các trờng geometries sau

Cơ bản về nút shape




(c) SE/FIT/HUT 2002



z Material

(c) SE/FIT/HUT 2002

Cơ bản về nút shape


z Appearance
diffuseColor



(c) SE/FIT/HUT 2002

Nút Shape là những viên gạch
tạo nên thế giới VRML Các nút
Shape gốc là các khối chuẩn :

z Box

appearance

material






geometry

Cylinder
{
radius
4
# chiều rộng là 8
height
6
bottom TRUE
# cup có cạnh và đáy
side
TRUE
top
FALSE # nhng không có đỉnh
}
Chạy ví dụ
Xem code
Sphere
# đơn giản nhất trong các nút shape
{
radius
2
# nhng cũng là phức tạp
Chạy ví dụ
}
Xem code


(c) SE/FIT/HUT 2002

Cấu trúc ảnh bitmap

Tránh tạo ra các đặc tả kỹ thuật Web-based 3D/VR.
Text rt hu ích ở các hệ chuyên gia,ví dụ nh trong khoa học vÒ trùc quan.
Text
{
string
“Hi!”
# multi-field
length
0
# stretch to this width (0=natural width)
fontStyle
FontStyle
{ familySERIF
# or SANS or TYPEWRITER
style
PLAIN
# or BOLD ITALIC
size
4
}
Chaỵ ví dụ
}
Xem code

(c) SE/FIT/HUT 2002


Lê Tấn Hùng CNTT- ĐHBK Hà nội
Email:

„
„

Sö dụng ảnh bitmap thay cho một mô hình 3D thật cụ thể có thể tiết kiệm
đợc nhiều thời gian xử lý...
Tuy vËy viƯc sư dơng réng r·i ¶nh bitmap cã thể có những bất lợi sau:
Cấu trúc của ảnh sẽ đợc gủi cho trình duyệt ,có thể phải qua một
quá trình thông tin chậm.
Thiết kế một ảnh bitmap và đa nó lên màn hình là công đoạn xử lý
khá là kỹ lỡng.

(c) SE/FIT/HUT 2002

Page 2


CÊu tróc trong VRML
„

„
„

Appearance
{
texture ImageTexture
{

url
“skin.gif”
# GIF, JPG or PNG
repeatSTRUE
# repeat or stretch?
repeatT TRUE
}
}
Xem code
Chạy ví dụ
Các Texture có thể là một URL đầy đủ hoặc chỉ là một URLtơng đối đơn
giản nh sử dụng ở trên.
Có ba kiểu nút texture là : ImageTexture, MovieTexture and PixelTexture
Xem code
Chạy ví dụ

Hệ tọa độ









Một file VRML xây dựng nên các thành phần của thế giới VRML
Một file thành đợc xây dựng trong thế giới hệ toạ độ
Theo mặc định , tất cả các vật thể đợc xây dựng từ gốc của hệ toạ ®é
VRML sư dơng hƯ to¹ ®é thn .hƯ to¹ ®é Đề Các

Đơn vị chuẩn đo chều dài và khoảng cách trong VRML là m.
Góc là radian.
Một vòng quay là 2 radian.
360 là 2 radian, khoảng 6.28 radian,
90 là /2 radian, khoảng 1.57 radian.

(c) SE/FIT/HUT 2002

Chuyển đổi một hệ toạ độ





Một nút transform tạo ra một hệ toạ
độ có:
Positioned :gốc
Rotated :góc quay
Scaled :tỷ lệ
Liên hệ với hệ toạ độ cha của nó
Các vật thể đợc xây dựng trong hệ
toạ độ mới đợc định vị ,quay và tỷ lệ
cùng với nó.

Nhóm các nút Transform tạo ra
một nhóm với hê toạ độ của chính

ã rotation hớng
ã scale kích cỡ
ã translation vị trí

ã children các vật thậ t¹o
Transform {
translation . . .
rotation . . .
scale . . .
children [ . . . ] }
„

(c) SE/FIT/HUT 2002

Tr−êng children
„

Tr−êng children bao gåm mét danh s¸ch mét hay nhiỊu nót

„

Transform { . . .
children [
Shape { . . . }
Shape { . . . }
Transform { . . . } . . . ] }

(c) SE/FIT/HUT 2002

Nót transform
„

„


(c) SE/FIT/HUT 2002

Nót transform

Trờng Translation định vị hệ toạ
độ bởi X,Y và Z
Transform { # X Y Z
translation 2.0 0.0 0.0 children
[...]}
Tr−êng Scale để co hay giản một
hệ toạ độ dựa vàu hệ số tỷ lệ ở
các trục X, Y, và Z
Transform { # X Y Z scale 0.5
0.5 0.5 children [ . . . ] }

Trờng Rotation định hớng hệ toạ độ
quay quoanh một cạnh bởi một góc
quay
ã Góc thờng đợc đu bằng đơn
vị radian
ã radian = độ/ 180.0 * 3.141
Transform { # X Y Z Angle
rotation 0.0 0.0 1.0 0.52
children [ . . . ] }
„

(c) SE/FIT/HUT 2002

Lê Tấn Hùng CNTT- ĐHBK Hà nội
Email:


„

„

Co gi·n , xoay vµ dịch một hệ toạ độ, cái này sau cái kia
Transform {
translation 2.0 0.0 0.0
rotation 0.0 0.0 1.0 0.52
scale 0.5 0.5 0.5
children [ . . . ] }
Các thao tác đợc thực hiện từ dới lên bottom-up:
Trờng children đợc co giÃn ,xoay rồi sau đó mới dịch
Thứ tự giữa các trờng đợc ấn định, độc lập với trật tự của các trờng
Chạy ví dụ
Xem code

(c) SE/FIT/HUT 2002

Page 3


nút Appearance



nút Material

Các vật thể gốc có màu phát ra từ bề Một nút Appearance miêu tả toàn
ngoài là màu trắng

bộ hình dạng của vật thể
Bạn có thể điều khiển màu của một
ã Trờng material gồm các
vật thể:
thuộc tính nh color,
transparency, etc.
ã Màu bóng
Shape {
ã Màu phát ra
appearance Appearance {
ã Tính trong suốt
material . . . }
ã Tính không chiếu sáng
geometry . . . }
ã Cờng độ ánh sáng bao
quanh





Một nút Material điều khiển các thuộc tính về chất liệu của vật thể
ã diffuseColor màu bóng chính
ã emissiveColor màu phát chính
ã transparency Trong suốt hay không
Shape {
appearance Appearance {
material Material {
diffuseColor 0.8 0.8 0.8
emissiveColor 0.0 0.0 0.0

transparency 0.0 }
}
geometry . . . }

(c) SE/FIT/HUT 2002

Nót material
„

B¶ng màu thờng dùng

Nút Material cũng có thể điều khiển tính chiếu sáng của một vật thể
ã specularColor điểm có màu nổi bật nhất
ã shininess kích cở chỗ nổi bật nhất
ã ambientIntensity hiêu ứng ánh sáng xung quanh



(c) SE/FIT/HUT 2002

Shape {
appearance Appearance {
material Material {
specularColor 0.71 0.70 0.56
shininess 0.16
ambientIntensity 0.4 } }
geometry . . . }
Xem code

Ch¹y vÝ dụ





Thông thờng chúng ta cẩn nhóm các
đối tợng lại với nhau. VRML dùng nút
Group để thực hiện điều này
Nút Group cã thĨ cã c¸c nót con.
Cã thĨ chÝnh c¸c nót con là các nút
group .
Có các kiểu nút group sau:
Transform

Group

Anchor

Inline

Collision

Switch

specular
Color

shininess

0.30


0.30 0.30 0.50

0.70 0.70 0.80

0.10

Copper

0.26

0.30 0.11 0.00

0.75 0.33 0.00

0.08

Gold

0.40

0.22 0.15 0.00

0.71 0.70 0.56

0.16

Metalic Purple

0.17


0.10 0.03 0.22

0.64 0.00 0.98

0.20

Metalic Red

0.15

0.27 0.00 0.00

0.61 0.13 0.18

0.20

Plastic Blue

0.10

0.20 0.20 0.71

0.83 0.83 0.83

0.12

(c) SE/FIT/HUT 2002

KÕt nèi tới một vị trí khác


nút Group



diffuse
Color

Aluminum

(c) SE/FIT/HUT 2002



ambient
Intensity

Mô tả

LOD
Billboard





Bạn có thể nhóm các vật thể lại với
nhau để tạo thành mét vËt thĨ phøc
t¹p .
VRML cã nhiỊu nót group bao gåm
Group { . . . }

Switch { . . . }
Transform { . . . }
Billboard { . . . }
Anchor { . . . }
Inline { . . . }
Chaỵ ví dụ
Xem code

(c) SE/FIT/HUT 2002

Lờ Tn Hựng CNTT- HBK Hà nội
Email:

„
„
„

Cịng nh− trong trang Web , siªu liªn kÕt cịng s½n cã trong VRML.
Cã thĨ kÕt nèi tíi các kiểu dữ liệu hợp lệ , bao gồm các trang VRML
khác, các trang HTML và các ứng dụng CGI .
VÞ trÝ (x, y, z) cđa con trá cã thĨ đợc truyền tới URL, chỉ thực sự có ích với
các øng dông CGI.

(c) SE/FIT/HUT 2002

Page 4


Các nút Group-Switch-Transform
Nút Anchor và Inline

Nút Group tạo ra các nút cơ bản

khác
Mỗi nút child trong group là đợc
hiển thÞ
„ Group { children [ . . . ] }
„ Nót nhãm Switch t¹o ra mét nhãm cã
thĨ chun cho nhau.
„ ChØ cã mét nót child group is
„
trong nhãm lµ đợc hiển thị
Bạn chọn nút child nào
ã Nút con đợc đánh số tờng
minh từ 0
ã A -1 không chọn nót con nµo
Switch { whichChoice 0 choice [ . . . ]
}
Xem code
Chaỵ ví dụ


Nút Transform tạo ra một nhóm dựa
trên chính hệ toạ độ của nó
Mỗi nút child là đợc hiển thị
Transform {
translation 0.0 0.0 0.0
rotation 0.0 1.0 0.0 0.0
scale 1.0 1.0 1.0 children [ . . . ] }
Nút nhóm Billboard tạo ra một nhóm
với hệ toạđộ đặc biệt

ã Mỗi nút child đợc hiển thị
displayed
ã Hệ toạ độ trở lại mặt xem
Billboard {
axisOfRotation 0.0 1.0 0.0
children [ . . . ] }

Nót Anchor t¹o ra mét nhóm mà hoạt Nút Inline tạo ra một nhóm đặc biệt từ
động nh kiểu có thể kích chuột đợc
nội dung của một file VRML khác
Chỉ nút child là đợc hiển thị
Nút con đọc từ file đợc chọn bởi
URL
Kích chuột vào nút child theo sau
bởi một URL
Mỗi nút child là đợc hiển thị
Trờng description đặt tên cho nót
„ Inline { url "table.wrl" }
anchor
„ Inline {
url "table.wrl" } . . .
Anchor {
Transform {
url "stairwy.wrl"
translation -0.95 0.0 0.0
description "Twisty Stairs"
rotation 0.0 1.0 0.0 3.14
children [ . . . ] }
children [ Inline { url "chair.wrl" } ] }
Xem code

Chạy ví dụ
Chạy ví dụ
Xem code





(c) SE/FIT/HUT 2002

(c) SE/FIT/HUT 2002

Đặt tên





Từ khóa use

Nếu nhiều vật thể giống nhau về các
yếu tố hình học hay hình dạng , bạn
phải dùng nhiều nút giống hệt nhau
Thay vào đó , định nghĩa một tên
cho nút tìm thấy đầu tiên
Sau đó, sử dụng tên đấy để chia sẻ
cho nút tơng tự ở trong ngữ cảnh
mới








Cú pháp DEF tạo ra tên cho một
nút
Shape {
appearance Appearance {
material
DEF RedColor
Material { diffuseColor 1.0 0.0 0.0
} } geometry . . . }
DEF bắt buộc phải ký tự hoa
Có thể đặt tên cho một nút nào đấy
Tên có thể là hầu hết các chuỗi ký
tự và số
Trong một file tên phải là duy
nhất



Từ khoá USE cho phép sử dụng
một nút đà đợc đặt tên trớc
Shape {
appearance Appearance {
material
USE RedColor }
geometry . . . }
Xem code


(c) SE/FIT/HUT 2002

„

„
„

USE bắt buộc phải là chử hoa
Sử dụng lại nút đà đợc đặt tên
gọi là một biến hay một thể hiện
Một nút đà đợc đặt tên có thể có
một vài thể hiện
Mỗi thể hiện chia sẻ cùng một
miêu tả về nút đấy
Chỉ có thể có thể hiên mà tên
của nút đà đợc định nghĩa
trong cùng một file

(c) SE/FIT/HUT 2002

Giới thiệu hoạt cảnh

u điểm


Chạy ví dụ




Đặt tên và sử dụng nút:
Lu những gì đà đánh vào
Giảm kích thớc file
Cho phép thay đổi nhanh chóng các vật thể có cùng thuộc tính
Tăng tốc độ cho quá trình xử lý trên trình duyệt
Tên cũng cần thiết cho cảnh ®éng

„
„
„

„

...
„

(c) SE/FIT/HUT 2002

Lê Tấn Hùng CNTT- ĐHBK Hà nội
Email:

C¸c nút nh Billboard và Anchor có các hành động xây dựng sẵn
Bạn có thể tạo ra hành động của riêng bạn nh làm cho các vật thể có
thể di chuyển,xoay, co giÃn và hơn thế nữa
Chúng ta cần một phơng thức để kích , thời gian hoá, và đáp ứng một
chuỗi các sự kiện theo một trật tự để một sự tơng tác tốt hơn giữa ngời
dùng và thế giới bên ngoài
Hầu hết các nút đều có thể là thành phần trong một dòng hoạt cảnh
Nút hoạt động nh các phần điện tử ảo
Nút có thể gửi và nhận các sự kiện

Các đờng dây nối các nút lại với nhau
Một sự kiện là một thông báo đợc gửi giữa các nút
Một giá trị dữ liệu (giống nh sự dịch chuyển)
Thời gian hoàn thành (Khi sự kiện đợc chứng nhận là đà đợc gửi)

(c) SE/FIT/HUT 2002

Page 5


Thêm các sự kiện




Cài đặt hoạt cảnh


Để quay một vật thể:
ã Nối một nút mà gửi sự kiện rotation với trờng rotation của nút
Transform
Để làm một vật thể nhấp nháy:
ã Nèi nót gưi sù kiƯn color víii tr−êng diffuseColor cđa nút
Material









Để cài đặt một dòng hoạt cảnh , bạn cần ba thứ :
Một nút gửi sự kiện
Nút phải đợc đặt tên với câu lệnh DEF
Một nút nhận sự kiện
Nút phải đợc đặt tên với câu lệnh DEF
Một đờng dây kết nốichúng lại
Mỗi nút có các trờng , thông tin vào và thông tin cần có:
field: Một giá trị dữ liệu đợc lu trử
eventIn: đầu vào
eventOut: đầu ra
Một trờng exposedField viết gọn cho một giá trị dữ liệu, đầu vào và đầu
ra

(c) SE/FIT/HUT 2002

(c) SE/FIT/HUT 2002

Các vÝ dơ Vµo- ra
„

Nót OrientationInterpolator
cã sù kiƯn ra :
„ value_changed đa ra giá trị
góc xoay



Nút PositionInterpolator có

sự kiện ra :
value_changed đa ra vị trí



Nút TimeSensor có sự kiện ra:


time ®−a ra thêi gian

Tõ khãa route
„

Nót Transform cã c¸c sù kiện
vào:
set_translation
set_rotation
set_scale



Nút




Material có các sự kiện vàu:
set_diffuseColor
set_emissiveColor
set_transparency




Câu lệnh ROUTE cho phÐp kÕt nèi „ C¸c quy −íc vỊ đặt tên
hai nút lại với nhau :
Hầu hết các nút đều có exposedFields
Tên nút gửi và sự kiện ra
Nếu trờng exposed tên là xxx, thì:
Tên nút nhận và s kiện vàu
ã set_xxx là một sự kiện vào
ROUTE
đợc gán cho trờng
MySender.rotation_changed
ã xxx_changed là sự kiện ra
TO MyReceiver.set_rotation
đợc gửi đi khi trờng đó thay
ROUTE và TO bắt buộc phải là
đổi
ký tự hoa
ã Các tiếp ngữ set_ và _changed
là tuỳ chọn nhng nên có để
phân biệt
Nút Transform có:
Trờng rotation
ã Sự kiện vào set_rotation
ã Sự kiện ra rotation_changed

(c) SE/FIT/HUT 2002

Hoạt cảnh





(c) SE/FIT/HUT 2002

điều khiển thời gian

Hoạt cảnh cho phép thay đổi qua thời gian:
ã Vị trí một ô tô đang đi
ã Hớng - một máy bay đang lợn
ã Màu sắc đổi mùa
Hoạt cảnh bắt buộc điều khiển qua thời gian:
ã Khi nào thì bắt đầu và dừng
ã Mức độ nhanh chậm

(c) SE/FIT/HUT 2002

Lờ Tn Hựng CNTT- HBK H ni
Email:







Nút TimeSensor cho phép bạn điều khiển thời gian bắt đầu và kết thúc
Nút cảm ứng tạo sự kiện thời gian khi nó đang chạy
Để kích hoạt , dẫn các sự kiện thời gian tới các nút khác

Nút TimeSensor tạo ra hai sự kiện thời gian là absolute and fractional
Sự kiện thời gian Absolute tạo ra thời gian thực
ã Thời gian tuyệt đối đợc đu bằng giây từ 12:00h mồng 1 tháng 1
năm 1970!
ã Rất có Ých cho viÖc triÖu gäi mét sù kiÖn ë thêi gian cơ thĨ

(c) SE/FIT/HUT 2002

Page 6


sử dụng thời gian phân đoạn




Sự kiện thời gian phân đoạn nhận các giá trị số từ 0.0 tới 1.0
Khi nút cảm ứng thời gian bắt đầu , đầu ra cđa nã lµ 0.0
„ KÕt thóc mét chu kú_ cycle, đầu ra của nó là 1.0
Số giây giữa 0.0 và 1.0 đợc xác định bởi xung tuần hoàn_ cycle
interval
Cảm biến thời gian có thể chạy mÃi , hoặc chỉ chạy qua một vòng rồi
dừng

Nút timesensor




Nút TimeSensor tạo ra các sự kiện

dựa vào thời gian
Thời gian bắt đầu_ startTime và
thời gian kết thúc_ stopTime khi
chạy
Thời gian tuần
hoàn_cycleInterval thời gian cho
một chu kỳ là bao lâu
Lặp_loop có lặp lại hay không

TimeSensor {
cycleInterval 1.0
loop FALSE

startTime 0.0
stopTime 0.0 }
„

(c) SE/FIT/HUT 2002

Tr−êng ra d÷ liƯu isActive :
„ Ra dữ liệu là TRUE khi bộ thời gian bắt
đầu
Ra dữ liệu là FALSE khi bộ thời gian
kết thúc
Trờng ra dữ liệu time :
Đa ra thời gian tuyệt đối



Trờng ra dữ liệu fraction_changed :

Đa ra các giá trị từ 0.0 tới 1.0 trong
suốt một chu ký
Đặt lại giá trị 0.0 lúc bắt đầu mỗi chu
kỳ
Chạy ví dụ
Xem code





Để kích hoạt vị trí của một vật thể
VRML cung cấp:
ã Một danh sách khoá về vị
trí key positions cho đờng
di chuyển
ã Thời gian bắt đầu ở mỗi vị
trí
Nút interpolator có thể chuyển đổi
một đầu vàu thời gian thành một
đầu ra toạ độ
ã Khi thời gian ở giữa hai
khoá vị trí, nút interpolator
sẽ tính toán vị trí trung gian

(c) SE/FIT/HUT 2002

Nút positioninterpolator






Nút PositionInterpolator miêu
tả vị trí của đờng dẫn
ã key khoá thời gian phân
đoạn
ã keyValue khoá vị trÝ
PositionInterpolator { key [ 0.0,
. . . ] keyValue [ 0.0 0.0 0.0, . . . ]
}
Thờng để gửi vào sự kiện đầu
vào set_translation của nút
Transform

đặt khi bộ thời gian sắp bắt đầu

Chuyển đổi thời gian ra toạ độ







Sự kiện vàu dữ liệu set_stopTime :
đặt khi bộ thời gian kết thúc

(c) SE/FIT/HUT 2002


Trờng ra dữ liệu


Để tạo ra bộ thời gian chạy liên tục:
loop TRUE
stopTime <= startTime
Khi stop time <= start time,thì stop
time bị bỏ qua
Chạy cho tới khi stop time:
loop TRUE
stopTime > startTime
Để chạy một vòng rồi sau đó dừng:
loop FALSE
stopTime <= startTime
Sự kiện vào dữ liệu set_startTime :





Sự kiện đầu vào set_fraction :
ã Đặt thời gian phân đoạn
hiện thời theo khoá đờng
dẫn
Sự kiện đầu ra value_changed :
ã Đa ra vị trí theo đờng
dẫn mỗi khi fraction đợc
đặt
Chạy ví dụ
Xem code


(c) SE/FIT/HUT 2002

Lờ Tn Hựng CNTT- HBK H ni
Email:






Interpolating positions
Mỗi khoá vị trí cùng với đờng
dẫn có:
Một khoá giá trị key value
(nh là một vị trí)
Một khoá thời gian phân đoạn
Phép nội suy sẽ điền vàu các giá
trị vàu giữa các giá trị khoá:
Fractional
TimePosition
0
0.1
..
1

(c) SE/FIT/HUT 2002

Sử dụng các nút interpolator khác







Kích hoạt vị trí
PositionInterpolator
Kích hoạt hớng
OrientationInterpolator
Kích hoạt co giÃn Position Interpolator
Kích hoạt màu sắc ColorInterpolator
KÝch ho¹t tÝnh trong suèt ScalarInterpolator

(c) SE/FIT/HUT 2002

Page 7


Colorinterpolator-scalarinterpotator







OrientationInterpolator
Nút OrientationInterpolator mô
tả đờng dẫn hớng
ã key khoá thời gian phân

đoạn
ã keyValue khoá về xoay
(gồm cạnh và góc)
OrientationInterpolator { key [
0.0, . . . ] keyValue [ 0.0 1.0 0.0
0.0, . . . ] }
Thờng gửi giá trị về góc xoay
vào sự kiện set_rotation của nút
Transform




PositionInterpolator
Nút PositionInterpolator mô tả
đờng dẫn vị trí hay tỷ lệ
ã key khoá thời
gian phân đuạn
ã keyValue khoá
vị trí (hoặc tỷ lệ)
ã PositionInterpolator {
key [ 0.0, . . . ] keyValue [
0.0 0.0 0.0, . . . ] }
ã Thờng gửi giá trị vị trí vào
sự kiện set_scale của nút
Transform










ColorInterpolator
Nút ColorInterpolator mô tả đờng
dẫn màu sắc
ã key khoá thời gian phân
đoạn
ã keyValue khoá màu
(đỏ,xanh dơng,xanh da trời)
ColorInterpolator { key [ 0.0, . . . ]
keyValue [ 1.0 1.0 0.0, . . . ] }
Thờng gửi vàu sự kiện đầu vào
set_diffuseColor hay
set_emissiveColor cđa nót
Material
Xem code
Ch¹y vÝ dơ

(c) SE/FIT/HUT 2002

nót Sensor
„
„
„
„

„

„

„
„

„

ScalarInterpolator
Nót ScalarInterpolator mô tả
đờng dẫn vô hớng
ã key khoá thời gian phân
đoạn
ã keyValue khoá vô
hớng (dùng cho bất cứ
vật thể nµo)
ScalarInterpolator { key [ 0.0, . .
. ] keyValue [ 4.5, . . . ] }
Th−êng gưi vµo sù kiƯn
set_transparency cđa nót
Material
Xem code
Ch¹y vÝ dơ

nót Sensor

Cã 7 kiĨu nót sensor .
Nút sensor dò các hành động của ngời dùng và phát ra một
sự kiên.
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
chu kỳ đơn gồm có nguyên nhân_kết quả.

Bốn bài cuối cùng trong phần VRML Resources | Example
VRML Worlds của Website là nhng ví dụ hay về các nút
sensor và liên kết với các sự kiện.

nút Sensor viewer




(c) SE/FIT/HUT 2002







(c) SE/FIT/HUT 2002





Motivation
Cảm ứng vị trí ngời dùng cho phép kích hoạt các hoạt cảnh
ã Khi một vùng hữu hình đối với ngời dùng
ã Khi ngời dùng ở trong một vùng nào đó
ã 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 xây dựng săn

Có 3 kiểu nút viewer sensor:
ã Nút VisibilitySensor cảm biến nếu ngời dùng có thể thấy một
vùng nào đó a region
ã Nút ProximitySensor cảm biến khi ngời dùng đến phạm vi xung
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

Lờ Tn Hựng CNTT- HBK H ni
Email:

Nút ProximitySensor phát hiện ra vị trí quan sát gần nhất
Nút TouchSensor phát hiện sự kiện kích chuột
Nút TimeSensor là bộ đếm thời gian
Tất cả các nút CylinderSensor, PlaneSensor and
SphereSensor phát hiện trạng thái kéo các vật thể.
Nút VisibilitySensor nhận biết một đối tợng là hữu hình đối
với ngời dïng

(c) SE/FIT/HUT 2002

Dïng visibilitysensor vµ proximitysensor
„

„

Hai nót VisibilitySensor vµ ProximitySensor cảm biến vùng vật thể
dạng hộp
ã center tâm vùng

ã size kích thớc vùng
Cả hai nút có đầu ra gièng nhau :
• Sù kiƯn enterTime – gưi thêi gian vào vùng vào hay 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

(c) SE/FIT/HUT 2002

Page 8


nút ProximitySensor

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

„

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

(c) SE/FIT/HUT 2002

Chạy ví dụ
(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
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

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 { . . . } . . . ] }
Ch¹y vÝ dơ
Xem code



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

Lê Tấn Hùng CNTT- ĐHBK Hà nội
Email:

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 cht
• CylinderSensor khi kÐo
cht
• 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

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ơ


(c) SE/FIT/HUT 2002

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ể nhng. . .
ã 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

#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) 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
ã 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


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ụ


(c) SE/FIT/HUT 2002

Java



Đị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 class

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

Lê Tấn Hùng CNTT- ĐHBK Hà nội
Email:

„
„

„

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
(c) SE/FIT/HUT 2002

Page 10


Sự kiện -event


Trờng eventout từ java

Đá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




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 );

Xem code java

(c) SE/FIT/HUT 2002


Lê Tấn Hùng CNTT- ĐHBK Hà ni
Email:




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) SE/FIT/HUT 2002

Page 11



×