Giáo trình Lập trình JAva 2D and 3D

hần 1 . 9

Lập trình đồ họa với Java 2D . 9

Chương 1 . 10

Tổng quan về Java 2D API . 10

1.1 Enhanced Graphics, Text, and imaging . 10

1.2 Rendering Model . 11

1.2.1 Coordinate Systems . 12

1.2.1.1 User Space . 12

1.2.1.2 Device Space . 13

1.2.2 Transforms . 14

1.2.3 Fonts . 15

1.2.4 Images . 16

1.2.5 Fills and Strokes . 17

1.2.6 Composites . 18

Backward Compatibility and Platform independence . 19

1.3.1 Backward Compatibility . 19

1.3.2 Platform independence . 21

1.4 The Java 2D™ API Packages . 21

Chương 2: . 25

Rendering with Graphics2D . 25

2.1 Các lớp và giao diện. . 26

2.2 Rendering Concepts . 27

2.2.1 Rendering Process . 28

2.2.2 Controlling Rendering Quality . 29

2.2.3 Stroke Attributes . 31

2.2.4 Fill Attributes . 32

Quá trình xử lý theo phiên . 34

2.2.5 Clipping Paths . 34

2.2.6 Transformations . 35

2.2.6.1 Constructing an AffineTransform . 37

2.2.7 Composite Attributes . 38

2.2.7.1 Managing Transparency . 39

2.2.7.2 Transparency and images . 40

2.3 Thiết lập Graphics2Context . 40

2.3.1 Setting Rendering Hints . 40

2.3.2 Specifying Stroke Attributes . 41

2.3.2.1 Setting the Stroke Width . 41

2.3.2.2 Specifying Join and Endcap Styles . 42

2.3.2.3 Setting the Dashing Pattern . 42

2.3.3 Specifying Fill Attributes . 44

2.3.3.1 Filling a Shape with a Gradient . 44

2.3.3.2 Filling a Shape with a Texture . 45

2.3.4 Setting the Clipping Path . 46

2.3.5 Setting the Graphics2D Transform . 48

2.3.6 Specifying a Composition Style . 51

2.3.6.1 Using the Source Over Compositing Rule . 51

2.3.6.2 Increasing the Transparency of Composited Objects . 51

2.4 Rendering Graphics Primitives . 53

2.4.1 Drawing a Shape . 53

2.4.2 Filling a Shape . 55

Lập trình đồ họa trên Java 2D và 3D

2.4.3 Rendering Text . 56

2.4.4 Rendering images . 56

2.5 Defining Custom Composition Rules . 56

2.6 Rendering in a Multi-Screen Environment . 57

Chương 3 . 75

Các đối tượng hình họa . 75

3.1 Giao diện và lớp. . 75

3.2 Các khái niệm hình học: . 78

3.2.1 Constructive Area Geometry . 79

3.2.2 Bounds and Hit Testing . 80

3.3 Combining Areas to Create New Shapes . 88

Chương 4: . 94

Hiển thị Font và văn bản . 94

4.1.Giao diện và lớp. . 94

4.2.Các khái niệm về Font . 96

4.3 Các khái niệm về Text Layout. . 98

4.3.1 Vẽ chữ. . 99

4.3.2 Ordering Text . 101

4.3.3 Đo và định vị văn bản . 103

4.3.4 Hỗ trợ thao tác với văn bản. . 104

4.3.4.1 Hiển thị dấu nhắc . 104

4.3.4.2 Di chuyển dấu nhắc. . 106

4.3.4.3 Hit Testing . 107

4.3.4.4 Đánh dấu vùng lựa chọn. . 108

4.3.5 Thực thi việc hiển thị văn bản trong ứng dụng Java™ . . 109

Quản lý việc hiển thị văn bản. . 110

4.4.1 Trình bày văn bản. . 111

Hiển thị dấu nhắc kép. . 112

4.4.3 Di chuyển dấu nhắc. . 113

4.4.4 Hit Testing . 114

4.4.5 Đánh dấu vùng lựa chọn. . 115

4.4.6 Querying Layout Metrics . 115

4.4.7 Vẽ văn bản trên nhiều dòng. . 116

Chương 5 . 126

Tạo ảnh . 126

5.1 Các giao diện và các lớp . 126

5.1.1 Các giao diện imaging (imaging interfaces) . 127

5.1.2 Các lớp dữ liệu ảnh(image Data Classes) . 127

5.1.3 image Operation Classes . 129

5.1.4 Sample Model Classes . 130

Color Model Classes . 131

5.1.6 Exception Classes . 132

5.2 Immediate Mode imaging Concepts . 133

5.2.1 Terminology . 135

5.3 Using Bufferedimages . 136

5.3.1 Creating a Bufferedimage . 136

5.3.2 Drawing in an Offscreen Buffer . 137

5.3.2.1 Creating an Offscreen Buffer . 138

5.3.2.2 Drawing in an Offscreen Buffer . 140

5.3.3 Manipulating Bufferedimage Data Directly . 141

Lập trình đồ họa trên Java 2D và 3D

5.3.4 Filtering a Bufferedimage . 142

5.3.5 Rendering a Bufferedimage . 142

5.4 Managing and Manipulating Rasters . 150

5.4.1 Creating a Raster . 150

5.4.2 Parent and Child Rasters . 151

5.4.4 The WritableRaster Subclass . 151

5.5 Image Data and DataBuffers . 152

5.6 Extracting Pixel Data from a SampleModel . 153

5.7 ColorModels and Color Data . 154

5.7.1 Lookup Table . 155

5.8 image Processing and Enhancement . 155

5.8.1 Using an image Processing Operation . 158

Chương 6 . 162

Mầu sắc . 162

6.1 Các lớp . 163

6.2 Những định nghĩa về mầu sắc. . 163

6.2.1 Không gian mầu . 164

