Đồ hoạ máy tính và hiện thực ảo

 

 

 

Lời nói đầu . .1

MỤC LỤC .2

I. Gớới thiệu về VRML .4

1.Về ngụn ngữ VML.4

 a,Về trỡnh duyệt . .4

 b,Soạn thảo VRML . .4

 c,Kỹ thuật nén, MIME và xuất bản .4

 d,Headers và chú thích . .5

 e,Các nút trong VRML . .5

 e1.Các nút appearrance .7

 e2.Các nút Material . 7

 e3.Kết cấu hình ảnh( image texture) . .8

 e4.Movie Texture . .9

 e5.Pixel Texture .9

 e6.Văn bản và kiểu font( text và fontstyle) . .10

 e7.Các đối tượng cơ bản .11

2.Cỏc kiểu dữ liệu trong VRML . 13

3.Hệ toạ độ trongVRML . . .14

4.Các phép biến đổi trong VRML . .15

 a,Translation and Scale ( Phép biến đổi và tính tỉ lệ) 16 b,Rotation ( phép quay) 16

5.Các sự kiện .16

6.Các router . .17

7.Camera, âm thanh, ánh sáng . . 18

 a,Camera . 18

 b,âm thanh . 19

 c,,ánh sáng và màu sắc . 21

8.Một số vấn đề về lập trỡnh VRML . .23

 a,Tái sử dụng các đối tượng . 23

 b,Proto . . .24

 c,ExternProto . 25

 d,Lắp ráp .26

II.Scripting . 26

 1.Java, JavaScript, VRMLScript, hay ECMAscript?.27

 2.Sử dụng ECMAScript trong VRML .27 3.Lập trình tuần tự trong ECMAScript .28

 4.Ví dụ . .29

 5.The Browser object .33

III.Nội dung của bài tập lớn .42

IV.Các đối tượng cơ bản trong bài tập lớn . 42

 1.Cửa ra vào 43

 2.Cửa kộo 43

 3.Quạt trần . . 44

 4.Bảng kộo . 47

 5.Ánh sỏng . .47

 6.Ghế . . . 47 7.Bàn học . . 48

 

 

