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