6.2.1 Biểu diễn màu . 167

Chương 7 . 171

In ấn . 171

7.1 Các giao diện và các lớp . 171

7.2.1 Supporting Printing . 174

7.2.1.1 Điều khiển in (Job Control) . 174

7.2.2 Page Painters . 175

7.2.3 Printable Jobs and Pageable Jobs . 177

7.2.4 Typical Life-Cycle of a PrinterJob . 178

7.3 Printing with Printables . 181

7.3.2 Printing a File . 185

7.4.1 Using a Pageable Job . 191

7.4.2 Using Multiple Page Painters . 193

Phần 2 . 206

Lập trình đồ họa với Java 3D . 206

CHƯƠNG 1 . 207

NHẬP MÔN LẬP TRÌNH TRÊN JAVA 3D . 207

1.1 Tổng quan về Java 3D API ™ . 207

1.2 Các vấn đề cơ bản về Java 3D API™ . 208

1.3 Xây dựng đồ thị khung cảnh . 208

1.3.1 Thừa kế cấp cao từ Java 3D API . 214

1.4 Cách thức để viết một chương trình Java 3D . 216

1.4.1 Công thức đơn giản để viết một chương trình Java 3D . 216

1.5 Một vài thuật ngữ trong Java 3D . 221

1.6 Ví dụ đơn giản: HelloJava3Da . 223

1.6.1 Các lớp của Java 3D Classes được sử dụng trong HelloJava3Da . 229

Tạo nên hình lập phương có kích thước được định ra bởi các giá trị cho trước. . 233

1.7 Quay hình lập phương . 233

1.7.1 Sự kết hợp của các phép biến hình: HelloJava3Db . 235

1.8 Khả năng và hoạt động . 236

1.8.1 Dịch các nội dung . 236

1.8.2 Khả năng . 237

1.9 Thêm vào các hành vi animation . 239

Lập trình đồ họa trên Java 2D và 3D

1.9.1 Định nghĩa các hành vi animation . 240

1.9.2 Các hàm biến đổi về thời gian: Ánh xạ một hành vi với thời gian . 241

1.9.3 Lập danh mục các vùng . 242

1.9.4 Ví dụ về hành vi: HelloJava3Dc . 243

1.9.5 Phép biến hình và kết hợp các hành vi .Ví dụ: HelloJava3Dd . 246

CHƯƠNG 2 . 251

Tạo các hình . 251

2.1 Hệ tọa độ thế giới ảo . 251

2.2 Visual Object Definition Basics . 252

2.2.1 An Instance of Shape3D Defines a Visual Object . 252

2.2.2 Node Components . 254

2.2.3 Defining Visual Object Classes . 255

2.3 Các lớp tiện ích hình học . 256

2.3.1 Box . 257

2.3.2 Cone . 259

2.3.3 Cylinder . 259

2.3.4 Sphere . 260

2.3.5 More About Geometric Primitives . 261

2.3.6 ColorCube . 261

2.3.7 Example: Creating a Simple Yo-Yo From Two Cones . 261

2.4 Các lớp toán học . 267

2.4.1 Point Classes . 271

2.4.2 Color Classes . 272

2.4.3 Vector Classes . 274

2.4.4 TexCoord Classes . 275

2.5 Các lớp hình học . 276

2.5.1 GeometryArray Class . 277

2.5.2 Subclasses of GeometryArray . 284

2.5.3 Subclasses of GeometryStripArray . 286

2.5.4 Subclasses of IndexedGeometryArray . 293

2.5.5 Axis.java is an Example of IndexedGeometryArray . 296

2.6 Appearance and Attributes . 296

2.6.1 Appearance NodeComponent . 298

2.6.2 Sharing NodeComponent Objects . 298

2.6.3 Attribute Classes . 299

2.6.4 Example: Back Face Culling . 310

2.7 Bounds and Scope . 320

2.7.1 Bounds Node Components . 321

2.7.2 BoundingLeafa Node . 325

2.7.3 Scope . 327

2.8 Hình học nâng cao . 329

2.8.1 Multiple Geometries in a Single Shape3D . 329

2.8.2 GeometryArray . 332

2.8.4 AlternateAppearance <new in 1.2> . 340

2.9 Clipping – Cắt xén . 343

2.9.1 View Defines a Frustum . 343

2.9.2 Clip Node . 345

2.9.4 ModelClip Example . 346

CHƯƠNG 3 . 350

TẠO NỘI DUNG . 350

Lập trình đồ họa trên Java 2D và 3D

3.1 Nội dung chính . 350

3.1.1 GeometryInfo . 351

3.2.1 Một ví dụ đơn giản về GeometryInfo . 351

3.2.2 Sử dụng GeometryInfo . 352

3.2.3 Một số lớp thông dụng có liên quan đến GeometryInfo . 353

Loaders . 358

Một ví dụ đơn giản sử dụng leader. . 359

Các loader phổ biến . 360

3.3.3 Giao diện của gói Loader và lớp cơ sở . 361

Viết một loader . 365

Công việc của một loader . 365

Hàm tạo lớp Loader . 366

Viết một File Loader đơn giản . 368

Text2D . 379

3.5.1 Ví dụ Text2D đơn giản . 380

3.5.2 Lớp Text2D . 380

Text3D . 382

Một ví dụ Text3D . 382

Những lớp liên quan để tạo ra đối tượng Text3D . 384

Nền không gian đồ họa . 391

Một ví dụ background . 391

Lớp Background . 392

CHƯƠNG 4 . 396

TƯƠNG TÁC . 396

4.1 Hành vi: Cơ sở của tương tác và hoạt hình . 397

4.1.1 Ứng dụng của hành vi . 397

4.1.2 Tổng quan lớp Behaviour . 399

4.2 Cơ bản về hành vi . 399

4.2.1 Viết một lớp Behaviour . 400

