Thực tại ảo (VR Virtual Reality) là công nghệ sử dụng các kỹ thuật mô hình hóa không gian, cùng với sự hỗ trợ của các thiết bị đa phương tiện để xây dựng một thế giới mô phỏng (môi trường ảo) bằng máy tính nhằm đưa người sử dụng vào một thế giới nhân tạo với không gian như thật. Người sử dụng sẽ không như người quan sát bên ngoài, mà trở thành một phần của hệ thống. Thế giới “nhân tạo” này không tĩnh tại, mà lại phản ứng, thay đổi theo ý muốn của người sử dụng nhờ hành động, lời nói,... Người sử dụng có thể nhìn thấy sự vật thay đổi trên màn hình theo ý muốn của họ và cảm nhận bằng các giác quan bởi sự mô phỏng này. Trong thực tế, người dùng không những nhìn thấy đối tượng đồ họa 3D nổi, điều khiển được đối tượng như quay, di chuyển,… trên màn hình, mà còn sờ và cảm thấy chúng như có thật. Ngoài khả năng nhìn (thị giác), nghe (thính giác), sờ (xúc giác), thực tại ảo còn có khả năng tạo các cảm giác khác như ngửi (khứu giác), nếm (vị giác), tuy nhiên hiện nay các cảm giác này ít được sử dụng đến. Hiện nay có khá nhiều khái niệm về thực tại ảo, một trong các định nghĩa được chấp nhận rộng rãi là của C. Burdea và P. Coiffet: “Thực tại ảo là một hệ thống giao diện cấp cao giữa người sử dụng và máy tính. Hệ thống này mô phỏng các sự vật và hiện tượng theo thời gian thực và tương tác với người sử dụng qua tổng hợp các kênh cảm giác. Đó là ngũ giác gồm: thị giác, thính giác, xúc giác, khứu giác, vị giác”.
Trang 1Chương 2: Tạo mô hình trong VRML 2.1 Các nút hình học cơ bản
Các đối tượng hình học trong thế giới ảo thường được cấu tạo từ các đối tượng hình học
cơ bản như hình hộp, hình tròn, hình trụ, hình cầu … Và VRML cung cấp sẵn cho chúng ta
một số các đối tượng hình học đơn giản đó dưới dạng các nút như Box (hình hộp), Cone (hình nón), Cylinder (hình trụ tròn), Sphere (hình cầu)…
Nút Sharp là nút cơ sở dùng để chứa các đối tượng hình học thông qua “Geometry
nodes” và các thuộc tính cần thể hiện của đối tượng hình học đó qua “Appearance nodes” Điều đó có nghĩa nếu ta muốn tạo ra bất kỳ một đối tượng nào thì nút hình dáng của đối tượng
đó phải được tạo ra trước
2.1.1 Shape
Shape {
exposedField SFNode appearance NULL
exposedField SFNode geometry NULL
}
Nút này có hai trường appearance và geometry được dùng để tạo đối tượng kết xuất trong thế
giới
Trường appearance chứa nút Appearance xác định các thuộc tính trực quan (ví dụ, material
và texture) để áp dụng cho đối tượng hình học chứa trong nút geometry Nút hình học chỉ
Trang 2material Material { diffuseColor 0 1 0 }
Material: Chứa nút Material Nếu trường material là NULL hoặc không được chỉ
định sẽ tắt chiếu sáng (bỏ qua tất cả các đèn khi dựng đối tượng) và màu của đối tượng không có ánh sáng là (1,1,1)
Texture: Chứa một trong các kiểu ImageTexture, MovieTexture, hoặc PixelTexture
của nút Texture Nếu là NULL hoặc trường texture không được chỉ định thì không tham chiếu
texture Transform: Nếu được chỉ định sẽ chứa nút TextureTransform Nếu trường
texture NULL hoặc không được chỉ định trường thì trường textureTransform không có hiệu lực
Trang 3field MFString info []
field SFString title ""
Trang 4size X Y Z: Kích thước hình hộp (chiều rộng, chiều cao, chiều sâu) Mặc định giới hạn
của hộp 2 đơn vị theo mỗi chiều, từ -1 đến 1
Texture áp dụng riêng cho mỗi mặt của hộp
Trang 5side: Cho phép hay không tồn tại bề mặt
top: Cho phép hay không tồn tại nắp trên
bottom: Cho phép hay không tồn tại nắp dưới
Trang 6Khi áp dụng texture ở mặt bên, texture phủ ngược chiều kim đồng hồ (từ trên xuống) bắt đầu
từ mặt sau trụ Đường may thẳng đứng phía sau
Đối với nắp trên và dưới, một vòng tròn được cắt ra từ texture vuông rồi dán vào
Nút Cylinder chỉ xác định ngoài bề mặt Khi nhìn từ bên trong thì kết quả là không xác định
Ví dụ:
Shape {
geometry Cylinder{
height 2.0 radius 1.0 bottom TRUE top TRUE side TRUE }
Trang 7Xác định hình nón tại tâm của hệ trục tọa độ địa phương, trục trung tâm là y
Thuộc tính
height: Chiều cao của hình nón tính từ tâm Mặc định là 2.0
bottomRadius: Bán kính của đáy Mặc định là 1.0
bottom TRUE / FALSE: Hiện / ẩn đáy
side TRUE / FALSE: Tồn tại / không tồn tại mặt bên Nếu là FALSE thì không đủ
điều kiện để phát hiện va chạm hoặc cảm biến
Khi áp dụng texture lên bề mặt, texture phủ ngược chiều kim đồng hồ từ trên xuống dưới, bắt đầu từ mặt sau Texture có đường may thẳng đứng phía sau
Đối với nắp đáy, một vòng tròn được cắt ra từ texture vuông và dán vào
Cone chỉ phụ thuộc vào bề mặt Khi nhìn từ bên trong thì kết quả không xác định
Ví dụ
Shape {
geometry Cone { height 2.0
bottomRadius 1.0 bottom TRUE side TRUE }
}
2.2 Các nút dựng mô hình phức tạp
Trang 8string [“Nội dung văn bản”]: Chứa xâu văn bản Xâu đặt giữa cặp dấu “”
length [N1 N2]: Độ dài của các xâu trong “string”
maxExtent N: Giới hạn kéo dãn
FontStyle:
family: Tên font
style BOLD / ITALIC / BOLDITALIC / PLAIN: Kiểu chữ
size M: Chiều cao của chữ
spacing N: Khoảng cách giữa các dòng
justify BEGIN / MIDDLE / END: Canh lề trái / giữa / phải cho các
dòng
horizontal TRUE / FALSE: Trình bày ngang / dọc màn hình
leftToRight TRUE / FALSE: Trình bày từ trái sang phải (TRUE) hoặc
từ phải sang trái (FALSE)
topToBottom TRUE / FALSE: Trình bày từ trên xuống dưới (TRUE)
hoặc từ dưới lên trên (FALSE)
Nút Text không tham gia phát hiện va chạm
Ví dụ
Shape {
geometry Text{
string [“Hello” “VRML”]
Trang 9fontStyle FontStyle{
size 1 family “ARIAL”
style “BOLD”
spacing 1 justify “MIDDLE”
horizontal TRUE leftToRight TRUE topToBottom TRUE }
length [1 1]
maxExtent 5.0 }
}
2.2.2 IndexLineSet
Cú pháp
IndexedLineSet {
eventIn MFInt32 set_colorIndex
eventIn MFInt32 set_coordIndex
exposedField SFNode color NULL
exposedField SFNode coord NULL
field MFInt32 colorIndex [] # [-1, ∞)
field SFBool colorPerVertex TRUE
field MFInt32 coordIndex [] # [-1, ∞)
Chỉ ra các đỉnh 3D của tập đường thẳng chứa trong nút Coordinate
Coordinate là nút xác định một tập hợp các điểm ảnh trong không gian (điểm đỉnh của đường thẳng)
Color
Xác định màu sắc tại các điểm ảnh trong nút Coordinate
Trang 10 Số thành phần trong nút này có thể không nhất thiết phải bằng với số thành phần trong nút Coordinate
Nếu trường color khác NULL, nó chứa nút Color và màu được áp dụng cho đường thẳng như sau:
Nếu colorPerVertex là FALSE
Nếu trường colorIndex không rỗng màu được dùng cho mỗi đường của IndexedLineSet Số chỉ mục của trường colorIndex như số đường trong IndexedLineSet Nếu chỉ
số lớn nhất của trường colorIndex là N thì trong nút Color số màu phải là N+1 Trường colorIndex không chứa phần tử âm
Nếu trường colorIndex là rỗng, màu sắc từ nút Color sẽ được áp dụng cho mỗi đường của IndexedLineSet theo thứ tự Số màu trong nút Color phải phù hợp với số đường
Nếu colorPerVertex là TRUE
Nếu trường colorIndex không rỗng màu được áp dụng cho mỗi điểm đỉnh của IndexedLineSet, trường coordIndex được dùng cung cấp tọa độ cho mỗi đỉnh từ nút Coordinate Trường colorIndex phải chứa số chỉ mục tương ứng trường coordIndex và phải chứa dấu hiệu của đường cuối cùng (-1) tương ứng với trường coordIndex (Ví dụ: colorIndex [0 1 -1 0 1], coordIndex [0 1 -1 2 0]) Nếu chỉ số lớn nhất của trường colorIndex là N thì số màu của nút Color phải là N+1
Nếu trường colorIndex là rỗng, trường coordIndex được dùng để chọn màu từ nút Color Nếu chỉ số lớn nhất trong trường coordIndex là N thì số màu trong nút Color phải là N+1
Nếu trường color là NULLvà Material được định nghĩa cho Appearance sẽ ảnh hưởng tới IndexedLineSet, emissiveColor của Material sẽ được sử dụng để vẽ đường
Ví dụ: Vẽ tam giác màu đỏ
#VRML V2.0 utf8 Shape{
appearance Appearance { material Material {
Trang 11emissiveColor 1.0 0.0 0.0
} } geometry IndexedLineSet{
coord Coordinate{
point [3.0 0.0 0.0, 0.0 4.0 0.0, 0.0 0.0 5.0] }
coordIndex [0 1 2 0]
colorPerVertex FALSE }
Một ví dụ 2: coordIndex [0 1 -1 2 0], kí hiệu “-1” cho biết hình ảnh được tạo gồm hai đường thẳng: một đường thẳng tạo bởi điểm thứ nhất nối với điểm thứ hai và một đường thẳng khác tạo bởi điểm thứ ba nối với điểm thứ nhất
o Trường này lấy màu sắc được quy định từ nút Color
o Ví dụ1 colorIndex [0 1 0 1], coordIndex [0 1 2 0] và colorPerVertex
TRUE xác định tại màu sắc thứ nhất cho điểm thứ nhất và điểm thứ
ba, màu sắc thứ hai cho điểm thứ hai và thứ tư
o Ví dụ 2: colorIndex [0 1 0 1], coordIndex [0 1 -1 2 0] và colorPerVertex
FALSE thì đường thẳng nối hai điểm thứ nhất và thứ hai sẽ có màu thứ nhất, đường thẳng nối hai điểm thứ tư và thứ năm sẽ có màu sắc thứ hai
ColorPerVertex
o Nếu giá trị là TRUE thì màu của đường thẳng sẽ là màu trung bình của hai màu tại hai điểm tạo nên đường thẳng
Trang 12o Nếu giá trị là FALSE thì các đường thẳng đều có màu đơn lẻ hoặc màu mặc định (trắng)
Đường thẳng không dùng chiếu sáng, không dùng texture, không tham gia vào phát hiện va chạm Chiều rộng của đường thẳng phụ thuộc khi thực thi(độ phân giải màn hình,…)
eventIn MFInt32 set_colorIndex
eventIn MFInt32 set_coordIndex
eventIn MFInt32 set_normalIndex
eventIn MFInt32 set_texCoordIndex
exposedField SFNode color NULL
exposedField SFNode coord NULL
exposedField SFNode normal NULL
exposedField SFNode texCoord NULL
field SFBool ccw TRUE
field MFInt32 colorIndex [] # [-1, ∞)
field SFBool colorPerVertex TRUE
Trang 13field SFBool convex TRUE
field MFInt32 coordIndex [] # [-1, ∞)
field SFFloat creaseAngle 0 # [0, ∞)
field MFInt32 normalIndex [] # [-1, ∞)
field SFBool normalPerVertex TRUE field SFBool solid TRUE
field MFInt32 texCoordIndex [] # [-1, ∞)
Các đỉnh xác định đa giác không tự giao nhau
Nếu không thì kết quả không xác định
Thuộc tính
coord
Chỉ ra các đỉnh 3D của tập đường thẳng chứa trong nút Coordinate
Coordinate là nút xác định một tập hợp các điểm ảnh trong không gian
Color
Nút này xác định màu sắc tại các điểm ảnh trong nút Coordinate
Số thành phần trong nút này có thể không nhất thiết phải bằng với số thành phần trong nút Coordinate
Nếu trường color không là NULL nó chứa một nút Color áp dụng cho
đỉnh hoặc bề mặt IndexedFaceSet như sau:
Nếu colorPerVertex là FALSE màu được áp dụng cho mỗi mặt
Nếu trường colorIndex không rỗng, màu sắc sử dụng cho từng bề mặt của IndexedFaceSet Trong trường colorIndex phải có chỉ số
tương ứng số bề mặt trong IndexedFaceSet Nếu chỉ số lớn nhất
trong trường colorIndex là N thì phải là N+1 màu trong nút Color Trường colorIndex không được chứa thành phần có giá trị âm
Nếu trường colorIndex là rỗng thì màu áp dụng cho từng bề mặt
của IndexedFaceSet theo thứ tự Số màu trong nút Color tương ứng với các bề mặt
Nếu colorPerVertex là TRUE, màu được áp dụng với mỗi đỉnh như sau:
Trang 14 Nếu trường colorIndex không rỗng, màu sắc áp dụng cho từng
đỉnh của IndexedFaceSet chính xác tương ứng với trường
coordIndex Trường colorIndex phải chứa các chỉ số tương ứng với trường coordIndex và phải chứa dấu hiệu của bề mặt cuối (-1)
tương ứng với trường coordIndex Nếu chỉ số lớn nhất trong
trường coordIndex là N thì màu trong nút Color phải là N+1
Nếu trường colorIndex rỗng, trường coordIndex được sử dụng để
lựa chọn màu sắc từ nút Color Nếu chỉ số lớn nhất trong trường
coordIndex là N thì phải có N+1 màu trong nút Color
Nếu trường color là NULL hình sẽ được dựng bình thường bằng cách dùng Material và texture định nghĩa trong nút Appearance
coordIndex: Trường này bao gồm một dãy chỉ số thứ tự cho các điểm ảnh tạo nên
đường thẳng
Ví dụ1: coordIndex [0 1 2 0] có nghĩa là đường thẳng được tạo bởi điểm thứ nhất nối với điểm thứ hai, điểm thứ hai nối với điểm thứ ba, điểm thứ ba nối với điểm thứ nhất, các điểm ảnh được xác định trong nút Coordinate
Ví dụ 2: coordIndex [0 1 -1 2 0], kí hiệu “-1” cho biết hình ảnh được tạo gồm hai đường thẳng: một đường thẳng tạo bởi điểm thứ nhất nối với điểm thứ hai và một đường thẳng khác tạo bởi điểm thứ ba nối với điểm thứ nhất
Cho phép các mặt phẳng tạo ra có thể nhìn từ hai phía mặt phẳng hoặc không
Ví dụ solid FALSE tức là cho phép nhìn mặt phẳng ở hai phía, solid TRUE thì chỉ
cho phép nhìn mặt phẳng ở một phía
normal
Nếu trường normal không là NULL nó chứa nút Normal mà normal được áp dụng cho các đỉnh hoặc bề mặt của IndexedFaceSet một cách chính xác tương đương với mô tả ở trên để áp dụng màu cho đỉnh/bề mặt ( normalPerVertex tương ứng với colorPerVertex và normalIndex tương ứng với colorIndex )
Nếu trường nomal là NULL, trình duyệt sẽ tự động tạo ra normal, sử dụng creaseAngle để xác định cách normal được làm phẳng quanh đỉnh
Trang 15texCoordIndex: Nếu trường texCoordIndex không là NULL, nó chứa nút
TextureCoordinate Texture trong nút đó được áp dụng cho đỉnh của IndexedFaceSet như sau:
Nếu trường texCoordIndex không rỗng, nó được sử dụng để chọn texture coordinate cho mỗi đỉnh của IndexedFaceSet tương ứng trường coordIndex được
dùng để chọn coordinate cho mỗi đỉnh từ nút Coordinate texCoordIndex phải
chứa chỉ sốtương ứng trường coordIndex và phải chứa dấu hiệu kết thuc bề mặt (-1) tương ứng vói trường coordIndex.Nếu chỉ số lớn nhất trong trường texCoordIndex là N thì phải có N+1 texture trong nút TextureCoordinate
Nếu trường texCoordinate là rỗng, mảng coordIndex được dùng để chọn texture
từ nút TextureCoordinate Nếu chỉ số lớn nhất trong trường coordIndex là N thì phải có N+1 texture coordinate trong nút TextureCoordinate
Nếu trường texCoord là NULL, texture mặc định được tính bằng cách sử dụng
hộp bao của shape trong hệ tọa độ địa phương Chiều lớn nhất của hộp bao xác định coordinate S, chiều dài nhất tiếp đó xác định coordinate T Nếu cả hai hoặc tất các các chiều của hộp bao bằng nhau, mỗi ràng buộc sẽ bị phá vỡ bằng cách chọn chiều X, Y, hoặc Z theo thứ tự ưu tiên Giá trị của coordiante S từ 0 đến 1,
từ cuối hộp bao đến hộp khác Coordinate T dao động giữa 0 và tỉ lệ của chiều
lớn nhất thứ hai của hộp với chiều lớn nhất của hộp bao
Trang 16Ví dụ2
#VRML V2.0 utf8
Viewpoint { description "Initial view" position 0 0 9 }
NavigationInfo { type "EXAMINE" }
# Three IndexedFaceSets, showing:
# - Color applied per-face, indexed
# - Color applied per-vertex
# - Texture coordinates applied per-vertex
# A dodecahedron: 20 vertices, 12 faces
# 6 colors (primaries:RGB and complements:CMY) mapped to the faces Transform {
translation -1.5 0 0
children Shape {
appearance DEF A Appearance { material Material { } }
geometry DEF IFS IndexedFaceSet {
Trang 17colorPerVertex FALSE # Applied to faces, not vertices
# This indexing gives a nice symmetric appearance:
colorIndex [ 0, 1, 1, 0, 2, 3, 3, 2, 4, 5, 5, 4 ]
# Five texture coordinates, for the five vertices on each face # These will be re-used by indexing into them appropriately texCoord TextureCoordinate {
point [ # These are the coordinates of a regular pentagon: 0.654508 0.0244717, 0.0954915 0.206107
Trang 18]
color Color { # Four colors:
color [ 0 1 0, 1 1 1, 0 0 1, 1 0 0 ]
}
# Leave colorPerVertex field set to TRUE
# And no indices are needed, either each coordinate point # is assigned a color (or, to think of it another way, the same # indices are used for both coordinates and colors)
}
}
}
# The same dodecahedron, this time with a texture applied
# The texture overrides the face colors given
eventIn MFFloat set_height
exposedField SFNode color NULL
exposedField SFNode normal NULL
exposedField SFNode texCoord NULL
field MFFloat height [] # (- ∞, ∞)
field SFBool ccw TRUE
Trang 19field SFBool colorPerVertex TRUE
field SFFloat creaseAngle 0 # [0, ∞]
field SFBool normalPerVertex TRUE
field SFBool solid TRUE
field SFInt32 xDimension 0 # [0, ∞)
field SFFloat xSpacing 1.0 # (0, ∞)
field SFInt32 zDimension 0 # [0, ∞)
field SFFloat zSpacing 1.0 # (0, ∞)
}
Nút ElevationGrip cho phép xây dựng lưới hình chữ nhật có chiều cao khác nhau trong mặt phẳng Y=0 của hệ tọa độ địa phương Hình dạng của lưới xác định bởi mảng giá trị chiều cao (xác định chiều cao tại mỗi điểm trong lưới)
Vị trí các đỉnh được xác định bởi các trường height, xSpacing và zSpacing
Nút này hữu ích cho việc xây dựng các mạng lưới hoặc địa hình Nên chia cảnh thành các vùng để tối ưu khi vẽ
Điểm bắt đầu là gốc tọa độ, các điểm còn lại tạo nên lưới nằm theo hướng dương của các trục
Nếu ColorPerVertex là FALSE và trường color không là NULL, trường color chỉ
rõ nút Color chứa ít nhất (xDimension-1)×(zDimension-1) màu
Nếu ColorPerVertex là TRUE và trường color không là NULL, trường color chỉ
ra nút Color chứa ít nhất (xDimension)×(zDimension) màu