doc48 trang | Chia sẻ: huong.duong | Ngày: 14/09/2015 | Lượt xem: 919 | Lượt tải: 3download
Bạn đang xem trước 20 trang tài liệu Đồ hoạ máy tính và hiện thực ảo, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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 { } Ngoạ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). a,Camera VRMR browser tạo ra một cổng vào mặc định cho một cảnh, nó được đặt dọc theo trục +Z sao cho toàn bộ thế giới được hiển thị trong cửa sổ. Tuy nhiên bạn không nên bắt đầu từ vị trí này mà bạn nên để người quan sát có thể chọn một trong số các điểm nhìn. Để làm được điều này bạn hãy đặt thêm các camera trong phong cảnh của bạn và sử dụng các nút điểm nhìn (Viewpoint node). 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: Viewpoint { position 0 5 5 orientation 1 0 0 0.39 fieldOfView 0.39 description "Camera 1" } Bạn cũng có thể sử dụng những camera khác để tạo ra những cổng vào khác cho phong cảnh của bạn bằng cách liên kết tên của camera với trang mà nó được dùng làm cổ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 } Cá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 chưa 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. Audioclip: Nút audioclip xác định cái gì sẽ được phát ra tại nút sound và phát ra khi nào. Cú pháp của nó như sau: AudioClip { SFString description "" SFBool loop FALSE SFFloat pitch 1.0 SFTime startTime 0 SFTime stopTime 0 MFString url [] } Các chức năng của AudioClip như sau: Trường url là một danh sách các file không nén có dạng .WAV hoặc General MIDI. MID. Điều này rất hữu ích cho việc kết hợp với âm nhạc. Brouser sẽ trình bày file đầu tiên trong danh sách mà nó có thể load. Loop dùng xác định xem âm thanh có được lặp lại không, và description là sự mô tả về âm thanh mà brouser muốn trình bày. Pitch là hệ số tốc độ phát lại và cường độ của âm thanh. Giá trị pitch 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 chưa 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. Bâ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 Normal { exposedField MFVec3f vector [] } Nút này chỉ có một trường đó là trường vector, nó bao gồm một tập các giá trị MFVec3f đó là những vector pháp tuyến của từng mặt. . Nó được sử dụng đê làm cho những đối tượng cong, phức tạp trở nên đơn giản hơn. Ví dụ: Bạn có thể tạo nên một hình trụ trơn dựa vào các pháp tuyến. 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 Mà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: Color { exposedField MFColor color [] } Intact 8.Một số vấn đề về lập trỡnh VRML 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ụ được chỉ ra dưới đây: DEF FBOX Shape { appearance Appearance { material Material { } } geometry Box { } } USE FBOX Đây không chỉ là một bit của ví dụ đơn giản, khi tạo hai hộp chính xác tại cùng một vị trí. không chỉ là các thứ mà bạn muốn. Thỉnh thoảng, là định nghĩa USE tại một vài nơi bit có ý nghĩa hơn. Đồng thời bạn có thể DEF/USE bất kỳ loại nút nào vì vậy bạn muốn sử dụng lại Appearance của một đối tượng, bạn có thể thực hiện tốt điều đó. Shape { appearance DEF APP1 Appearance { material Material { } } geometry Box { } } Shape { appearance USE APP1 geometry Box { } } Một lần nữa bạn không thấy có điều gì ngạc nhiên ở đây, như hai hộp ở cùng vị trí trong thế giới, nhưng bạn nhận được ý tưởng. Một cách khác để sử dụng lại mã VRML là để sử dụng các nút Inline. Điều này nhận dữ liệu từ các file bên ngoài và chèn nó vào file của bạn. Vì vậy nếu bạn có mô hình chiếc ghế gọi là chair.wrl bạn có thể chèn vào quang cảnh của bạn: Inline { url "chair.wrl" } File bạn đang kết hợp theo cách này phải là VRML hợp lệ, vì vậy nó phải là các header và mọi thứ mà thế giới VRML phải có. Nếu bạn không tải cân bằng vào một browser, bạn không cần gạch chân. b,Proto Chỉ 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 nhưng 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, nhưng 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: PROTO VBox [ field SFColor boxColour 1 0 0 ] { Shape { appearance Appearance { material Material { diffuseColor IS boxColour } } geometry Box { } } } Trườ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 tượ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 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 báo là nút Shape . VBox { } VBox { boxColour 0 1 0 } Đầu tiên sử dụng các định nghĩa red VBox mặc định, thứ hai đưa ra một green VBox. Bạn có thể định nghĩa eventIns, eventOuts và exposedFields cho các mẫu chuẩn theo cùng một cách, sử dụng IS để ánh xạ trường PROTO thành một trường trong sự thực hiện. Trường PROTO phải được ánh xạ theo cùng một kiểu trường/ sự kiện và cũng là cùng loại dữ liệu. Chỉ một ngoại lệ là bạn có thể ánh xạ một trường thông thường trong định nghĩa PROTO thành exposedField trong sự thực hiện khi trường thông thường là tập hợp phụ các exposedField, vì vậy ánh xạ hai trường sẽ không có hại gì cả. Bạn không thể áp dụng theo cách khác. 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 được chỉ ra dưới đây: EXTERNPROTO VBox [ field SFColor boxColour ] "proto.wrl File "proto.wrl" trong trường hợp này phải chứa header VRML và các định nghĩa mẫu chuẩn đầu tiên, không phải là một thứ gì khác. Nếu bạn có nhiều hơn một PROTO trong file của bạn, bạn phải khai báo giống như một thứ bạn đang sử dụng: "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: EXTERNPROTO VBox [ field SFColor boxColour ] [ "proto.wrl" "" ] d,Lắp ráp VRML không còn là ngôn ngữ tĩnh nữa. Nó là những thứ sống động, có thể nhận đầu vào và đưa ra các đầu ra khác nhau. Điều này yêu cầu một vài loại mô hình thực hiện bên trong, để thông báo những thứ đã thay đổi và trật tự thực hiện nó. Điều này được thực hiện do lắp ráp các thứ với nhau trong thế giới, cung cấp các đường dẫn kèm theo các thông điệp đi cùng với chúng. Những sự lắp ráp này là không nhìn thấy được, chúng không có sự hiển thị nào trong thế giới nhưng chúng gắn các mô hình cơ sở với nhau, cho phép các hiệu quả to lớn. Phần lớn các nút có eventIn và eventOut và rất nhiều exposedField, đó là cách các nút nói chuyện với nhau. eventIn giống như các bộ nhận nghe các thông điệp gọi các events từ bên ngoài và đưa chúng đến được xử lý. eventOut là các bộ truyền phát, gửi các sự kiện từ nút ra bên ngoài. exposedField là sự kết hợp cả hai. Chúng được coi như các file thông thường fieldname, eventIn gọi là set_fieldname và eventOut gọi là fieldname_changed. Nói chung, các phần set_ và _changed của tên là không cần thiết, bạn có thể sử dụng fieldname của exposedField và mô hình thực hiện sẽ làm những thứ bạn mong muốn. II. Scripting Ở phần 3 trước chúng ta đã tìm hiểu hầu hết các tiêu chuẩn của VRML97. Bây giờ tiếp đến chúng ta tìm hiểu một chủ chủ đề mới. Chúng ta đi theo hướng mô tả VRML97 như ngôn ngữ lập trình tuần tự. Chúng ta sẽ học cách làm thế nào để sử dụng được công cụ mạnh nhất của VRML97 : scrripting 1,Java, JavaScript, VRMLScript, hay ECMAscript? Điều đầu tiên chúng ta cần giải quyết đó là làm rõ sự mập mờ của các khái niệm trên, để chúng ta hiểu một cách chính xác những gì chúng ta đang đề cập tới. Hầu hết chúng ta đã một lần nghe về java và javascrip. Java lập trình một ngôn ngữ lập trình hoàn hảo của Sun, nó hoàn toàn độc lập với máy. Bạn dịch chương trình của mình sang dạng mã byte(bytecode) và chương trình đích được tạo ra có thể chạy trên bất kỳ loại máy nào như thể có một máy java ảo đã được cài đặt vào. Java lập trình một ngôn ngữ lập trình có nhiều ưu điểm phù hợp cho việc phát triển các ứng dụng lớn. JavaScript là một ngôn ngữ được Netscape phát triển có cú pháp tương tự như java. Tuy nhiên, nó không được hoàn hảo bằng java và không phải là ngôn ngữ biên dịch. Nó được tạo ra với mục đích sử dụng cho các script bên trong các trang web và thường khá đơn giản. Nó gồm phần ngôn ngữ căn bản và một số các đối tượng cung cấp thêm một số chức năng khác chẳng hạn như truyền thông tin với các văn bản hiện tại. Bây giờ ta xét đến các phiên bản VRML. Khi VRML2.0 được chuẩn bị thực hiện, họ cần một ngôn ngữ đơn giản sử dụng cho các script của VRML. Java đã được để ý tới, nhưng họ cần một ngôn ngữ đơn giản cho các script không quan trọng. Vì thế họ không cần hết tất cả các thành phần của javascript họ tạo ra một phiên bản giản lược của nó. Trình duyệt VRML cung cấp thêm một số đối tượng cũng làm việc như các trình duyệt thông thường. Đó là VRMLScript. Tuy nhiên trước khi VRML97 được coi như một tiêu chuẩn thì bản thân phần lõi của javascript đã được chuẩn hoá của được gọi là ECMAScript. Nhìn một cách căn bản nó cũng giống như VRMLScript nhưng đã được chuẩn hoá, VRMLScript đã không được sử dụng nữa và VRML97 chỉ hỗ trợ java và ECMAScript trong các Script. Không may , nó không chỉ đơn giản như vậy. Không phải tất cả các trình duyệt đều tích hợp thêm ECMAScript . Nhiều cung cấp mở rộng trong phần lõi của ngôn ngữ đã được đưa vào trong javascript 1.2, trong khi đó chỉ một số hỗ trợ VRMLScript. . nó có thể gây rắc rối trong phần chương trình nguồn khi làm việc trên các trình duyệt khác nhau trừ khi tích hợp ECMAScript. Vì thế, trong lần tìm hiểu đầu tiên về script, tôi sẽ nói về cách làm việc thế nào với ECMAScript. Chúng ta sẽ tìm hiểu java ở phần sau. Điểu đó không phải vấn đề lớn và ECMAScript hẳn sẽ phù hợp hơn cho những người mới bắt đầu. 2,Sử dụng ECMAScript trong VRML Do những phức tạp của sự phát triển , trong khi các trình duyệt hỗ trợ ECMAScript trong các script node, thì bạn vẫn sử dụng giao thức URL “ javascript...”. Bạn cũng có thể sử dụng VRML Script bằng cách dùng “vrlmscript..” . Tuy nhiên bây giờ bạn có thể bỏ qua không sử dụng VRMLScript vì tất cả các script đều có thể thực hiện bằng ECMAScript. Bạn có thể viết các mã lệnh ECMAScript trong các file khác nhau và tham chiếu đến các file đó bằng trường URL trong Script node. Các file nguồn ECMAScript source thường có đuôi là .js. Vì thế, bạn có thể có file là filename.js. Mặt khác, như tôi đã nói có thể tham chiếu các dòng lệnh ở file khác, tuy nhiên việc này chỉ có hiệu quả khi ta có nhiều Script cũng sử dụng những dòng lệnh này. 3,Lập trình tuần tự trong ECMAScript ECMAScript là một ngôn ngữ lập trình tuần tự. Nó không giống với VRML, một ngôn ngữ có nhiều khai báo hơn. VRML khai báo các vật thể với các thuộc tính khác nhau,và khi các vật thể này được lắp ráp với nhau sẽ tạo nên thế giới mô phỏng Chương trình ECMAScript là một dãy tuần tự các câu lệnh mà chúng được thực thi chỉ một lần để tạo ra kết quả mong muốn. .Các kháI niệm của ECMAScript như biến, biểu thức, vòng lặp, hàmrất giông với các ngôn ngữ kịch bản khác, vậy tôi không đề cập chi tiết ở đây .Chỉ cần chú ý ở phần sau:Các đối tượng trong ECMAScript . VRML Objects Nếu bạn muốn tạo ra scripts bằng VRML bạn sẽ cần sử dụng đối tượng ECMAScript. Đó là các đối tượng được gắn liền bên trong trình duyệt của bạn, trình duyệt có sẵn một số thuộc tính, hàm khởi tạo và phương thức mà có thể bạn sẽ thấy rất có ích. Ví dụ, đối tượng SFVec3f có một số phép xử lý hình học mà bạn có thể sử dụng chẳng hạn như chiều dài, điểm, giao điểm vv.. Hầu hết các kiểu dữ liệu cơ bản VRML có tương ứng trong ECMAScript, vì thế giá trị SFVec3f trong VRML là tương ứng với đối tượng SFVec3f trong ECMAScript. Tuy nhiên, những kiểu được ánh xạ trực tiếp từ các kiểu của ECMAScript : SFFloat, SFInt32 và SFTime tất cả đều ánh xạ đến dữ liệu kiểu số. SFBool ánh xạ trực tiếp tới kiểu boolean. Bạn có thể sử dụng giá trị true và false trong ECMAScript cũng giống như giá trị TRUE và FALSE trong VRML. Tất cả các kiểu dữ liệu khác trong VRML đều

Các file đính kèm theo tài liệu này:

  • docP0186.doc
Tài liệu liên quan