4.2.2 Sử dụng một lớp Behaviour . 405

4.2.3 Các hàm API trong lớp Behaviour . 409

4.3 Điều kiện kích hoạt: Cách kích hoạt các hành vi . 412

4.3.1 Điều kiện kích hoạt . 413

4.3.2 WakeupCriterion . 414

4.3.3 Quy định lớp WakeupCriterion . 414

4.3.4 Thành phần của WakeupCondition . 430

4.4 Lớp Behaviour tiện ích xử lý bàn phím . 432

4.4.1 Một ví dụ đơn giản . 433

4.4.2 Lớp KeyNavigatorBehaviour và KeyNavigator . 435

4.5 Lớp tiện ích tương tác với chuột . 437

4.5.1 Sử dụng lớp MouseBehaviour . 437

4.5.2 Mouse Behaviour Foundation . 442

4.5.3 Các lớp MouseBehaviour . 444

4.5.4 Mouse Navigation . 447

4.6 Picking Object . 450

4.6.1 Using Picking Utility Classes . 454

4.6.2 Các hàm API cơ bản trong các lớp Picking . 458

4.6.3 Các lớp picking . 467

4.6.4 Các lớp Picking Behavior . 471

CHƯƠNG 5 . 474

Lập trình đồ họa trên Java 2D và 3D

Hoạt Hình . 474

Animation - Hoạt hình: . 476

Đối tượng Interpolator và Alpha với hoạt ảnh dựa thời gian . 477

Alpha . 477

Sử dụng các đối tượng Interpolator và Alpha: . 480

Ví dụ sử dụng lớp Alpha và RotationInterpolator: . 480

Alpha API: . 486

Các lớp hành vi Interpolator : . 489

Core Interpolator API: . 504

Các lớp đối tượng nội suy đường: . 513

Lớp Billboard : . 522

Sử dụng đối tượng Billboard . 523

Chương trình ví dụ sử dụng Billboard . 525

Giao diện lập trình ứng dụng của Billboard (Billboard API) . 529

OrientedShape3D . 531

Giao diện lập trình ứng dụng của OrientedShape3D . 532

Ví dụ sử dụng OrientedShape3D . 533

Hoạt ảnh mức chi tiết (Level Of Detail Animations) . 535

Sử dụng đối tượng DistanceLOD . 536

Các lỗi thường gặp khi sử dụng LOD . 537

Ví dụ sử dụng DistanceLOD . 537

Giao diện lập trình ứng dụng DistanceLOD API . 544

Morph . 545

Sử dụng đối tượng Morph . 546

Ví dụ sử dụng Morph . 547

Giao diện lập trình ứng dụng Morph API . 553

Giao diện GeometryUpdater . 554

Sử dụng GeometryUpdater . 555

Chương trình ví dụ hệ thống phân tử đài phun nước sử dụng GeometryUpdater

. 556

Lời nói đầu

