Bài giảng Computer Graphics - Chương 9: Ngôn ngữ mô hình hóa thực tại ảo VRML
VRML Lịch sử
VRML là một ngôn ngữ văn bản dùng để mô tả các môi trường tương tác
và các vật thể 3-D
Các file text VRML có đuôi là .wrl
VRML 1.0 dựa trên ngôn ngữ mô tả Silicon Graphics 3D gọi là “Open Inventor”. VRML
1.0 cho phép mô tả các cảnh tỉnh và không tương tác.
VRML 2.0 là một ngôn ngữ mô tả dựa trên Silicon Graphics và đưc goi là “Moving
Worlds”.
VRML1 (1994) & VRML2 (1997) có mở rộng thêm các chủ đề liên quan
g vào, false ở vùng ra Page 9 Lờ Tấn Hựng CNTT- ĐHBK Hà nội Email: hunglt@it-hut.edu.vn (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 Xem code Chạy ví dụ Tối −u hoá việc phát hiện xung đột Sự kiện collision luôn đ−ợc kích hoạt theo ngầm định Tắt nó bất cứ khi nàu có thể! Tuy nhiên, một khi nút collision cha tắt thì nút child không thể bật nó trở lại! Kết quả phát hiện xung đột là từ ng−ời dùng va chạm với một vật thể chứ không phải là vật thể va chạm với ng−ời dùng Sử dụng nhiều nút sensor Một số nút sensor có thể cảm biến cùng một lúc Bạn có thể tạo ra nhiều nútvisibility, proximity, and collision sensor Các vùng cảm biến có thể chông lên nhau Nếu nhiều nút sensor đ−ợc kích hoạt, chúng sẽ thực hiện (c) SE/FIT/HUT 2002 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ụ (c) SE/FIT/HUT 2002 Touchsensor và spheresensor Nút TouchSensor cảm biến sự va chạm của con trỏ • isOver – gửi giá trị true/false khi con trỏ đang ở trong hay ở ngoài vùng vật thể • isActive – gửi giá trị true/false khi chuột đ−ợc nhấn hay thả • touchTime –đ−a ra thời gian khi chuột đ−ợc thả Transform { children [ DEF Touched TouchSensor { } Shape { . . . } . . . ] } Xem code Chạy ví dụ Nút SphereSensor cảm biến sự dich chuyển con trỏ tạo ra sự xoayquanh hình cầu • isActive –gửi các giá trị true/false khi con chuột đ−ợc nhấn hay thả • rotation_changed - đ−a ra sự quay khi rê con chuột Transform { children [ DEF Rotator SphereSensor { } DEF RotateMe Transform { . . . } ] } ROUTE Rotator.rotation_changed TO RotateMe.set_rotation (c) SE/FIT/HUT 2002 Cylindersensor-planesensor Nút CylinderSensor nhận biết con trỏ đ−ợc rê và làm cho vật thể xoay quanh hình trụ • isActive – gửi giá trị true/false khi chuột đ−ợc nhấn hay thả • rotation_changed – làm cho vật thể quay khi kéo Transform { children [ DEF Rotator CylinderSensor { } DEF RotateMe Transform { . . . } ] } ROUTE Rotator.rotation_changed TO RotateMe.set_rotation Xem code Chạy ví dụ Nút PlaneSensor nhận biết con trỏ đ−ợc rê và làm dịch chuyển vật thể trên một mặt phẳng • isActive – gửi các giá trị true/false khi chuột đ−ợc nhấn hay thả • translation_changed – làm cho vật thể dịch chuyển khi rê chuột Transform { children [ DEF Mover PlaneSensor { } DEF MoveMe Transform { . . . } ] } ROUTE Mover.translation_changed TO MoveMe.set_translation Xem code Chạy ví dụ Page 10 Lờ Tấn Hựng CNTT- ĐHBK Hà nội Email: hunglt@it-hut.edu.vn (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 } (c) SE/FIT/HUT 2002 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" } (c) SE/FIT/HUT 2002 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 : • Nút Script bị xoá • Trình duyệt nạp thế giới mới Page 11 Lờ Tấn Hựng CNTT- ĐHBK Hà nội Email: hunglt@it-hut.edu.vn (c) SE/FIT/HUT 2002 Sự kiện -event Đáp ứng một sự kiện • Ph−ơng thức processEvent đ−ợc gọi mỗi khi một sự kiện nhận đ−ợc , chuyển một đối t−ợng sự kiện chứa • Giá trị của sự kiện • Thời gian public void processEvent( Event event ) { . . . } Xem code vrml Xem code java Truy nhập các tr−ờng từ Java Mỗi tr−ờng giao tiếp có thể đ−ợc đọc và viết • Gọi getField để đọc tr−ờng của đối t−ợng obj = (SFFloat) getField( "bounceHeight" ); • Gọi getValue để lấy giá trị của tr−ờng lastval = obj.getValue( ); • Gọi setValue đặt giá trị cho một tr−ờng obj.setValue( newval ); (c) SE/FIT/HUT 2002 Tr−ờng eventout từ java Truy nhập tr−ờng eventOuts từ Java Mỗi giao tiếp eventOut có thể đọc và ghi • gọi getEventOut để đọc tr−ờng eventOut của đối t−ợng obj = (SFVec3f) getEventOut( "value_changed" ); • Gọi getValue đọc giá trị cuối cùng đ−ợc gửi lastval = obj.getValue( ); • Gọi setValue để gửi một sự kiện obj.setValue( newval ); Ví dụ Java script Tạo nút interpolator vớiquả bóng nẩy rồi tính trọng lực nh− chuyển động nẩy ngang từ dữ liệu đầu vào là thời gian phân đoạn Nút cần: DEF Ball Transform { . . . } DEF Clock TimeSensor { . . . } DEF Bouncer Script { . . . }
File đính kèm:
- bai_giang_computer_graphics_chuong_9_ngon_ngu_mo_hinh_hoa_th.pdf