Tìm hiểu ngôn ngữ VRML
Trang 1Tìm hiểu ngôn ngữVRML
Lời nói đầu
Trong xu thế tin học hoá toàn bộ cuộc sống đang diễn ra tấp nập hiện nay,lĩnh vực đồ hoạ đóng góp một vai trò cực kỳ to lớn.Ở đâu ta cũng có thể tìm thấy những minh hoạ cho việc áp dụng đồ hoạ máy tính vào cuộc sống : xử lý ảnh, phim hoạt hình, đặc biệt là thực tại ảo(Virtual Reality_VR) Thực tại ảo,là một nghành công nghệ cao,có ứng dụng đặc biệt rộng rãi.Từ các trò chơi 3D cực kì sống động đến những mô phỏng phức tạp trong công nghiệp và khoa học công nghệ(mô phỏng các
vụ thử hạt nhân,mô phỏng thế giới ảo dùng để huấn luỵện phi công…),từ những trường hợp đơn giản đến các trường hợp cực kì quan trọng
Một phần quan trọng của VR là mô phỏng thế giới thực xung quanh chúng ta.Để làm được điều này, chúng ta có thể dùng ngôn ngữ VRML(Virtual Reality Modeling Language).Đây là một ngôn ngữ tương đối đơn giản nhưmg cực kỳ hiệu quả.Với VRML,kết hợp với trình duyệt IE hay Nescape,chúng ta có thể mô phỏng thế giới quanh ta một cách như ý.Trong thế giới đó,có các vật thể,có các tương tác và
có các cảm biến y như thế giới thực.Ứng dụng của VRML cũng rất rộng rãi : mô phỏng nhà cửa,thiết kế các phòng học ảo,các thiết bị thí nghiệm ảo, lập trình không gian ảo…
Trong bài tập lớn môn học này,em đã tìm hiểu về VRML và dùng ngôn ngữ VRML để mô phỏng toà nhà C14-15 của trường đại họcBKHN.Tuy được sự hướng dẫn tận tình của thầy Hùng nhưng do thời gian và năng lực còn có hạn nên kết quả còn nhiều thiếu sót.Tuy nhiên,em rất cám ơn thầy Hùng vì môn học và bài tập lớn này đã đem lại cho em nhiều hiếu biết về thế giới đồ hoạ,mở ra cho chúng em một hướng đi mới trong lĩnh vực tin học
Trang 2BÁO CÁO BÀI TẬP LỚN MễN HỌC
"ĐỒ HOẠ MÁY TÍNH VÀ HIỆN THỰC ẢO"
b,Soạn thảo VRML
Điều tiếp theo bạn cần là tạo nên các thế giới của bạn Có hai cách để thực hiện điều này Đầu tiên bạn có thể sử dụng một trong các công cụ tạo ra VRML, chính là các mô hình 3D mà bạn có thể tạo ra thế giới của bạn Một phơng pháp thực hiện VRML là mã hoá bằng tay, tất cả bạn cần là việc soạn thảo văn bản wordpad hoặc notepad VrmlPad là
bộ soạn thảo Vrml đặc biệt hiệu quả với đặc điểm nổi bật cú pháp Loại đơn giản đợc mã hoá chỉ ra, đợc cất dới file có dạng filename.wrl Sau đó bạn có thể tải vào browser và lấy
ra để xem Nếu bạn sử dụng bộ soạn thảo phức tạp hơn, nh Wordpad, hãy đảm bảo cất dới file đơn giản hoặc nếu không nó sẽ không làm việc
Làm việc với VRML cha có kinh nghiệm, nó có thể rất khó để tạo ra các đối tợng phức tạp Để thực hiện điều này bạn cần phải sử dụng hoặc công cụ bản quyền mức cao hoặc ngôn ngữ mô hình hoá Nếu bạn đi đến các lựa chọn muộn hơn, bạn có thể sẽ cần vài loại file chơng trình biên dịch để chuyển giữa các dạng mô hình hoá và VRML Bộ biên dịch miễn phí là crossroads Các công cụ VRML cấp cao có sẵn đối với nhiều công
ty
c Kỹ thuật nén, MIME và xuất bản
Sự mở rộng thông thờng cho các file VRML là wrl và wrz sử dụng cho việc nén VRML Browser có thể đọc các file VRML bị nén bởi GZIP Các file nén có thể sử dụng
nh wrz, wrl.gz hoặc sự mở rộng chuẩn wrl GZIP là một chuẩn cân bằng trên các hệ thống UNIX nhng bạn có thể nhận thấy trên phiên bản PC hoặc Mac Cách tốt nhất để nén các file là sử dụng Chisel, là bộ xác nhận và bộ đánh giá VRML có thể bị cất các file VRML GZIP Đây là một công cụ tốt để có bất kỳ cách nào cho việc gỡ rối mã bởi vì không có ai viết VRML hoàn hảo ngay từ lần đầu tiên
Tất cả các tài liệu internet theo chuẩn MIME, chuẩn VRML MIME là model/vrml, tơng
tự nó có thể là x-world/x-wrml Mỗi khi bạn tạo thế giới của bạn, bạn cần tạo nó lên trang
Trang 3web để mọi ngời có thể xem nó Đối với việc này bạn cần một vài ISP (Internet Service Provider) Bạn có thể sử dụng không gian này để đa các file lên trang web, có thể là các file HTML thông thờng.
d Headers và chú thích
VRML(Virtual Reality Modeling Language), là ngụn ngữ cho phộp mụ tả cỏc đối tượng 3D của thể giới thực, và chạy trờn mụi trường web Nú cho phộp xõy dựng nờn cỏc file wrl cú thể mở được bằng cỏc trỡnh duyệt web như IE hay NESCAPE Một file vrml
cú dạng như sau:
Tiờu đề file: #VRML V2.0 utf8
trong đú utf8 là cụm từ cho phộp dựng cỏc ký tự quốc tế trong file VRML sau đú là cỏc nỳt Điều này nói cho các browser xem xét file VRML, và phiên bản này nó đang sử dụng Trong trờng hợp này nó là phiên bản 2.0 VRML là trờng hợp dễ bị ảnh hởng(case sensetive), việc sử dụng chính xác nh bạn đã thấy Phần utf8 thông báo cho browser chuẩn chuỗi văn bản để sử dụng VRML 1.0 hoặc là ascii hoặc utf8 nhng phiên bản 2.0 chỉ là utf8, tốt nhất để sử dụng
Bất kỳ dòng nào bắt đầu với kí tự # là chú thích, và bị lờ đi khỏi bộ phân tích cú pháp VRML Tiếp theo là VRML hợp lệ
WorldInfo cũng có thể chứa một chuỗi thông tin, chứa các thông tin khác về file Bạn có
thể đặt vào các từ khoá cho các search engine Một nút WorldInfo mẫu đợc chỉ ra ở dới
đây:
WorldInfo {
title "Floppy's VRML97 Tutorial Example 1"
info ["(C) Copyright 1999 Vapour Technology"
"guide@vapourtech.com"]
}
Có thể có các chuỗi phức tạp trong trờng info, bằng cách đặt chúng bên trong ngoặc vuông Tiêu đề không cần ngoặc vuông, khi nó chỉ là một chuỗi đơn lẻ File VRML có thể có nhiều nút WorldInfo nhng chỉ có nút đầu tiên đợc phân tích, các phần sau bị lờ đi.
VRML cú 54 loại nỳt khỏc nhau, và được chia làm 9 nhúm, bao gồm:
Grouping Nodes : Cỏc nỳt nhúm
Trang 4Special Group Nodes: Các nút nhóm đặc biệt
Common Nodes: Các nút chung
Sensor Nodes: Các nút cảm biến
Geometry : Các nút hình học
Geometric Properties Nodes: Các nút thuộc tính hình học
Appearance Nodes : Các nút hình dáng
Interpolators Nodes Các nút nội suy
Bindable Nodes: Các có thể ghép nối được
Một nút gồm có :
Tên nút: Thường bắt đầu bằng chữ in hoa và chỉ có thể là một trong các tên chuẩn do vrml cung cấp, sau đó là đến các trường của nút chúng thường bắt đầu là chữ thường, mổi loại nút có các trường khác nhau Gía trị của trường có thể là các giá trị thực hoặc các bộ giá trị thực hoặc có thể là một nút cơ bản, ta có thể hình dung các nút như các lớp trong lập trình hướng đối tượng VRML không cho bạn định nghĩa thêm các nút mới của mình
mà chỉ được dùng các nút cơ bản của nó Một hình dạng hình học bất kỳ có thể được xây dựng qua nút Shape Cấu trúc của nút này có dạng như sau:
Shape{
appearance Appearance{
material Material{
diffuColor 1 0 0 Shininess 0
Chúng ta điểm qua một số nút cơ bản
Trang 5e1.Các nút appearrance
Khi chúng ta nhìn thấy đối tợng FBOX chúng ta đã định nghĩa trớc đây, nút Shape
có một trờng gọi là appearance, nó sử dụng để chứa trờng Appearance đợc chỉ ra dới
Ví dụ này có một trờng bên trong nút Appearance, trờng material Theo cách này
có các nút bên trong các nút dờng nh là khó khăn, nhng cho phép bạn định nghĩa các hình dạng do sử dụng DEF và USE Điều này là hiệu quả trong việc có nhiều đối tợng theo cùng một cách quan sát Nút Appearance có thể chứa trờng material và texture trờng material chứa nút Material Nút texture chứa một trong số các loại nút kết cấu Những
điều này đợc mô tả trong phần sau, trớc tiên chúng ta giải quytết các nút Material.
Ba tham số đầu tiên là các giá trị màu, ba tham số sau là các giá trị đơn giản giữa 0
và 1 Các màu sắc đợc chỉ rõ nh các thành phần red, green và blue nh trong HTML Bạn
có thể lấy bất kỳ màu nào bạn thích từ việc kết hợp các màu red, green và blue Các giá trị màu đơn lẻ nằm giữa 0( không màu) và 1(màu đầy đủ), vì vậy red đầy đủ đợc định nghĩa
Trang 6là 1 0 0, trắng là 1 1 1, xám là 0.5 0.5 0.5 Cách này có thể chỉ rõ các màu trong khi sử dụng nhng bạn có thể sử dụng bộ lựa chọn màu trong PaintShop Pro hoặc một vài thứ để
có thể nhận đợc các màu bạn thích và chuyển chúng thành giá trị VRML
Vì vậy nếu bạn muốn tạo hình khối ban đầu, với màu xanh bán trong suốt, bạn sẽ
định nghĩa dạng của nó nh sau:
e3,Kết cấu hình ảnh( image texture)
Các màu sắc thú vị là rất tốt nhng để trông thực sự là hấp dẫn, chúng ta phải có sơ
đồ kết cấu các vật thể Điều này đợc thực hiện qua trờng texture của nút Appearance
trờng này chứa ba loại nút kết cấu Loại đầu tiên chúng ta xem xét là ImageTexture Đây
là sơ đồ kết cấu cơ sở, ánh xạ toàn bộ hình ảnh vào một đối tợng Nút có thể là sơ đồ kết cấu một đối tợng với file JPEG hoặc PNG Một vài browser có thể hỗ trợ nó, nhng đây không phải là chuẩn nút có thể chứa ba trờng Đầu tiên, url chỉ rõ hình ảnh để sử dụng
chuẩn dạng URL Bạn có thể chỉ rõ danh sách hình ảnh trong các ngoặc vuông, browser
sẽ hiển thị hình ảnh đầu tiên trong danh sách mà nó tìm thấy Hai trờng khác là repeatS
và repeatT, thông báo liệu kết cấu lặp lại theo hớng trục ngang (S) hay trục dọc(T) Điều
này dẫn đến giá trị boolean là TRUE hoặc FALSE chúng chỉ thực sự hiệu quả khi kết hợp với TextureTransform, chúng ta khôg trình bày kỹ ở phần sau Bạn có thể chỉ rõ các
thông tin trong suốt trong các hình ảnh đã sử dụng trong trờng hợp nó thay thế lại sự trong suốt của các đối tợng ban đầu Nếu bạn sử dụng kết cấu tỉ lệ xám, diffuseColor đợc nhân lên với độ dày của kết cấu để tạo ra kết cấu thực sự Thực tế, bạn có thể tạo nhiều hiệu quả do kết hợp nút Material và ImageTexture Nói chung, chúng chỉ thực hiện những gì
bạn mong muốn, vì vậy chỉ cần quan sát và một chút kinh nghiệm là bạn có thể tạo ra đ
Trang 7}
}
khi nút appearance của hộp thứ hai.
e4 Movie Texture
MovieTexture nhận lấy phim MPEG và sơ đồ kết cấu lên một đối tợng theo cách
nh ImageTexture Nó có ba trờng giống nhau, ngoài ra có một số trờng khác, đó là: speed
Giá trị speed mặc định là 1, 2 là tốc độ tăng 2 lần Giá trị 0 luôn hiển thị ở cơ cấu
Nó có trờng image thay thế cho trờng URL.
Trờng image bao gồm hai con số chỉ rõ chiều rộng và cao của kết cấu, tiếp theo là
một con số chỉ rõ số lợng các thành phần Thành phần màu sắc là tỉ lệ xám, hai thành phần màu sắc là tỉ lệ xám với độ trong suốt, thành phần thứ ba là màu RGB và thứ t là RGB với độ trong suốt Sau các đối số này là danh sách các điểm pixel, là các số hexa với một byte cho mỗi thành phần Vì vậy pixel thành phần thứ t là red và 50 % độ trong suốt
là 0xFF00007F Các pixel đợc sắp xếp theo thứ tự từ đáy trái đến đỉnh bên phải Ví dụ
Trang 8Chúng ta chỉ cần mô tả nhanh về các số hexa Thông thờng ở máy tính thuận tiện khi chỉ rõ các con số là các số thập phân thông thờng (0-9) hoặc nhị phân (0-1) và ngoài
ra có một loại khác là hexadecimal, có dạng nh sau:
F trong số hexa là 15 trong số thập phân 10 trong hexa là 16 trong số thập phân
Chữ số hexa thông thờng đợc chỉ rõ 0x ở phía trớc để dễ dàng nhận ra Ví dụ 0x10 = 16, 0xFF = 255, và 0x7F = 12
e6 Văn bản và kiểu font( text và fontstyle)
Nút này tạo văn bản 2D trong thế giới Tất cả đều thực sự đơn giản trừ phi bạn muốn thực hiện các điều phức tạp hơn sử dụng Fontstyle Nút Text có 4 trờng Trờng đầu
tiên là string, bạn có thể định nghĩa chuỗi hoặc danh sách các chuỗi để hiển thị Trờng fontStyle chứa nút FontStyle Hai trờng cuối là maxExtent, bạn chỉ rõ độ rộng lớn nhất (
theo đơn vị mét) của văn bản và length là danh sách chiều dài đối với mỗi chuỗi, vì vậy
bạn có thể chỉ rõ độ rộng riêng biệt của mỗi chuỗi Nếu các length đợc chỉ rõ, browser sẽ
định lại kích thớc của văn bản để cho vừa với kích thớc đó
geometry Text {
string ["Hello", "World"]
fontStyle USE HELLOFONT
maxExtent 5
length [3, 3]
}
Trang 9Nút Text là phức tạp, FontStyle phức tạp hơn Cách tốt nhất để thực hiện ở đây là
liệt kê danh sách các trờng
size là chiều cao của dòng văn bản theo hệ mét Trờng family có thể nhận 3 giá trị và thay
đổi loại bề mặt cuỉa font Ba loại đó là "SERIF", "SANS", hoặc "TYPEWRITER", chúng rất rõ ràng Để thay đổi cách xem xét văn bản, bạn có thể sử dụng trờng style, có thể nhận
một trong các kiểu sau: "PLAIN", "BOLD", "ITALIC", hoặc"BOLD ITALIC" horizontal
là giá trị boolean chỉ ra liệu văn bản là ngang horizontal ("TRUE") hoặc dọc vertical ("FALSE") leftToRight và topToBottom cũng là giá trị boolean và cân bằng trong các
hoạt động trớc Tơng tự chuỗi utf-8 có thể xuất hiện khác nhau, phụ thuộc vào ngôn ngữ trong nó, vì vậy điều này là mã hoá hai kí tự đối với ngôn ngữ Thực sự không biết các mã
là gì, tốt nhất là lờ đi trờng này justify là hiệu quả và cóthể là một trong bất kỳ "BEGIN",
"MIDDLE", hoặc "END" spacing là số lợng không gian trôngd giữa các dòng trong văn
bản 1 là bình thờng, 2 là gấp đối khoảng cách (dòng trồng giữa mỗi dòng
Đó là FontStyle , bạn có thể thực sự lờ đi các trờng nhng style, family và justify
thực sự là hiệu quả
e7,Cỏc đối tượng cơ bản
Để chỉ hỡnh dỏng vật thể ta dựng trường geometry Giỏ trị của trường này là cỏc nỳt hỡnh học cơ bản.VRML hỗ trợ 4 đối tượng cơ bản , đú là: Cone(hỡnh nún), Cylinder(Hỡnh trụ), Box(Hỡnh hộp), Sphere(Hỡnh cầu) Đõy là bốn đối tượng hỡnh học cơ bản giỳp ta xõy dựng nờn cỏc đối tượng hỡnh học của mỡnh Cấu trỳc của cỏc nỳt này như sau
Nỳt Box:
Box{size cd cc cr} Trong đú cd, cc, cr là cỏc số thực lần lượt là chiều dài, chiều cao, chiều rộng của hỡnh hộp Tõm của hỡnh hộp là gốc tọa độ hệ thống
Nỳt Cylinder:
Trang 10radius Một giá trị thực chỉ bán kính đáy của hình nón
height Môt giá trị thực chỉ chiều cao của hình hộp
}
Nút Sphere:
Sphere{ radius } trường radius chỉ bán kính của hình cầu
Đây là bốn nút hình học cơ bản để bạn xây dựng nên các đối tượng hình học cơ bản của mình.Chúng được gọi là các nút hình học chuẩn Để xây dựng nên các đối tượng hình học không chuẩn bạn có thể dùng các nút IndexedFaceSet, IndexedLineSet,
IndexedPointSet,ElavationGrid, Extrusion
Thông thường khi bạn tạo ra một đối tượng tâm của nó trùng với tâm của hệ toạ độ địa phương, để di chuểyn đối tượng bạn dùng nút Transform
Transform{
Scale Chỉ sự biến đối của đối tượng
Translation chỉ các giá trị dịch chuyển theo các trục x, y, z
Rotation chỉ góc quay và trục quay
Children[] các nút con chịu tác động của translation và rotation }
Trong nút Transform Scale có tác động đầu tiên, sau đó đến rotation và translation
Để gom nhiều nút lại với nhau ta sử dụng nút Group, cú pháp của nó như sau:
Group{
Children[] chứa các nút con của nút này
Trang 11}
Trong VRML cũn cú cỏc nỳt cảm biến với đuụi là Sensor, cho phộp chỳng ta mụ phỏng một số loại cảm biến trong thực tế, như TimerSensor, TouchSensor, PlaneSensor Cỏc nỳt nội suy, như PositionInterpolator, OrientationInterpolator, ColorInterpolator, cho phộp bạn chuyển cỏc giỏ trị khỏc kiểu về kiểu giỏ trị mà bạn mong muốn như chuyờn sự thay đụi thời gian về giỏ trị dịch chuyển của một vật thể Cỏc nỳt nội suy đúng vai trũ là cỏc Engine trong luồng Animation của VRML TRong VRML cũn cú một số loại nỳt khỏc như LOD, Switch
2.Cỏc kiểu dữ liệu trong VRML
Nh đã nói ở phần trớc, các file VRML bao gồm một nhóm các nút Các nút này có thể chứa cá nút khác và có thể chứa các trờng Mỗi trờng có các kiểu dữ liệu khác nhau Sau đây là mô tả của chúng
SFBool
Đây là giá trị boolean đơn lẻ, có thể nhận giá trị "TRUE" or "FALSE"
SFColor & MFColor
SFColor là một trờng chứa màu đơn lẻ, đợc tạo nên từ ba số thực dấu chấm động giữa 0 và 1 tơng ứng với các giá trị màu red, green và blue, ví dụ 0 1 0 là green MFColor
là một trờng chứa các số nhân, ví dụ [0 1 0, 1 0 0, 0 0 1]
SFFloat & MFFloat
SFFloat là giá trị dấu chấm động đơn lẻ, ví dụ 7.5 MFFloat là một số các giá trị dấu chấm động, ví dụ [1.0, 3.4, 76.54]
SFImage
SFImage là hình ảnh hai chiều hoặc là màu hoặc là xám Nó bao gồm:
• Hai số nguyên, đại diện chiều rộng hoặc chiều cao của hình ảnh
• Một số nguyên biểu thị số thành phần của hình ảnh 1 chỉ là cá mức xám, 2 là các mức xám với độ trong suốt, 3 là màu RGB, 4 là RGB với độ trong suốt
• Sau đó, có các con số hexa are width * height bao gồm ahi chữ số cho mỗi thành
phần Vì vậy 0xFF là màu trắng trong hình ảnh 1- thành phần và 0xFF00007F sẽ
là nửa màu đỏ trong hình ảnh 4- thành phần
Các pixel đợc chỉ rõ từ trái sang phải, từ trên xuống dới
SFInt32 & MFInt32
Các số nguyên đơn lẻ hoặc chuỗi 32 bit có thể theo dạng thập phân hoặc hexa Các
số hexa bắt đầu với 32 bit, ví dụ 0xFF là 255 hệ thập phân
SFNode & MFNode
SFNode là một nút đơn lẻ và MFNode là danh sách các nút Trờng children với
nhiều nút là kiểu MFNode
SFRotation & MFRotation
Trang 12Các trờng này chỉ rõ một phép quay xung quanh một trục Nó đợc tạo nên từ 4 số thực dấu chấm động Ba số thực đầu tiên chỉ rõ các toạ độ X, Y và Z cho các vectơ tơng ứng với trục để quay, số thứ t là radian để quay Hơn nữa sự lựa chọn là rotation trong
phần 1.3 SFRotation là tập các giá trị đơn lẻ, MFRotation là một danh sách
SFString & MFString
Loại này chứa danh sách các kí tự trong tập kí tự utf-8 ASCII là tập hợp phụ của utf-8, vì vậy bạn không cần lo lắng về tập các kí tự khác nhau hoặc về bất kỳ điều gì khác Chuỗi (SFString) nh "Hello", trong dấu nháy kép Một danh sách (MFString) trông giống
nh : ["Hello", "World"]
SFTime & MFTime
Thời gian đơn lẻ hoặc một danh sách thời gian Thời gian đợc chỉ rõ nh các số dấu chấm động biểu thị số lợng các giây trôi qua từ nửa đêm ngày 1 tháng giêng 1970 Điều này tạo nên nhiều cảnh quan hơn khi chú ý đến các sự kiện sau đó
SFVec2f & MFVec2f
Các vectơ đơn lẻ hoặc danh sách các vectơ 2D Một vectơ 2D là một cặp các số thực dấu chấm động
SFVec3f & MFVec3f
Các vectơ đơn lẻ hoặc danh sách các vectơ 3D Một vectơ 3D là một bộ 3 các số thực dấu chấm động
3.Hệ toạ độ trongVRML
Tất cả các khoảng cách trong VRML đợc đo bằng mét Hệ thống toạ độ VRML
đ-ợc chỉ ra trong sơ đồ sau:
Trang 13Các phép quay trong VRML làm việc theo luật tay phải Nếu bạn tởng tợng việc đặt bàn tay bao trùm lên một trong số các trục, với ngón tay cái chỉ theo chiều dơng, hớng quay dơng cùng chiều với hớng của bàn tay, nghĩa là ngợc chiều với kim đồng hồ là hớng dơng Điều này là đúng đối với các phép quay đối với bất kỳ trục nào, vì vậy nếu bạn muốn quay một đối tợng một góc 90 xung quanh trục X, bạn sẽ phải sử dụng góc quay
âm 90 Điều này cũng áp dụng cho các phép quay xung quanh một trục tuỳ ý, đợc giải thích trong phần sau của tài liệu này Một điểm cần chú ý là các phép quay đợc đo bằng radian chứ không đo bằng độ Vì vậy để thực hiện phép quay nh đã mô tả ở trên, bạn phải thực hiện phép quay -1.57 xung quanh trục X Ta phải nhớ là 3.14 radian tương ứng với
180 độ
4,Cỏc phộp biến đổi trong VRML
Để tạo nên thế giới sử dụng tất cả mọi thứ, chúng ta cần có thể biến đổi đợc mọi đối tợng VRML có ba loại biến đổi có thể áp dụng cho các đối tợng Đó là translations, rotations, và scales, và chúng đợc sử dụng trong nút Transform Nhng không phải một
nút Transform phải có đầy đủ ba loại biến đổi trên, ví dụ trong nút Transform chỉ có
phép quay rotation Các phép biến đổi trong Transform có thể áp dụng cho các nút con children của nút Điều này gọi là một tổ hợp, một nút cha có thể có nhiều nút con Cú
pháp cho vấn đề này đợc chỉ ra dới đây, áp dụng cho nút Transform
Z
Trang 14Một nút Transform có thể có các tổ hợp khác bên trong nút con của nó, cho phép
bạn thực hiện tuần tự một chuỗi các phép biến đổi Chú ý rằng trật tự các phép biến đổi là không quan trọng Một phép quay đợc tiếp theo một phép biến đổi không giống với một phép biến đổi thực hiện sau phép quay Bên trong một nút Transform đơn lẻ, các phép
biến đổi đợc thực hiện theo một trật tự chặt chẽ: Scale, Rotate và Translate Vì vậy nếu bạn muốn thực hiện phép biến đổi sau phép quay, bạn cần tổ hợp các nút Transform bên
trong các nút khác
Tiếp theo chúng ta cần mô tả mỗi loại phép biến đổi làm việc nh thế nào
a Translation and Scale ( Phép biến đổi và tính tỉ lệ)
Có hai phép biến đổi tợng tự nhau, cả hai đều nhận ba đối số : giá trị x, y và z Phép biến đổi dịch chuyển trung tâm của đối tợng trong các khoảng cách này theo hớng thích hợp Tỉ lệ nhân với kích thớc của đối tợng bởi các giá trị này theo các hớng thích hợp Một phép biến đổi 0 theo một hớng sẽ loại bỏ các đối tợng không ảnh hởng đến hớng Yếu tố tỉ lệ 0 làm cho đối tợng không chính xác theo hớng đó, là điều bình thờng không
đợc mong muốn Yếu tố 1 đợc yêu cầu mà không có ảnh hởng nào cả
Quan trọng chú ý rằng việc tính tỉ lệ là tơng đối cho nguyờn bản , không phải là trung tâm
của đối tợng Vì vậy để tính tỉ lệ của trung tâm của đối tợng, chúng ta phải đảm bảo rằng
đối tợng đợc đặt trung tâm tại phần mở đầu Đó là lí do tại sao việc tính tỉ lệ phải thực hiện trớc phép quay và phép biến đổi
b Rotation ( phép quay)
Phép quay có điểm hơi khác so với hai loại ở trên Nó nhận 4 tham số, đầu tiên là ba toạ độ xác định trục của phép quay và cuối cùng là góc quay, tính bằng radian Ví dụ để quay 1 radian xung quanh trục Y, bạn phải viết:
Chiều dài của trục quay là bất kỳ, không cần thiết là 1 Bạn có thể sử dụng giá trị Y
là 50 nếu bạn thích nhng nó không thực hiện điều gì khác với giá trị Y là 1 Trục quay hoàn toàn là tuỳ ý, bạn có thể quay quanh bất kỳ trục nào bạn thích Ví dụ trục 1 0.3 2.45
là hoàn toàn hợp lý Thật là khó khăn để tạo các phép quay theo cách này, tuy nhiên chúng có thể khó khăn để quan sát, đặc biệt nếu bạn không có bất kỳ sự luyện tập nào Chính vì điều đó Vapour Technology đã tạo ra một cặp công cụ Dizzy và Twister Twister tạo phép quay vuông góc với trục từ một loại đơn giản hơn và Dizzy kết hợp nhân các phép quay vuông góc với trục để tạo một loại đơn giản hơn với hiệu quả tơng tự Bạn có thể sử dụng các điều này để dễ dàng hơn trong việc quay các đối tợng trong thế giới
Trang 155.Các sự kiện
Một số các trờng, hầu nh các nút đều chứa các sự kiện Có hai loại sự kiện , eventIn
và eventOut Các eventOut là các sự kiện sắp đi ra, phát sinh các thông tin nh thay đổi
nh thay đổi một giá trị hoặc thời gian của kích chuột Các eventIn là các sự kiện sắp đến,
chấp nhận thông tin từ bên ngoài của nút và thực hiện một vài điều với nó Mỗi sự kiện có một loại dữ liệu thích hợp với chúng, nh mô tả ở trên
Một vài nút có các trờng đợc trng bày Điều này có nghĩa là nút có hai trờng định nghĩa cho trờng đó set_fieldname and fieldname_changed Có eventIn và eventOut đối với
trờng có thể sử dụng để thiết lập các giá trị của nó và thông báo cho thế giới bên ngoài khi
có sự thay đổi Nếu bạn sử dụng set_fieldname để thiết lập giá trị của trờng, nút sẽ phát
sinh một sự kiện fieldname_changed Để dễ dàng sử dụng, các thành phần set_ và _changed của sự kiện có thể nghiêng về phía trái và browser sẽ làm việc khi sự kiện đợc
sử dụng Nếu một trờng không đợc phơi bày ra, nó không thể thay đổi do các sự kiện và giá trị trong trờng đợc sử dụng trong suốt các khoảng thời gian Để xem xét trờng nào đợc bày ra đối với mỗi nút, hãy giữ lấy một tham chiếu từ một vị trí từ trang liên kết hoặc nhận lấy tham chiếu nút trong phụ lục
6.Các router
Để thực hiện hiệu quả mọi thứ với các sự kiện, chúng ta cần nối chúng với nhau Việc kết nối đợc biết đến nh ROUTER Ví dụ để dẫn từ touchTime eventOut tới startTime eventIn, chúng ta sẽ dẫn sự kiện nh sau:
ROUTE SENSOR.touchTime TO SOUND.startTime
Vì vậy, bít này của mã sẽ dẫn tới sự kiện touchTime từ TouchSensor ( sẽ đề cập
đến ở phần sau) tới sự kiện startTime trong nút sound ( cũng đợc đề cập ở phần sau) Do
đó, khi TouchSensor bị kích vào, âm thanh đợc chơi Bạn cần sử dụng DEF cho mỗi nút
mà bạn dẫn tới hoặc từ đó sao cho nó có một tên riêng lẻ Vì vậy, các nút TouchSensor và Sound sẽ đợc định nghĩa:
DEF SENSOR TouchSensor {
}
DEF SOUND Sound {
Trang 16Ngoại trừ các trờng bên trong chúng Nếu bạn có một số các đối tợng với cùng một tên (do sử dụng USE), và dẫn tới hoặc từ chúng, tất cả các đối tợng bị ảnh hởng, vì vậy nếu bạn chỉ muốn một đối tợng bị ảnh hởng, đa cho nó một tên duy nhất hoặc sử dụng PROTO, đợc giải thích sau
7,Camera, âm thanh, ánh sáng
Trong phần này chúng tôi sẽ trình bày cách để giúp các bạn làm cho phong cảnh của bạn trở nên hiện thực hơn Nó bao gồm máy quay phim, ánh sáng, âm thanh, nền và trạng thái của tất cả những yếu tố khác Trớc hết ta hủy bỏ đi điểm khởi đầu ngầm định và xem xét máy quay phim (camera)
Nút điểm nhìn có một số trờng, trờng thứ nhất là vị trí (position), đó là một SFVec3f (nh một bộ ba các số thực mô tả các tọa độ X, Y, Z) Trờng này xác định vị trí của camera trong thế giới Trờng thứ hai là hớng (orientation), đó là một SFRolation, nó cũng gồm 3
số thực để xác định sự quay của camera Hớng ngầm định là nhìn về hớng -Z với độ lệch +X ở bên phải và +Y ở phía trên
Trờng thứ 3 là phạm vi nhìn (FieldofView) Trờng này là một số thực tính theo đơn
vị radian có giá trị từ 0 đến pi Nó dùng để xác định góc nhìn, giá trị nhỏ hơn tơng ứng với góc nhìn nhỏ hơn, nó cho ta kết quả thu nhỏ Giá trị lớn tơng ứng với hình ảnh đợc phóng
to Giá trị ngầm định là 0,78 radian ứng với hình ảnh trung bình
Mỗi điểm nhìn còn có một trờng mô tả (description) Đây là trờng mà brouser dùng
để xác định camera, trờng này là một SFString Cú pháp đầy đủ của một điểm nhìn là nh sau:
Trang 17cổng vào cho phong cảnh Ví dụ nh để đ vào một phong cảnh tại camera có tên CAM1 bạn phải thực hiện kết nối nh sau:
World.wrl#CAM1
Những vấn đề liên quan:
Brouser sẽ bắt đầu kiểm tra hình ảnh trong thế giới của bạn tại camera đầu tiên mà
nó tìm thấy trong file, vì vậy hãy chắc chắn rằng là cổng đầu tiên mà bạn đã ghi nhận Một vấn đề nhỏ nữa là việc lập kế hoạch cho các điểm nhìn là khá phức tạp Nếu bạn biết camera ở đâu và nơi nào bạn muốn xem thì sẽ rất khó để điều chỉnh đúng hớng Tuy nhiên có một công cụ nhỏ từ Vapour Technology sẽ giúp bạn thực hiện toàn bộ điều này, hãy gọi Peek
b,Âm thanh
Để làm cho thế giới của bạn trở nên hấp dẫn hơn, chúng ta sẽ thêm âm thanh vào
đó Ta có thể tạo âm thanh nền, tiếng chuông cửa, còi báo động hoặc những âm thanh khác mà bạn muốn Tất cả những điều đó đợc thực hiện bởi 2 loại nút là nút Sound (Sound nodes) và nút AudioClip (AudioClip nodes) Bạn hãy tởng tợng: một nút Sound giống nh
sự xác định ở nơi nào trong không gian bạn sẽ nghe thấy âm thanh và nó bắt nguồn từ
đâu Còn bản thân âm thanh sẽ đợc xác định bởi nút AudioClip.Trớc tiên chúng ta hãy xem xét nút Sound
Nút Sound:
Một nút Sound đợc sử dụng để xác định vị trí và sự định hớng của một nguồn âm thanh trong thế giới của bạn Nút sound đợc đặt tại một nơi nào đó Cho dù bạn nghe âm thanh hay bất cứ liên quan nào khác với âm thanh thì âm thanh vẫn đợc phát ra dới dạng những mặt elipsoid
Trong vùng màu đỏ, âm thanh sẽ đợc nghe thấy với toàn bộ cờng độ của nó Trong vùng màu vàng, âm thanh loãng đi theo khoảng cách đến nguồn âm Các khoảng cách minFront, maxFront, minBack, maxBack là các trờng đợc xác định bởi nút sound, đó là các hớng Cú pháp của nút Sound nh sau:
Sound {
SFVec3f direction 0 0 1
SFFloat intensity 1
SFVec3f location 0 0 0 SFFloat maxBack 10
SFFloat maxFront 10
SFFloat minBack 1
SFFloat minFront 1
SFFloat priority 0
SFNode source NULL
SFBool spatialize TRUE
}
Trang 18Các trờng khác có tác dụng nh sau: Direction là một vectơ xác định hớng mà âm thanh truyền tới Intensity là cờng độ của âm thanh Giá trị 1 là toàn bộ cờng độ của âm thanh trong file, còn giá trị 0 là hoàn toàn yên lặng Location là vị trí của nguồn âm thanh trong thế giới 4 thông số max/ min/ Front/Back xác định hình dạng của elipsoid nh đã nói
ở trên Ví dụ: Để có một âm thanh có thể nghe rõ nh nhau ở tất cả các hớng bạn hãy lấy maxFront = maxBack, minFront = minBack Nếu bạn không muốn âm thanh bị giảm theo khoảng cách Bạn hãy đặt tất cả các giá trị với cùng một khoảng cách mà khoảng cách đó
đủ lớn để có thể bao trùm toàn bộ thế giới của bạn Nếu bạn muốn cho âm thanh của bạn nhỏ dần đi theo khoảng cách, hãy đặt các giá trị max là 10 nhân với giá trị min
Priority là mức độ u tiên của âm thanh Brouser có một số các kênh âm thanh và Priority của các âm thanh đợc sử dụng để xác định xem âm thanh nào sẽ đợc phát ra, nó
sẽ lấy giá trị 0 hoặc 1 âm thanh nền có mức độ u tiên thấp với giá trị là 0, mức độ u tiên cao nên dùng với những âm thanh ngắn nh tiếng chuông, tiếng còi nó có giá trị 1
Trờng Spatialize đợc brouser dùng để xác định việc truyền âm thanh, điều đó có nghĩa rằng nó sẽ phát âm thanh thông qua các speaker đợc xem là các nguồn âm thanh, vì vậy bạn sẽ nghe thấy âm thanh thay đổi khi bạn thay đổi cách liên hệ với nó Nếu nh tr-ờng này là FALSE thì brouser sẽ không thực hiện điều này Trờng này có ích trong việc tối u hóa cũng nh trong việc tạo ra các âm thanh bao xung quanh
Có một yếu tố còn cha có trong nút sound, đó chính là nút nguồn âm, đây là một nút rất quan trọng Nó có thể là nút AudioClip hoặc nút MovieTexture Nếu bạn sử dụng MovieTexture, brouser sẽ phát âm thanh từ một file hình (movie file) Cách này hữu ích trong việc phát âm thanh từ các file movie Cách còn lại tỏ ra hiệu quả hơn là sử dụng nút AudioClip, cách này sẽ đợc trình bày dới đây
Trang 19pitch 1.0 là tốc độ thông thờng, giá trị pitch là 0.5 thì việc phát lại sẽ ở tốc độ bằng một nửa Giá trị là 2.0 sẽ cho kết quả ngợc lại, tăng gấp đôi tốc độ phát âm thanh.
StartTime và StopTime là các giá trị SFTime, chúng dùng để xác định khi nào phát
và ngừng phát âm thanh Nếu bạn ghi nhớ một số giây kể từ ngày 1- 1- 1970 và liên kết
nó với các cảm biến và các đờng dẫn Một cảm biến sẽ phát ra một tín hiệu báo khi đến thời gian đợc kích hoạt, và nếu nó đợc nối với một nút AudioClip thông qua việc đặt StartTime thì âm thanh sẽ đợc phát ra Chúng ta sẽ xem xét thêm về điều này khi tơng tác trực tiếp với các sensor
Fade away
Một vấn đề nữa cần xem xét ở các nút sound là việc giải nén Các file dạng WAV
là quá lớn và tốn nhiều thời gian để download, vì vậy ta phải hạn chế sử dụng chúng để tăng hiệu quả Các file MIDI tốt hơn và tỏ ra có hiệu quả trong nhạc nền Tuy nhiên cần phải làm cho nó đạt độ trong (giống file WAV) một cách tối đa có thể đợc Nếu bạn có các file này, chỉ cần ngắn và chất lợng đủ chấp nhận đợc, chứ không ai có thể đợi 10 phút
để download những file có chất lợng WAV
Đó là tất cả những vấn đề cơ bản mà bạn cần biết về âm thanh Để tạo ra những
âm thanh nh tiếng chuông cửa, chúng ta cần có khả năng tơng tác với thế giới thông qua các sensor và những dụng cụ tơng tự nh vậy Chúng ta cha xem xét đến vấn đề này và tôi xin dừng phần trình bày về âm thanh của mình ở đây
c,ánh sáng và màu sắc
ở phần trớc, chúng ta đã xét một số đối tợng đặc biệt đó là IndexFaceSets, Extrusions và ElevationGrid, chúng tạo ra những hình rất đẹp, tuy vậy ta có thể làm nhiều hơn thế nữa Những nút hình học này cho phép bạn xác định pháp tuyến, màu sắc, kiểu loại và những tham số khác để có thể tuỳ chọn sự xuất hiện của các đối tợng này Tôi sẽ giải thích một chút về những điều này và trình bày cách ứng dụng chúng
Pháp tuyến (Normal):
Một pháp tuyến là một vector ứng với một bề mặt, nó nằm vuông góc với bề mặt ở
điểm mà tại đó nó cắt bề mặt Các pháp tuyến đợc sử dụng trong các VRML Brouser để làm việc tính toán trở nên sáng sủa hơn
Tuy nhiên bạn vẫn phải cẩn thận vì công việc của bạn ở đây không phải là lập trình đồ họa 3D Nh tôi đã đề cập, Brouser sử dụng các pháp tuyến để làm cho việc tính toán trở nên sáng sủa hơn Dựa vào hớng của pháp tuyến, brouser sẽ đánh bóng bề mặt theo những cách khác nhau Nếu 2 bề mặt có các pháp tuyến tạo với nhau 1 góc nhỏ hơn một giá trị
đã định nào đó, brouser sẽ đánh bóng làm trơn và nối chúng lại với nhau, và tạo nên một vùng tiếp xúc cong Nếu góc lớn hơn giá trị đã định đó, brouser sẽ đánh bóng và kết nối chúng thành một cạnh Khi đó góc này đợc gọi là góc gấp, đó là một trờng xuất hiện ở trong extrusions, Elevationgrid và IndexFaceSets Sử dụng chúng có thể làm tăng khả năng hiển thị vật thể, làmvật thể trơn hơn hoặc có cạnh gấp
Hãy xem phần example và code để biết cách làm một góc xuất hiện trong các đối tợng
Trang 20Bây giờ ta hãy quay lại với các pháp tuyến Brouser sẽ tạo ra các pháp tuyến ngầm
định cho tất cả các loại nút, bao gồm cả các đối tợng đặc biệt Tuy nhiên những nút hình học đặc biệt có một trờng là trờng pháp tuyến, trờng này chứa nút pháp tuyến (normal node) Nó cho phép bạn xác định các pháp tuyến một cách rõ ràng nhờ đó bạn có thể đạt
đợc hiệu quả cao về bố trí ánh sáng Các pháp tuyến này đợc xác định cho mỗi đỉnh hoặc cho mỗi mặt, xác định điều này bằng trờng normalPerVertex Nếu trờng này là TRUE thì các pháp tuyến đợc xác định cho mỗi đỉnh, nếu là FALSE thì các pháp tuyến đợc xác định cho từng mặt Nếu bạn hoàn toàn không xác định các pháp tuyến thì brouser sẽ tạo ra chúng một cách ngầm định, đây là giải pháp tốt nhất cho hầu hết các trờng hợp Bạn cũng chỉ sử dụng đến các pháp tuyến khi cần có những kết quả đặc biệt Việc tự xác định các pháp tuyến sẽ làm bạn tốn rất nhiều không gian, và nhiều thời gian để download Vì vậy nên hạn chế điều này và chỉ thực hiện khi thực sự cần thiết
Trên đây là phần lý thuyết, bây giờ ta sẽ đi vào cụ thể Ngoài các trờng CreaseAngle, NormalPerVertex đã trình bày còn có một số trờng mới và nút mới Chúng
ta sẽ bắt đầu với nút Normal đó là nút bao gồm một tập các pháp tuyến, nó chỉ đợc sử dụng trong trờng normal
Các nút hình học có chứa trờng ccw Nó xác định các đỉnh của bề mặt đợc xét thứ
tự theo chiều kim đồng hồ hay ngợc chiều kim đồng hồ Nó ảnh hởng đến hớng của các pháp tuyến ngầm định mà những pháp tuyến ngầm định này đợc sử dụng trong việc tính toán trực quan Nếu bạn nhìn vào bề mặt với các đỉnh ngợc chiều kim đồng hồ thì pháp tuyến sẽ chỉ về phía bạn Nếu bạn nhìn một bề mặt với các đỉnh theo chiều kim đồng hồ thì pháp tuyến sẽ chỉ ra ngoài và sẽ không nhìn thấy Thiết lập sai trờng này có thể gây ra một số kết quả thú vị ví dụ nh vật thể không có bề mặt trớc (để lộ rõ cấu trúc bên trong) Trờng ccw đợc ngầm định là TRUE
Trờng tiếp theo là NormalIndex Nó bao gồm một danh sách một số mặt hoặc các
điểm, phụ thuộc vào trờng NormalPerVertex Mặt (điểm) thứ nhất đợc xác định bởi trởng CoorIndex (Coor) với số 0, tiếp theo nh vậy đến n-1 Trong đó n là số mặt (điểm) Trờng NormalIndex xác định pháp tuyến nào tơng ứng với mặt (điểm) nào Nh vậy bạn không cần xác định các pháp tuyến theo thứ tự giống với các mặt (điểm) Nếu bạn không dùng trờng này thì các pháp tuyến sẽ có thứ tự giống với các mặt, điểm
Các nút extrution và IndexFaceSet cũng có trơng Convex Nếu nó là TRUE thì brouser sẽ không kiểm tra việc các đối tợng chồng lên nhau Giá trị ngầm định là FALSE,
nó an toàn hơn Bạn chỉ nên thiết lập trờng này khi biết chắc vật thể hoàn toàn lồi
Trang 21Màu sắc:
Tơng tự nh các pháp tuyến, ta có thể điền màu sắc khác nhau vào các mặt hay các
điểm Điều này đợc thực hiện bởi một trờng Color, nó chứa một nút Color Tơng tự nh với trờng normal (Pháp tuyến) nó cũng có trờng ColorIndex và ColorPerVertex và cũng
có tác dụng giống nh trờng normal
Cú pháp của nút color là nh sau:
a,Tỏi sử dụng cỏc đối tượng
Nếu bạn có nhiều đối tợng giống hệt nhau , thờng rất khó khăn để duy trì việc viết chính xác nhiều đối tợng theo cùng một loại Do đó, bạn có thể sử dụng lại các định nghĩa
ở phần trớc Sử dụng hộp này, bạn có thể định nghĩa nó để có tên FBOX Mỗi khi bạn muốn sử dụng lại hộp, bạn có thể chỉ gõ USE FBOX thay cho toàn bộ định nghĩa Ví dụ
Trang 22Chỉ có một thứ đợc bao trùm lên, đó là mẫu Điều này là thực sự liên quan tới các sự kiện và các route nhng chúng tôi phải giải thích các trờng, thật dễ dàng để giải thích Việc lấy mẫu đầu tiên là một cách để sử dụng lại mã của bạn Nếu bạn muốn một số các đối t-ợng của cùng một loại, bạn có thể sử dụng DEF và USE tuy nhiên, nếu bạn muốn sử dụng một số đối tợng giống nhau, nhng với một chút khác nhau, có thể nói các chiều cao khác nhau Trong trờng hợp đó, bạn có thể sử dụng PROTO để thay thế Để định nghĩa mẫu đầu tiên, bạn định nghĩa đối tợng của bạn và định nghĩa các trờng và sự kiện với nó dới đây là một ví dụ về PROTO đối với một hộp với biến màu sắc:
Trang 23Trờng trong các ngoặc vuông tại phần đầu của khai báo là giao diện của một đối ợng và các con số là các giá trị mặc định cho trờng Khi một trờng hợp của VBox đợc khai báo, giá trị đợc sắp xếp vào trờng boxColour thay thế vào trờng diffuseColor của nút Material Do đó, để khai báo red VBox và green VBox, chúng ta có thể sử dụng nút
t-VBox mới tại bất kỳ đâu chúng ta có thể sử dụng nút Shape, nút cấp đỉnh trong phần khai
c ,ExternProto
Nếu bạn muốn định nghĩa PROTO ở một nơi nào khác hơn là trong file chính, bạn
có thể sử dụng EXTERNPROTO Điều này nói cho các browser số lợng các định nghĩa
đối tợng trong một file khác Trong file chính của bạn, bạn bao gồm định nghĩa EXTERNPROTO và phải có PROTO đầy đủ trong file khác Cú pháp EXTERNPROTO
"proto.wrl#VBox"
Chú ý rằng bạn không cần phải bao gồm các giá trị mặc định trong các định nghĩa EXTERNPROTO, chỉ là các kiểu trờng Thay thế vào một file đơn lẻ, nếu bạn muốn bao gồm các lựa chọn phức tạp đối với file để tải, bạn có thể đặt chúng vào ngoặc vuông: