VRML1 1994 & VRML2 1997 có mở rộng thêm các chủ đề liên quan c SE/FIT/HUT 2002 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
Trang 1(c) SE/FIT/HUT 2002
Ngôn ngữ mô hình hóa thực tại ảo
VRML
(c) SE/FIT/HUT 2002
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
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 )
(c) SE/FIT/HUT 2002
Cấu trúc file VRML
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à
#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
} } }
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.
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,
Trang 2(c) SE/FIT/HUT 2002
Cấu trúc phân lớp
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
}
Đô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.
(c) SE/FIT/HUT 2002
Cấu trúc cảnh
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
geometry
material
zBox
zMaterial diffuseColor
(c) SE/FIT/HUT 2002
Cơ bản về nút shape
{size 8 12 10 # x, y, z (=w, h, d)
} Xem code Chạy ví dụ
Cone
units wide
}
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 :
• 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,
nhưng có thể bất cứ đơn vị gì
(c) SE/FIT/HUT 2002
Cơ bản về nút shape
Cylinder
bottom TRUE # “cup” có cạnh và đáy
}
Xem code Chạy ví dụ
} Xem code Chạy ví dụ
Nút text
Tránh tạo ra các đặc tả kỹ thuật Web-based 3D/VR
Text rất hữu ích ở các hệ chuyên gia,ví dụ như trong khoa học về trực quan
Text
length 0 # stretch to this width (0=natural width)
fontStyle FontStyle
{ family “SERIF” # or SANS or TYPEWRITER
}
} Xem code Chaỵ ví dụ
Cấu trúc ảnh bitmap
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
Trang 3(c) SE/FIT/HUT 2002
Cấu trúc trong VRML
Appearance
{ texture ImageTexture
repeatSTRUE # repeat or stretch?
repeatT TRUE
}
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ụ
(c) SE/FIT/HUT 2002
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ạ độ thuận 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 nó
• 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 { } ] }
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 [ ] }
Nút transform
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 Xem code Chạy ví dụ
Trang 4(c) SE/FIT/HUT 2002
nút Appearance
Các vật thể gốc có màu phát ra từ bề
ngoài là màu trắng
Bạn có thể điều khiển màu của một
vật thể:
•Màu bóng
•Màu phát ra
•Tính trong suốt
•Tính không chiếu sáng
•Cường độ ánh sáng bao
quanh
Một nút Appearance miêu tả toàn
bộ hình dạng của vật thể
• Trường material gồm các
thuộc tính như color, transparency, etc
Shape { appearance Appearance { material }
geometry }
(c) SE/FIT/HUT 2002
nút Material
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
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
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ụ
(c) SE/FIT/HUT 2002
Bảng màu thường dùng
0.12 0.83 0.83 0.83 0.20 0.20 0.71
0.10 Plastic Blue
0.20 0.61 0.13 0.18 0.27 0.00 0.00
0.15 Metalic Red
0.20 0.64 0.00 0.98 0.10 0.03 0.22
0.17 Metalic Purple
0.16 0.71 0.70 0.56 0.22 0.15 0.00
0.40 Gold
0.08 0.75 0.33 0.00 0.30 0.11 0.00
0.26 Copper
0.10 0.70 0.70 0.80 0.30 0.30 0.50
0.30 Aluminum
shininess specular
Color diffuse
Color ambient
Intensity Mô tả
nút Group
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:
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 { } Xem code Chaỵ ví dụ Billboard
Switch
Collision
Inline
Anchor
LOD Group
Transform
Kết nối tới một vị trí khác
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
Trang 5(c) SE/FIT/HUT 2002
Các nút Group-Switch-Transform
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ể chuyển 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 [ ] }
(c) SE/FIT/HUT 2002
Nút Anchor và Inline
Nút Anchor tạo ra một nhóm mà hoạt
động như kiểu có thể kích chuột được
Chỉ nút child là được hiển thị
Kích chuột vào nút child theo sau bởi một URL
Trường description đặt tên cho nút
anchor Anchor { url "stairwy.wrl"
description "Twisty Stairs"
children [ ] }
Xem code Chạy ví dụ
Nút Inline tạo ra một nhóm đặc biệt từ
nội dung của một file VRML khác
Nút con đọc từ file được chọn bởi URL
Mỗi nút child là được hiển thị
Inline { url "table.wrl" }
Inline { url "table.wrl" } Transform { translation -0.95 0.0 0.0 rotation 0.0 1.0 0.0 3.14 children [ Inline { url "chair.wrl" } ] } Xem code Chạy ví dụ
(c) SE/FIT/HUT 2002
Đặt tên
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
(c) SE/FIT/HUT 2002
Từ khóa use
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 Chạy ví dụ
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
ưu điểm
Đặt tên và sử dụng nút:
Lưu 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
Giới thiệu hoạt cảnh
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)
Trang 6(c) SE/FIT/HUT 2002
Thêm các sự kiện
Để 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) SE/FIT/HUT 2002
Cài đặt hoạt cảnh
Để 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 lưu 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ác ví dụ Vào- ra
Nút OrientationInterpolator
có sự kiện ra :
value_changed đưa ra giá trị
góc xoay
NútPositionInterpolator có
sự kiện ra :
value_changed đưa ra vị trí
Nút TimeSensorcó sự kiện ra:
time đưa ra thời gian
NútTransformcó các sự kiện vào:
set_translation
set_rotation
set_scale
NútMaterialcó các sự kiện vàu:
set_diffuseColor
set_emissiveColor
set_transparency
(c) SE/FIT/HUT 2002
Từ khóa route
Câu lệnh ROUTE cho phép kết nối
hai nút lại với nhau :
Tên nút gửi và sự kiện ra
Tên nút nhận và sư kiện vàu
MySender.rotation_changed
TO MyReceiver.set_rotation
ROUTE và TO bắt buộc phải là
ký tự hoa
Các quy ước về đặt tên
Hầu hết các nút đều có exposedFields
Nếu trường exposed tên là xxx, thì:
•set_xxx là một sự kiện vào
được gán cho trường
•xxx_changed là sự kiện ra
được gửi đi khi trường đó thay
đổi
•Các tiếp ngữ set_ và _changed
là tuỳ chọn nhưng 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
Hoạt cảnh
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
điều khiển thời gian
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ể
Trang 7(c) SE/FIT/HUT 2002
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
(c) SE/FIT/HUT 2002
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 }
Để 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 :
đặt khi bộ thời gian sắp bắt đầu
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
Trường ra dữ liệuisActive :
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ệutime :
Đưa ra thời gian tuyệt đối
Trường ra dữ liệufraction_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ỳ
Xem code Chạy ví dụ
(c) SE/FIT/HUT 2002
Chuyển đổi thời gian ra toạ độ
Để 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
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
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
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 Xem code Chạy ví dụ
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
Trang 8(c) SE/FIT/HUT 2002
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, ] }
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
(c) SE/FIT/HUT 2002
Colorinterpolator-scalarinterpotator
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ụ
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ụ
(c) SE/FIT/HUT 2002
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à nhưng ví dụ hay về các nút
sensor và liên kết với các sự kiện.
(c) SE/FIT/HUT 2002
nút Sensor
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
nút Sensor viewer
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
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
Trang 9(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
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ụ
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 { } ] }
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
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
Trang 10(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 }
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" }
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 :