pdf571 trang | Chia sẻ: netpro | Ngày: 10/04/2013 | Lượt xem: 3129 | Lượt tải: 40download
Bạn đang xem nội dung tài liệu Giáo trình Lập trình JAva 2D and 3D, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
ví dụ của một trường được định nghĩa trong lớp Primitive là giá trị integer GEOMETRY_NOT_SHARED. Trường này chỉ ra dạng hình học được sẽ không được chia sẻ với những instance khác. Thiết lập cờ này để tránh 266 Lập trình đồ họa trên Java 2D và 3D việc chia sẻ giữa các primitive của cùng một tham số (chẳng hạn với hình cầu bán kính 1). Cone myCone = new Cone(Primitive.GEOMETRY_NOT_SHARED); Primitive Methods Package: com.sun.j3d.utils.Geometry Primitive mở rộng từ Group và là lớp cha của của các lớp Box, Cone, Cylinder và Sphere. public void setNumVertices(int num) Thiết lập tổng số đỉnh trong primitive này. void setAppearance(int partid, Appearance Appearance) Thiết lập bề mặt của các phần con. Các đối tượng Box, Cone, Cylinder được gom lại với hơn một đối tượng Shape3D, mỗi thứ có tiềm năng sử dụng nút thành phần bề mặt của nó. Giá trị cho mỗi phần này được xác định khi mỗi nút thành phần bề mặt được thiết lập. void setAppearance() Thiết lập bề mặt chính của primitive (tất cả các phần con) tới bề mặt trắng mặc định. 2.4 Các lớp toán học Để tạo đối tượng quan sát, cần cả lớp hình học và các lớp con của nó. Rất nhiều lớp con của lớp hình họcmo tả dựa trên các hình cơ bản véc tơ, như điểm đường thẳng và đa giác. Các lớp con của lớp hình học sẽ được mô tả trong phần 2-5 nhưng trước đó chúng ta quan tâm đến các lớp toán 267 Lập trình đồ họa trên Java 2D và 3D học như điểm, màu, vertor và textcord dùng để định nghĩa các dữ liệu liên đỉnh. Chú ý rằng với mỗi kí hiệu có “*” đằng sau đại diện cho một lớp tên. Ví dụ Tuple* tương đương với Tuple2f, Tuple2d Tuple3i…. Trong đó các chữ số đằng sau chỉ ra số thành phần trong tuple, còn các chữ cái nhỏ cuối cùng đại diện cho kiểu. ‘f’ chỉ float, ‘d’ chỉ double, ‘b’ đại diện cho byte, ‘i’ là integer. Vì thế lớp Tuple3f là một lớp mà quản lí 3 giá trị điểm thực. Tất cả các lớp toán học này đều nằm trong gói javax.vecmath.* Gói này định nghĩa một số lớp Tuple như là các lớp trừu tượng. Rất nhìều các lớp hữu ích thừa kế từ các lớp này. Dưới đây là hình 2-9 cây thừa kế. 268 Lập trình đồ họa trên Java 2D và 3D Mỗi đỉnh của một đối tượng quan sát có thể chỉ ra tới 4 đối tượng trong javax.vecmath đại diện cho tọa độ, màu bề mặt bình thường và bề mặt tọa độ. Các lớp thường được sử dụng:  Point* (for coordinates)  Color* (for colors)  Vector* (for surface normals)  TexCoord* (for texture coordinates, see Chapter 7) Tuple2f Constructors Chú ý rằng tọa độ (Point* object) là cần thiết để địa chỉ mỗi đỉnh. Các dữ liệu khác là tùy chọn ,tùy thuộc vào các hình cơ bản được dựng hình như thế nào. Ví dụ như một màu có thể được định nghĩa tại mỗi đỉnh và các màu của các hình cơ bản là được thêm vào giữu các màu tại các đỉnh. Nếu ánh ánh sáng được thiết lập, bề mặt bình thường (Vertor* object) là cần thiết. Nếu bề mặt ánh xạ được thiết lập thì tọa độ bề mặt cũng cần thiết vậy. Tât cả các lớp cần thiết được trình bày bên dưới đây. Tuple2f Constructors Package: javax.vecmath Các lớp Tuple* thường không được sử dụng trực tiếp trong chương trình Java 3D nhưng cung cấp nền tảng cho Point*, Color*, Vector*, TexCoord*. Ví dụ như Tuple2f cung cấp cơ sở cho Point2f, Color2f, và TexCoord2f. Các hàm khởi tạo dưới đây đều đúng với các lớp con tương tụ như Tuple3f và Tuple4f. Tuple2f() Khởi tạo và thiết lập đối tượng Tuple với tọa độ (0,0). Tuple2f(float x, float y) 269 Lập trình đồ họa trên Java 2D và 3D Khởi tạo và thiết lập đối tượng Tuple với tọa độ (x,y). Tuple2f(float t[]) Khởi tạo và thiết lập đối tượng Tuple từ một mảng đặc biệt. Tuple2f(Tuple2f t) Khởi tạo và thiết lập đối tượng Tuple từ dữ liệu của một Tuple khác Tuple2f(Tuple2d t) Khởi tạo và thiết lập đối tượng Tuple từ dữ liệu của một Tuple khác Tuple2f Methods (partial list) Package: javax.vecmath Các lớp Tuple* thường không được sử dụng trực tiếp trong chương trình Java 3D nhưng cung cấp nền tảng cho Point*, Color*, Vector*, TexCoord*. Ví dụ như Tuple2f cung cấp cơ sở cho Point2f, Color2f, và TexCoord2f. Các hàm khởi tạo dưới đây đều đúng với các lớp con tương tụ như Tuple3f và Tuple4f. Các phương thức của chúng cũng tương tự như vậy. void set(float x, float y) void set(float t[]) Lập giá trị của tuple này từ một giá trị định trước. boolean equals(Tuple2f t1) Trả về giá trị true nêu trong Tuple t1 bằng với giá trị sẵn có của tuple. final void add(Tuple2f t1) Lập giá trị của tuple này tới vertor tổng của nó và Tuple t1. void add(Tuple2f t1, Tuple2f t2) Lập giá trị của tuple này tới vertor tổng của nó và Tuple t1 và t2. void sub(Tuple2f t1, Tuple2f t2) 270 Lập trình đồ họa trên Java 2D và 3D Lập giá trị của tuple này tới vertor khác của t1 và t2 (this = t1 - t2). void sub(Tuple2f t1) Lập giá trị của tuple này tới vertor khác của nó và t1 (this = this - t1). void negate() Loại bỏ giá trị của một vertor. void negate(Tuple2f t1) Lập giá trị cho tuple sau khi loại bỏ giá trị của nó void absolute() Đổi tất cả thành phần của tuple này thành giá trị tuyệt đối. void absolute(Tuple2f t) Lập giá trị của các thành phần thành giá trị tuyệt đối và ghi vào tuple. 2.4.1 Point Classes Đối tượng Point* thường được đại diện cho tọa độ của một đỉnh, chẳng hạn như một vạch quét ảnh, một điểm nguồn sáng, nguồn âm thanh và các dữ liệu điểm khác. Hàm tạo cho lớp Point* giống như hàm tạo của Tuple* ngoại trừ chúng trả về đối tượng Point*. Point3f Methods (partial list) Package: javax.vecmath Lớp Point* được thừa kế từ lớp Tuple*. Mỗi instance của lớp Tuple* đại diện cho một điểm đơn trong 2, 3 hoặc 4 không gian. Thêm vào các phương thức của Tuple*, lớp Point* có thêm các phương thức riêng của nó, được chỉ ra dưới đây. float distance(Point3f p1) Trả về khoảng cách giữa điểm này và điểm p1. 271 Lập trình đồ họa trên Java 2D và 3D float distanceSquared(Point3f p1) Trả về khoảng cách bình phương giữu 2 điểm p và p1. float distanceL1(Point3f p1) Trả về khoảng cách L1 (Manhattan) giữa điểm này và điểm p1. Khoảng cách L1 là: abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2) 2.4.2 Color Classes Đối tượng lớp màu đại diện cho một màu, có thể là một đỉnh, thuộc tính của chất liệu, sương mù hoặc các đối tượng quan sát khác. Các màu được chỉ ra hoặc là Color3* hoặc Color4* kiểu dữ liệu thường là kiểu thực. Color3* xác định màu thông qua 3 màu đỏ, xanh da trời và xanh nước biển.Giá trị của màu là từ 0 đến 255, đối với giá trị alpha là từ 0.0 đến 1.0. Đối với đối tượng Color4* có thêm giá trị về độ sâu. Khi giá trị alpha bằng 1 thì màu hiện nguyên vẹn. Giá trị của màu là kiểu byte có giá trị [-128,127] tuy nhiên Java vẫn xử lí giá trị màu [0,255]. Ví dụ về một lớp màu: import javax.vecmath.*; class ColorConstants{ public static final Color3f red = new Color3f(1.0f,0.0f,0.0f); public static final Color3f green = new Color3f(0.0f,1.0f,0.0f); public static final Color3f blue = new Color3f(0.0f,0.0f,1.0f); 272 Lập trình đồ họa trên Java 2D và 3D public static final Color3f yellow = new Color3f(1.0f,1.0f,0.0f); public static final Color3f cyan = new Color3f(0.0f,1.0f,1.0f); public static final Color3f magenta = new Color3f(1.0f,0.0f,1.0f); public static final Color3f white = new Color3f(1.0f,1.0f,1.0f); public static final Color3f black = new Color3f(0.0f,0.0f,0.0f); } Ta có thể thấy hàm tạo của lớp Color* giống như lớp Tuple*, ngoại trừ là nó trả về đối tượng Color*. Lớp này chỉ có một hàm khởi tạo và 2 phương thức thêm vào so với lớp cha của nó Tuple*. Color* Constructors (partial list) Package: javax.vecmath Mỗi instance trong lớp Color* đại diện cho một màu đơn trong 3 thành phần đỏ, xanh lá cây và xanh nước biển (RGB), hoặc một trong bốn thành phần 3 màu và thêm độ alpha (RGBA). Giá trị alpha bằng 0 là trong suốt còn bằng 1 là hiện nguyên bản. Color*(Color color) Tạo đối tượng Java 3D Color*() (Color3b, Color3f, Color4b, Color4f) sử dụng một đối tượng AWT Color. Khi khởi tạo đối tượng Color4* sử dụng đối tượng AWT Color giá trị alpha được thiết lập bằng 1. 273 Lập trình đồ họa trên Java 2D và 3D Color* Methods Package: javax.vecmath Lớp Color* (Color3b, Color3f, Color4b, Color4f) thừa kế từ lớp Tuple*. Mỗi instance của lớp này đại điện cho một màu trong 3 (RGB) hoặc 4 (RGBA) thành phần. Dưới đây là một vài phương thức trong Color3* và Color4*. void set(Color color) Lập màu sử dụng mầu từ đối tượng AWT Color Color get() Lấy một màu coi là một màu của đối tượng AWT Color. 2.4.3 Vector Classes Vector* objects often represent surface normals at vertices although they can also represent the direction of a light source or sound source. Again, the constructors for Vector* classes are similar to the Tuple* constructors. However, Vector* objects add many methods that are not found in the Tuple* classes. Đối tượng Vertor* đại diện cho bề mặt bình thường tại các định dù chúng cũng có thể đại diện cho hướng của một nguồn sáng hoặc nguồn âm thanh. Một lần nữa ta có thể thấy các hàm tạo của Vertor* cũng tương tự như Tuple*. Vector3f Methods (partial list) Package: javax.vecmath 274 Lập trình đồ họa trên Java 2D và 3D Lớp Vector* thừa kế từ Tuple*. Mỗi instances của lớp Vector* đại diện cho một đỉnh vertor trong không gian 1,2,3,4 chiều. Ngoài ra nó còn có thêm những phương thức như dưới đây. float length() Trả về độ dài của một vertor float lengthSquared() Trả về giá trị bình phương độ dài của một vertor. void cross(Vector3f v1, Vector3f v2) Lập một vertor trở thành vertor pháp tuyến của 2 vertor v1 và v2. float dot(Vector3f v1) Tính toán và trả về tích số điểm của product hiện tại và vertor v1. void normalize() Bình thường hóa vertor hiện tại void normalize(Vector3f v1) Lập giá trị của vertor này với giá trị của vertor v1 được bình thường hóa. float angle(Vector3f v1) Trả về góc radians giữa vertor hiện tại với vertor tham số, giá trị này được rằng buộc trong khoảng [0,PI]. 2.4.4 TexCoord Classes Chỉ có 2 lớp TexCoord* được sử dụng như là một tập các kết cấu bề mặt tọa độ tại một đỉnh, là TexCoord2f và TexCoord3f. Với TexCoord2f có một cặp tọa độ là (s, t), với TexCoord3f thì có 3 tọa độ là (s, t, r). Hàm tạo của lớp này cũng tương tự như lớp Tuple* và không có thêm phương thức nào so với lớp cha của nó. 275 Lập trình đồ họa trên Java 2D và 3D 2.5 Các lớp hình học Trong đồ họa 3D, mọi thứ từ hình tam giác đơn giản đến hình phức tạp như một chiếc máy bay đều được mô hình hóa và dựng dưới dạng dữ liệu theo đỉnh. Trong Java 3D mỗi đối tượng Shape3D có thể gọi phương thức setGeometry() của nó để tham chiếu đến một hoặc chỉ một đối tượng Geometry. Chính xác hơn Geometry là lớp trừu tượng, cho nên một đối tượng tham chiếu là một instance của lớp con của Geometry. Các lớp con của Geometry có những dạng sau: 1. Non-indexed vertex-based Geometry (mỗi khi đối tượng quan sát được dựng các đỉnh của nó chỉ được sử dụng một lần) 2. Indexed vertex-based Geometry (mỗi khi đối tượng quan sát được dựng các đỉnh của nó được sử dụng nhiều lần) Các đối tượng quan sát khác (Các lớp Geometry, Text3D, và CompressedGeometry) Phần này chỉ nói về 2 dạng trên. Cây thừa kế được hiển thị dưới hình 2-10 276 Lập trình đồ họa trên Java 2D và 3D 2.5.1 GeometryArray Class Như cái tên của lớp này cho bạn hình dung lớp con này của Geometry được sử dụng để định nghĩa điểm đường và hình đa giác điền đầy. Những thành phần nguyên tố dựa trên điểm này là lớp con của của lớp trừu tượng GeometryArray, chỉ ra một mảng chứa các dữ liệu về đỉnh. Ví dụ như một đối tượng dùng để chỉ một tam giác, 3 thành phần được định nghĩa, mỗi thành phần cho mỗi đỉnh. Với mỗi thành phần của mảng này duy trì một vị trí tọa độ cho đỉnh của nó (có thể định nghĩa bằng Point* với dữ liệu tương tự) . Ngoài định ra tọa độ thì các giá trị này có thể định nghĩa màu, bề mặt bình thường hoặc texture. Vì vậy những mảng nầy chứa tọa độ, màu, bề mặt thường, và texture, dưới dạng dữ liệu mảng. Có 3 bước trong vòng đời của một đối tượng GeometryArray 1. Tạo một đối tượng rỗng 2. Điền đầy đối tượng với dữ liệu 3. Đồng hóa (tham chiếu) đối tượng từ (1 hoặc nhiều) đối tượng Shape3D. Bước 1: Tạo một đối tượng GeometryArray rỗng Khi một đối tượng GeometryArray vừa được khởi tạo thì cần thiết phải định nghĩa 2 thứ Số đỉnh, hay số thành phần cần thiết Định dạng của dữ liệu (tọa độ, màu, bề mặt thường, và texture) được lưu tại mỗi đỉnh. Còn được gọi là “vertex format” (định dạng đỉnh). GeometryArray Constructor GeometryArray(int vertexCount, int vertexFormat) Hàm tạo này tạo đối tượng GeometryArray rỗng với những số đỉnh và định dạng đỉnh cho trước. Một trong những cờ riêng là các bitwise “OR” 277 Lập trình đồ họa trên Java 2D và 3D hợp với nhau để mô tả dữ liệu mỗi đỉnh. Những giá trị cờ để định dạng các đỉnh là: COORDINATES: Chỉ ra mảng các đỉnh chứa tọa độ. Bit này buộc phải lập. NORMALS: Chỉ ra mảng đỉnh chứa bề mặt thường. COLOR_3: Chỉ ra mảng đỉnh chứa màu (không có thành phần trong suốt) COLOR_4: Chỉ ra mảng đỉnh chứa màu (có thành phần trong suốt) TEXTURE_COORDINATE_2: Chỉ ra mảng đỉnh chứa 2D texture coordinates. TEXTURE_COORDINATE_3: Chỉ ra mảng đỉnh chứa 3D texture coordinates. Với mỗi cờ định dạng được thiết lâp sẽ có một mảng tương ứng tạo trong đối tượng GeometryArray. Mỗi mảng này là số đỉnh (vertexCount) về kích cỡ. Vì lớp GeometryArray là lớp trừu tượng nên ta chỉ gọi phương thức thiết lập cho lớp con của nó như LineArray. Chú ý lớp Axis trong AxisApp.java là khác với lớp Axis chúng ta tự định nghĩa trong ví dụ này Bước 2: Điền đầy dữ liệu vào đối tượng GeometryArray rỗng Sau khi khởi tạo đối tượng GeometryArray, đăng kí dữ liệu cho mảng tương ứng với tạo định dạng của các đỉnh. Có thể làm việc này trên mỗi đỉnh hoặc sử dụng mảng để đăng kí dữ liệu cho nhiều đỉnh chỉ với một lời gọi phương thức . Các phương thức sẵn có sau: GeometryArray Methods (partial list) 278 Lập trình đồ họa trên Java 2D và 3D GeometryArray là lớp trừu tượng cho PointArray, LineArray, TriangleArray, QuadArray, GeometryStripArray, và IndexedGeometryArray. void setCoordinate(int index, float coordinate[]) void setCoordinate(int index, double coordinate[]) void setCoordinate(int index, Point* coordinate) Lập tọa độ tương ứng với đỉnh với mỗi đỉnh được định nghĩa là một chỉ mục cho đối tượng này. void setCoordinates(int index, float coordinates[]) void setCoordinates(int index, double coordinates[]) void setCoordinates(int index, Point* coordinates[]) Lập các tọa độ tương ứng với đỉnh với các đỉnh được định nghĩa là chỉ mục cho đối tượng này. void setColor(int index, float color[]) void setColor(int index, byte color[]) void setColor(int index, Color* color) Lập màu tương ứng với đỉnh với mỗi đỉnh được định nghĩa là một chỉ mục cho đối tượng này. void setColors(int index, float colors[]) void setColors(int index, byte colors[]) void setColors(int index, Color* colors[]) Lập các màu tương ứng với các đỉnh ,với mỗi đỉnh được định nghĩa là một chỉ mục cho đối tượng này. void setNormal(int index, float normal[]) void setNormal(int index, Vector* normal) Lập trực giao tương ứng với mỗi đỉnh tại vị trí chỉ mục được chỉ ra cho đối tượng này. void setNormals(int index, float normals[]) void setNormals(int index, Vector* normals[]) 279 Lập trình đồ họa trên Java 2D và 3D Lập các trực giao tương ứng với các đỉnh tại vị trí chỉ mục được chỉ ra cho đối tượng này. void setTextureCoordinate(int texCoordSet, int index, float texCoord[]) void setTextureCoordinate(int texCoordSet, int index, TexCoord* coordinate) Lập texture coordinate ứng với mỗi đỉnh tại vị trí chỉ mục cho trước cho một tập texture coordinate của đối tượng. GeometryArray Methods (partial list, continued) void setTextureCoordinates(int texCoordSet, int index, float texCoords[]) void setTextureCoordinates(int texCoordSet, int index, TexCoord* texCoords[]) Lập các texture coordinate ứng với các đỉnh tại vị trí chỉ mục cho trước cho một tập texture coordinate của đối tượng. void setInitialVertexIndex(int initialVertexIndex) Lập chỉ mục cho đỉnh ban đầu với đối tượng GeometryArray. Cho phép một vài đỉnh có thể bỏ qua trong việc dựng hình, và các hoạt động khác. void setValidVertexCount(int validVertexCount) Lạp các giá trị tính toán đỉnh đúng cho đối tượng GeometryArray. Cho phép một vài dữ liệu đỉnh có thể bỏ qua khi dựng hình, chọn lọc và các hoạt động khác. Đoạn mã 2-5 chỉ ra trường hợp sử dụng phương thức của GeometryArray để lưu giữ tạo độ và giá trị màu trong mảng LineArray. Đối tượng trục X chỉ gọi phương thức setCoordinate() để lưu trữ dữ liệu tọa độ. Đối tượng trục Y gọi cả 2 phương thức setColor() và setCoordinate() để nạp giá trị màu RGB và giá trị tọa độ. Đối tượng trục Z thì gọi 10 lần phương thức setCoordinate() cho mỗi đỉnh và gọi setColors() một lần để nạp cho cả 10 đỉnh với 1 phương thức. 280 Lập trình đồ họa trên Java 2D và 3D // ////////////////////////////////////// //// // // create axis subgraph // public Axis() { axisBG = new BranchGroup(); // create line for X axis LineArray axisXLines = new LineArray(2, LineArray.COORDINATES); axisBG.addChild(new Shape3D(axisXLines)); axisXLines.setCoordinate(0, new Point3f(-1.0f, 0.0f, 0.0f)); axisXLines.setCoordinate(1, new Point3f(1.0f, 0.0f, 0.0f)); Color3f red = new Color3f(1.0f, 0.0f, 0.0f); Color3f green = new Color3f(0.0f, 1.0f, 0.0f); Color3f blue = new Color3f(0.0f, 0.0f, 1.0f); // create line for Y axis 281 Lập trình đồ họa trên Java 2D và 3D LineArray axisYLines = new LineArray(2, LineArray.COORDINATES | LineArray.COLOR_3); axisBG.addChild(new Shape3D(axisYLines)); axisYLines.setCoordinate(0, new Point3f(0.0f, -1.0f, 0.0f)); axisYLines.setCoordinate(1, new Point3f(0.0f, 1.0f, 0.0f)); axisYLines.setColor(0, green); axisYLines.setColor(1, blue); // create line for Z axis Point3f z1 = new Point3f(0.0f, 0.0f, -1.0f); Point3f z2 = new Point3f(0.0f, 0.0f, 1.0f); LineArray axisZLines = new LineArray(10, LineArray.COORDINATES | LineArray.COLOR_3); axisBG.addChild(new Shape3D(axisZLines)); axisZLines.setCoordinate(0, z1); axisZLines.setCoordinate(1, z2); axisZLines.setCoordinate(2, z2); 282 Lập trình đồ họa trên Java 2D và 3D axisZLines.setCoordinate(3, new Point3f(0.1f, 0.1f, 0.9f)); axisZLines.setCoordinate(4, z2); axisZLines.setCoordinate(5, new Point3f(-0.1f, 0.1f, 0.9f)); axisZLines.setCoordinate(6, z2); axisZLines.setCoordinate(7, new Point3f(0.1f, -0.1f, 0.9f)); axisZLines.setCoordinate(8, z2); axisZLines.setCoordinate(9, new Point3f(-0.1f, -0.1f, 0.9f)); Color3f colors[] = new Color3f[9]; colors[0] = new Color3f(0.0f, 1.0f, 1.0f); for (int v = 0; v < 9; v++) { colors[v] = red; } axisZLines.setColors(1, colors); } // end of axis constructor Màu mặc định cho các đỉnh của một đối tượng mảng GeometryArray là trắng, nếu cả COLOR_3 và COLOR_4 không được định nghĩa. Khi các đường hoặc đa giác đầy được dựng với các màu khác nhau tại mỗi đỉnh thì các màu sẽ mịn dần giữa các đỉnh sử dụng phép đánh bóng Gouraud. 283 Lập trình đồ họa trên Java 2D và 3D Bước 3: Tạo đối tượng Shape3D tham chiếu đến đối tượng GeometryArray Đoạn mã dưới đây chỉ ra cách làm thế nào để đối tượng Shape3D tham chiếu đến đối tượng GeometryArray. Đối tượng Shape3D được thêm vào một BranchGroup sẽ được thêm vào ở nơi nào đó trên đồ thị khung cảnh. (Shape3D là lớp con của Node, vì thế Shape3D có thể thêm vào thành con của một đồ thị khung cảnh ) Đồ thị khung cảnh được chỉ ra ở dưới đây: 2.5.2 Subclasses of GeometryArray Như đã nói ở phần trên do GeometryArray là lớp trừu tượng là lớp cha của rất nhiều lớp con hữu dụng, chẳng hạn như LineArray. Hình 1-2 cho thấy cây thừa kế đối với lớp GeometryArray và các lớp con của nó. Lí do tồn tại của các lớp con này là làm sao để trình dựng hình của Java 3D có thể quyết định dựng đối với các đỉnh của các lớp đó. 284 Lập trình đồ họa trên Java 2D và 3D Hình 2-13 chỉ ra một ví du về các lớp con của GeometryArray gồm: PointArray, LineArray, TriangleArray, và QuadArray (các lớp này không phải là lớp con của GeometryStripArray). Trong hình này, các tập bên trái nhất của các đỉnh chỉ ra 3 điểm đỉnh dựng thành 6 điểm, 3 đường, hoặc 2 tam giác. Hình thứ 4 chỉ ra 4 đỉnh định nghĩa một tứ giác. Chú ý rằng các định này không dùng chung: mỗi đường hoặc một đa giác đầy được dựng độc lập với nhau. GeometryArray Subclass Constructors Tạo một đối tượng rỗng với số đỉnh và định dạng đỉnh cho trước. PointArray(int vertexCount, int vertexFormat) LineArray(int vertexCount, int vertexFormat) TriangleArray(int vertexCount, int vertexFormat) QuadArray(int vertexCount, int vertexFormat) 285 Lập trình đồ họa trên Java 2D và 3D Để tìm hiểu cách sử dụng hàm tạo và phương thức xem lại đoạn mã 2- 4 và 2-5,2-6 sử dụng đối tượng LineArray. Nếu bạn đang dựng một hình tứ giác cẩn thận với các đỉnh có thể tạo thành hình lõm, tự cắt nhau hoặc không phẳng. Nếu xảy ra, chúng không thể dựng đúng được. 2.5.3 Subclasses of GeometryStripArray Phần trước mô tả 4 lớp con của GeometryArray, không cho phép sử dụng lại các đỉnh, tuy nhiên có một vài trường hợp ta cần sử dụng lại các đỉnh, để cho kết quả dựng hình tốt hơn. Lớp GeometryStripArray là lớp trừu tượng từ đó mỗi thực thể hình học cơ bản (để ghép tạo đường và bề mặt ) thừa kế. GeometryStripArray là lớp cha của LineStripArray, TriangleStripArray và TriangleFanArray. Ta có hình 2-14 chỉ ra một instance của một dạng các đỉnh được sử dụng lại. Lớp GeometryStripArray có hàm tạo khác với lớp GeometryArray. Hàm tạo của nó có 3 tham số, một mảng cách đỉnh tính trên mỗi mảnh cho phép một đối tượng có thể duy trì nhiều mảnh. GeometryStripArray có 2 phương thức thường sử dụng đến là getNumStrips() và getStripVertexCounts(). GeometryStripArray Subclass Constructors 286 Lập trình đồ họa trên Java 2D và 3D Tạo một đối tượng rỗng với giá trị các đỉnh và định dạng các đỉnh và một mảng tính toán các đỉnh qua các mảnh. Định dạng là một hay nhiều các bit cờ “OR” để mô tả cho mỗi dữ liệu đỉnh. Định dạng các cờ là giống nhau như đã định nghĩa trong lớp GeometryArray. Nhiều mảnh cùng một lúc cũng được hỗ trợ. Tổng các tính toán đỉnh cho tất cả các mảnh phải bằng với tổng số các đỉnh LineStripArray(int vtxCount, int vertexFormat, int stripVertexCounts[]) TriangleStripArray(int vtxCount, int vertexFormat, int stripVertexCounts[]) TriangleFanArray(int vtxCount, int vertexFormat, int stripVertexCounts[]) Chú ý rằng Java 3D không hỗ trợ các hình cơ bản đầy với nhiều hơn 4 mặt. Người lập trình phải có trách nhiệm trong việc sử dụng kĩ thuật tách để tách hình phức tạp ra thành nhiều các đối tượng của Java 3D như mảng tam giác hoặc hình quạt. Triangulator Class Package: com.sun.j3d.utils.Geometry Sử dụng để chuyển các đa giác hình học không có dạng tam giác về các tam giác để có thể dựng hình bằng Java 3D. Các đa giác phải là lồi, cùng nằm trên một mặt phẳng các cạnh không giao nhau. Triangulator Constructor Summary Triangulator() Tạo một đối tượng tam giác. Triangulator Method Summary void triangulate(GeometryInfo ginfo) 287 Lập trình đồ họa trên Java 2D và 3D Chương trình con này chuyển đối tượng GeometryInfo từ dạng cơ bản POLYGON_ARRAY thành dạng TRIANGLE_ARRAY sử dụng kĩ thuật tách đa giác Tham số: ginfo - com.sun.j3d.utils.Geometry.GeometryInfo to be triangulated. Ví dụ về cách sử dụng: TRIANGLE_ARRAY Triangulator tr = new Triangulator(); tr.triangulate(ginfo); // ginfo contains the Geometry shape.setGeometry(ginfo.getGeometryArray()); // shape is a Shape3D Yo-yo Code Demonstrates TriangleFanArray Đối tượng Yoyo trong chương trình YoyoApp.java schỉ ra cách sử dụng đối tượng TriangleFanArray để mô hình hóa con yo-yo Hình 2-15 chỉ 3 hình dựng của TriangleFanArray. Trong đoạn mã 2-7, phương thức yoyoGeometry()tạo và trả về đối tượng TriangleFanArray mong muốn. 288 Lập trình đồ họa trên Java 2D và 3D Dòng 15-18 tính toán tâm điểm cho 4 hình nón. Mỗi hình nón có 18 đỉnh được tính toán ở dòng 20-28. Dòng 30-32 tạo một đối tượng TriangleFanArray và dòng 34 là nơi để tính toán dữ liệu tọa độ (từ dòng 15-28) để lưu đối tượng 1. private Geometry yoyoGeometry() { 2. 3. TriangleFanArray tfa; 4. int N = 17; 5. int totalN = 4*(N+1); 6. Point3f coords[] = new Point3f[totalN]; 7. int stripCounts[] = {N+1, N+1, N+1, N+1}; 8. float r = 0.6f; 9. float w = 0.4f; 10. int n; 11. double a; 12. float x, y; 13. 14. // set the central points for four triangle fan strips 15. coords[0*(N+1)] = new Point3f(0.0f, 0.0f, w); 16. coords[1*(N+1)] = new Point3f(0.0f, 0.0f, 0.0f); 17. coords[2*(N+1)] = new Point3f(0.0f, 0.0f, 0.0f); 18. coords[3*(N+1)] = new Point3f(0.0f, 0.0f, -w); 19. 20. for (a = 0,n = 0; n < N; a = 2.0*Math.PI/(N-1) *

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

  • pdfLap-Trinh-Java2D-and-3D.pdf