You are on page 1of 572

Lp trnh ha trn Java 2D v 3D

Phn 1............................................................................................................................. 9
Lp trnh ha vi Java 2D..........................................................................................9
Chng 1.................................................................................................................. 10
Tng 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
Chng 2:................................................................................................................. 25
Rendering with Graphics2D..................................................................................... 25
2.1 Cc lp v giao din....................................................................................... 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 trnh x l theo phin............................................................................ 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 Thit lp 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...................... 52
2.4 Rendering Graphics Primitives.......................................................................53
2.4.1 Drawing a Shape......................................................................................54
2.4.2 Filling a Shape.........................................................................................55

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


2.4.3 Rendering Text........................................................................................ 57
2.4.4 Rendering images.................................................................................... 57
2.5 Defining Custom Composition Rules.............................................................57
2.6 Rendering in a Multi-Screen Environment.....................................................57
Chng 3.................................................................................................................. 76
Cc i tng hnh ha.............................................................................................76
3.1 Giao din v lp..............................................................................................76
3.2 Cc khi nim hnh hc:................................................................................. 79
3.2.1 Constructive Area Geometry................................................................... 80
3.2.2 Bounds and Hit Testing........................................................................... 81
3.3 Combining Areas to Create New Shapes........................................................90
Chng 4:................................................................................................................. 95
Hin th Font v vn bn...........................................................................................95
4.1.Giao din v lp..............................................................................................95
4.2.Cc khi nim v Font....................................................................................97
4.3 Cc khi nim v Text Layout........................................................................99
4.3.1 V ch....................................................................................................100
4.3.2 Ordering Text.........................................................................................102
4.3.3 o v nh v vn bn............................................................................104
4.3.4 H tr thao tc vi vn bn....................................................................105
4.3.4.1 Hin th du nhc............................................................................105
4.3.4.2 Di chuyn du nhc........................................................................107
4.3.4.3 Hit Testing..................................................................................... 108
4.3.4.4 nh du vng la chn................................................................ 109
4.3.5 Thc thi vic hin th vn bn trong ng dng Java .........................110
Qun l vic hin th vn bn............................................................................. 111
4.4.1 Trnh by vn bn..................................................................................112
Hin th du nhc kp..................................................................................... 113
4.4.3 Di chuyn du nhc................................................................................114
4.4.4 Hit Testing............................................................................................. 115
4.4.5 nh du vng la chn........................................................................ 116
4.4.6 Querying Layout Metrics.......................................................................116
4.4.7 V vn bn trn nhiu dng...................................................................117
Chng 5................................................................................................................ 127
To nh....................................................................................................................... 127
5.1 Cc giao din v cc lp..........................................................................127
5.1.1 Cc giao din imaging (imaging interfaces).........................................128
5.1.2 Cc lp d liu nh(image Data Classes)..............................................128
5.1.3 image Operation Classes........................................................................130
5.1.4 Sample Model Classes...........................................................................131
Color Model Classes.......................................................................................132
5.1.6 Exception Classes..................................................................................133
5.2 Immediate Mode imaging Concepts.............................................................134
5.2.1 Terminology...........................................................................................136
5.3 Using Bufferedimages.................................................................................. 137
5.3.1 Creating a Bufferedimage......................................................................137
5.3.2 Drawing in an Offscreen Buffer............................................................ 138
5.3.2.1 Creating an Offscreen Buffer.........................................................139
5.3.2.2 Drawing in an Offscreen Buffer.................................................... 141
5.3.3 Manipulating Bufferedimage Data Directly.......................................... 142

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


5.3.4 Filtering a Bufferedimage......................................................................143
5.3.5 Rendering a Bufferedimage ..................................................................143
5.4 Managing and Manipulating Rasters............................................................151
5.4.1 Creating a Raster....................................................................................151
5.4.2 Parent and Child Rasters........................................................................152
5.4.4 The WritableRaster Subclass.................................................................153
5.5 Image Data and DataBuffers.........................................................................153
5.6 Extracting Pixel Data from a SampleModel.................................................154
5.7 ColorModels and Color Data........................................................................155
5.7.1 Lookup Table.........................................................................................156
5.8 image Processing and Enhancement.............................................................156
5.8.1 Using an image Processing Operation...................................................159
Chng 6................................................................................................................ 163
Mu sc...................................................................................................................163
6.1 Cc lp .........................................................................................................164
6.2 Nhng nh ngha v mu sc.......................................................................164
6.2.1 Khng gian mu....................................................................................165
6.2.1 Biu din mu....................................................................................... 168
Chng 7 ............................................................................................................... 172
In n........................................................................................................................ 172
7.1 Cc giao din v cc lp...............................................................................172
7.2.1 Supporting Printing................................................................................175
7.2.1.1 iu khin in (Job Control)...........................................................175
7.2.2 Page Painters..........................................................................................176
7.2.3 Printable Jobs and Pageable Jobs...........................................................178
7.2.4 Typical Life-Cycle of a PrinterJob................................................................ 179
7.3 Printing with Printables................................................................................ 182
7.3.2 Printing a File.........................................................................................186
7.4.1 Using a Pageable Job.............................................................................192
7.4.2 Using Multiple Page Painters................................................................ 194
Phn 2......................................................................................................................... 207
Lp trnh ha vi Java 3D......................................................................................207
CHNG 1............................................................................................................ 208
NHP MN LP TRNH TRN JAVA 3D.........................................................208
1.1 Tng quan v Java 3D API ......................................................................208
1.2 Cc vn c bn v Java 3D API ..........................................................209
1.3 Xy dng th khung cnh.........................................................................209
1.3.1 Tha k cp cao t Java 3D API .......................................................... 215
1.4 Cch thc vit mt chng trnh Java 3D....................................................217
1.4.1 Cng thc n gin vit mt chng trnh Java 3D ........................217
1.5 Mt vi thut ng trong Java 3D ................................................................. 222
1.6 V d n gin: HelloJava3Da .....................................................................224
1.6.1 Cc lp ca Java 3D Classes c s dng trong HelloJava3Da..............230
To nn hnh lp phng c kch thc c nh ra bi cc gi tr cho trc.....234
1.7 Quay hnh lp phng................................................................................. 234
1.7.1 S kt hp ca cc php bin hnh: HelloJava3Db............................... 236
1.8 Kh nng v hot ng................................................................................. 237
1.8.1 Dch cc ni dung..................................................................................237
1.8.2 Kh nng ...............................................................................................238
1.9 Thm vo cc hnh vi animation..................................................................240

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


1.9.1 nh ngha cc hnh vi animation......................................................... 241
1.9.2 Cc hm bin i v thi gian: nh x mt hnh vi vi thi gian........242
1.9.3 Lp danh mc cc vng......................................................................... 243
1.9.4 V d v hnh vi: HelloJava3Dc ...........................................................244
1.9.5 Php bin hnh v kt hp cc hnh vi .V d: HelloJava3Dd .............248
CHNG 2............................................................................................................ 252
To cc hnh............................................................................................................252
2.1 H ta th gii o.....................................................................................252
2.2 Visual Object Definition Basics................................................................... 253
2.2.1 An Instance of Shape3D Defines a Visual Object................................253
2.2.2 Node Components..................................................................................255
2.2.3 Defining Visual Object Classes.............................................................256
2.3 Cc lp tin ch hnh hc .............................................................................257
2.3.1 Box.........................................................................................................258
2.3.2 Cone ......................................................................................................260
2.3.3 Cylinder................................................................................................. 260
2.3.4 Sphere.................................................................................................... 261
2.3.5 More About Geometric Primitives........................................................ 262
2.3.6 ColorCube .............................................................................................262
2.3.7 Example: Creating a Simple Yo-Yo From Two Cones ........................262
2.4 Cc lp ton hc........................................................................................... 268
2.4.1 Point Classes .............................................................................................272
2.4.2 Color Classes......................................................................................... 273
2.4.3 Vector Classes........................................................................................275
2.4.4 TexCoord Classes..................................................................................276
2.5 Cc lp hnh hc........................................................................................... 277
2.5.1 GeometryArray Class ........................................................................... 278
2.5.2 Subclasses of GeometryArray .............................................................. 285
2.5.3 Subclasses of GeometryStripArray........................................................287
2.5.4 Subclasses of IndexedGeometryArray...................................................294
2.5.5 Axis.java is an Example of IndexedGeometryArray ............................297
2.6 Appearance and Attributes............................................................................297
2.6.1 Appearance NodeComponent................................................................299
2.6.2 Sharing NodeComponent Objects ........................................................ 299
2.6.3 Attribute Classes ...................................................................................300
2.6.4 Example: Back Face Culling ................................................................ 311
2.7 Bounds and Scope ........................................................................................321
2.7.1 Bounds Node Components ................................................................... 322
2.7.2 BoundingLeafa Node ............................................................................326
2.7.3 Scope......................................................................................................328
2.8 Hnh hc nng cao........................................................................................ 330
2.8.1 Multiple Geometries in a Single Shape3D ........................................... 330
2.8.2 GeometryArray ..................................................................................... 333
2.8.4 AlternateAppearance <new in 1.2> ...................................................... 341
2.9 Clipping Ct xn........................................................................................ 344
2.9.1 View Defines a Frustum........................................................................344
2.9.2 Clip Node ..............................................................................................346
2.9.4 ModelClip Example ..............................................................................347
CHNG 3............................................................................................................ 351
TO NI DUNG....................................................................................................351

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


3.1 Ni dung chnh..............................................................................................351
3.1.1 GeometryInfo.........................................................................................352
3.2.1 Mt v d n gin v GeometryInfo........................................................352
3.2.2 S dng GeometryInfo.......................................................................... 353
3.2.3 Mt s lp thng dng c lin quan n GeometryInfo........................354
Loaders................................................................................................................360
Mt v d n gin s dng leader................................................................. 360
Cc loader ph bin........................................................................................... 361
3.3.3 Giao din ca gi Loader v lp c s...............................................362
Vit mt loader................................................................................................... 366
Cng vic ca mt loader............................................................................... 366
Hm to lp Loader........................................................................................367
Vit mt File Loader n gin........................................................................369
Text2D................................................................................................................380
3.5.1 V d Text2D n gin..........................................................................381
3.5.2 Lp Text2D............................................................................................381
Text3D................................................................................................................383
Mt v d Text3D........................................................................................... 383
Nhng lp lin quan to ra i tng Text3D...........................................385
Nn khng gian ha ...................................................................................... 392
Mt v d background.....................................................................................392
Lp Background............................................................................................. 393
CHNG 4............................................................................................................ 397
TNG TC.........................................................................................................397
4.1 Hnh vi: C s ca tng tc v hot hnh...................................................398
4.1.1 ng dng ca hnh vi............................................................................398
4.1.2 Tng quan lp Behaviour...................................................................... 400
4.2 C bn v hnh vi.........................................................................................400
4.2.1 Vit mt lp Behaviour......................................................................... 401
4.2.2 S dng mt lp Behaviour...................................................................406
4.2.3 Cc hm API trong lp Behaviour.........................................................411
4.3 iu kin kch hot: Cch kch hot cc hnh vi..........................................413
4.3.1 iu kin kch hot................................................................................414
4.3.2 WakeupCriterion....................................................................................415
4.3.3 Quy nh lp WakeupCriterion............................................................. 415
4.3.4 Thnh phn ca WakeupCondition .......................................................431
4.4 Lp Behaviour tin ch x l bn phm........................................................433
4.4.1 Mt v d n gin.................................................................................434
4.4.2 Lp KeyNavigatorBehaviour v KeyNavigator..................................437
4.5 Lp tin ch tng tc vi chut...................................................................438
4.5.1 S dng lp MouseBehaviour .............................................................. 438
4.5.2 Mouse Behaviour Foundation................................................................444
4.5.3 Cc lp MouseBehaviour ..................................................................... 445
4.5.4 Mouse Navigation..................................................................................449
4.6 Picking Object...............................................................................................451
4.6.1 Using Picking Utility Classes................................................................455
4.6.2 Cc hm API c bn trong cc lp Picking ..........................................459
4.6.3 Cc lp picking......................................................................................468
4.6.4 Cc lp Picking Behavior ..................................................................... 472
CHNG 5............................................................................................................ 476

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


Hot Hnh................................................................................................................476
Animation - Hot hnh:.......................................................................................477
i tng Interpolator v Alpha vi hot nh da thi gian.............................478
Alpha...................................................................................................................478
S dng cc i tng Interpolator v Alpha:...................................................481
V d s dng lp Alpha v RotationInterpolator:............................................. 481
Alpha API:.......................................................................................................... 487
Cc lp hnh vi Interpolator :.............................................................................490
Core Interpolator API:.......................................................................................505
Cc lp i tng ni suy ng:...................................................................... 514
Lp Billboard :........................................................................................................523
S dng i tng Billboard ............................................................................. 524
Chng trnh v d s dng Billboard ...............................................................526
Giao din lp trnh ng dng ca Billboard (Billboard API)........................... 530
OrientedShape3D................................................................................................532
Giao din lp trnh ng dng ca OrientedShape3D..........................................533
V d s dng OrientedShape3D........................................................................534
Hot nh mc chi tit (Level Of Detail Animations)......................................... 536
S dng i tng DistanceLOD....................................................................... 537
Cc li thng gp khi s dng LOD ............................................................538
V d s dng DistanceLOD.............................................................................. 538
Giao din lp trnh ng dng DistanceLOD API............................................... 545
Morph .................................................................................................................546
S dng i tng Morph ..................................................................................547
V d s dng Morph .........................................................................................548
Giao din lp trnh ng dng Morph API..........................................................554
Giao din GeometryUpdater...................................................................................555
S dng GeometryUpdater................................................................................. 556
Chng trnh v d h thng phn t i phun nc s dng GeometryUpdater
............................................................................................................................ 557

Li ni u
S pht trin ca khoa hc, k thut, ngh thut, kinh doanh, v
cng ngh lun lun ph thuc vo kh nng truyn t thng tin ca
chng ta, hoc thng qua cc bit d liu lu tr trong microchip hoc
thng qua giao tip bng ting ni. Cu chm ngn t xa xa mt hnh
nh c gi tr hn c vn li" hay "trm nghe khng bng mt thy" cho
thy ngha rt ln ca hnh nh trong vic chuyn ti thng tin. Hnh
nh bao gi cng c cm nhn nhanh v d dng hn, c bit l trong
trng hp bt ng v ngn ng. Do khng c g ngc nhin khi m
ngay t khi xut hin my tnh, cc nh nghin cu c gng s dng n
pht sinh cc nh trn mn hnh. Trong sut gn 50 nm pht trin ca
http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


my tnh, kh nng pht sinh hnh nh bng my tnh ca chng ta t
ti mc m by gi hu nh tt c cc my tnh u c kh nng
ha. ha my tnh l mt trong nhng lnh vc l th nht v pht trin
nhanh nht ca tin hc. Ngay t khi xut hin, ha my tnh c sc
li cun mnh lit, cun ht rt nhiu ngi nhiu lnh vc khc nhau
nh khoa hc, ngh thut, kinh doanh, qun l, ... Tnh hp dn v a dng
ca ha my tnh c th c minh ha rt trc quan thng qua vic
kho st cc ng dng ca n.
Ngy nay, ha my tnh c s dng trong rt nhiu lnh vc
khc nhau nh cng nghip, thng mi, qun l, gio dc, gii tr, S
lng cc chng trnh ha ng dng tht khng l v pht trin lin
tc.Trong lnh vc cng nghip,CAD(computer-aided design) c s
dng hu ht trong vic thit k cc cao c, t, my bay, tu thy, tu v
tr, my tnh,Trong lnh vc gii tr,ngh thut, ha my tnh gip ta
to ra cc chng trnh tr chi,cc k xo in nh cho cc nh lm
phim,hay ngay chnh giao din ha lm nng cao kh nng giao tip
gia ngi v my tnh.
c th lm c nhng ng dng ha hu ch cho cuc
sng,trc ht chng ta cn phi c mt nn tng vng chc v lp trnh
ha.C rt nhiu ngn ng h tr lp trnh ha my tnh,mi ngn
ng c xy dng trn nhng th vin ha ring,c nhng th mnh
ring.V khi ni v lp trnh ha,chng ta khng th khng ni n
ngn ng Java,mt ngn ng rt mnh trong lnh vc ny.Vi mc ch
nghin cu,tm hiu v mang n cho nhng ai mun tm hiu v lp trnh
ha mt ti liu thit thc,nhm chng em chn ti lm tutorial
v lp trnh ha trn nn tng ngn ng lp trnh Java,da trn cc ti
liu training trn mng ca hng Sun.V l ln u lm ti liu tham kho

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


nn chng em khng trnh khi sai st.Chng em mong thy xem xt v
gp cho ti liu ny.Chng em chn thnh cm n.

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D

Phn 1
Lp trnh ha vi Java 2D

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D

Chng 1
Tng quan v Java 2D API

Java 2D API tng cng v kh nng ho, vn bn v nh ca


Abstract Windowing Toolkit (AWT), gip pht trin v giao din ngi
s dng v ng dng v JAVA trong mt s lnh vc mi.Cng vi kh
nng mnh v ho ,phng ch v nh trong cc API, th Java 2D API
cn h tr nhng thuc tnh v thnh phn mu sc c nng cao, v
thnh cng trong vic biu din cc b mt hnh hc tu v mt kiu t
trt chun cho my in v thit b hin th. Java 2D API cng cho php to
ra cc th vin ho m rng,nh cc th vin ca CAD-CAM v cc
th vin to hiu ng c bit cho nh v ho, cng nh vic to ra cc
b lc c/vit file nh v ho.Khi c s dng kt hp vi Java
Media Framework Java Media APIs khc ,th Java 2D APIs c th c
s dng to ra v hin th hin thc o v cc dng a phng tin
khc. Java Animation v Java Media Framework APIs da trn Java 2D
API h tr vic t trt(rendering).
1.1

Enhanced Graphics, Text, and imaging


Nu cc phin bn trc ca AWT ch cung cp cc gi t

trt(rendering) n gin ch ph hp cho vic rendering cc trang HTML


n gin,m khng p ng cho cc dng ho,vn bn v nh phc

http://tailieuhay.com

10

Lp trnh ha trn Java 2D v 3D


tp. Th Java 2D API cung cp gi t trt y cc tnh nng bng
cch m rng AWT h tr cho ho v cc thao tc rendering. V d
nh thng qua cc lp ho cho php v hnh ch nht,hnh val,v cc
a gic. ho 2D tng cng v khi nim ca php t trt hnh hc
bng cch cung cp mt c ch cho php rendering o ca bt k b mt
hnh hc no.Tng t nh vy vi Java 2D API bn c th v cc dng
ng vi bt k rng v dng hnh hc no.
Dng hnh hc c cung cp thng qua cc phn thc thi
implementations ca Shape interface trong Graphic class, nh hnh ch
nht 2D v Elip 2D. Cc ng cong v hnh cung cng thuc phn
implementations ca Shape. Cc kiu v v t cng c cung cp thng
qua phn thc thi implementations ca giao tip Paint v Stroke
interfaces, v d BasicStroke, GradientPaint, TexturePaint,v Color.
AffineTransform nh ngha cc php bin i trong to 2 chiu,
gm c php ly t l,php chuyn i to ,php quay v php xn ct.
Khung nhn c nh ngha bi cc phng thc ging nhau ca lp
Shape m chng c dng nh ngha cc khung nhn chung,v d
nh Rectangle2D v GeneralPath.
Thnh phn mu sc c cung cp bi cc phng thc ca lp
Composite, v d AlphaComposite.
Mt kiu Font ch th c nh ngha bi cc collection ca Glyphs.
1.2

Rendering Model
Kiu t trt ha n gin khng c g thay i khi thm vo Java

2D APIs. t trt ha th phi thit lp cc thng s v ha v


gi phng thc ca i tng Graphics.
Trong Java 2D API, lp Graphics2D m rng lp Graphics h tr
thm nhiu thuc tnh ha v cung cp thm cc phng thc cho qu
trnh t trt.

http://tailieuhay.com

11

Lp trnh ha trn Java 2D v 3D


The Java 2D API t ng cn chnh nhng sai khc trong cc thit b t
trt v cung cp mt kiu t trt thng nht cho cc dng thit b khc
nhau. Ti tng ng dng,qu trnh t trt l ging nhau cho d thit b
cui l mn hnh hay my in.
Vi Java 2 SDK, version 1.3 , Java 2D API cn h trp cho cc mi
trng a mn hnh (multi-screen environments).
1.2.1 Coordinate Systems
Java 2D API bao hm hai h ta :
1. Khng gian ngi s dng l h ta logic v c lp vi thit b.
Cc ng dng thng s dng h ta ny,tt c cc dng hnh
hc c t trt bng Java 2D u c xc nh trong h ta
ny.
2. Khng gian thit b l h ta ph thuc thit b,ng vi tng loi
thit b cui m c h to khc nhau.
Bng ng dng my o mt ca s hin th c th m rng thm nhiu
thit b hin th vy l to nn mi trng a mn hin th, h ta ca
thit b ny c s dng lm h ta ca my o s c ly lm h
ta cho tt c cc mn hi th cn li.
H thng Java 2D s t ng thc hin nhng php chuyn i cn
thit gia khng gian ngi s dng v khng gian thit b . Mc d h
ta cho mn hnh rt khc i vi h ta cho my in nhng s khc
bit ny trong sut i vi cc ng dng.
1.2.1.1 User Space
H ta ny c ch ra trong hnh 1-1.

(0,0)

http://tailieuhay.com

12

Lp trnh ha trn Java 2D v 3D

y
Figure 1-1

User Space Coordinate System

Khng gian ngi s dng biu din mt cch tru tng ng nht
cho cc h to ca tt c cc thit b c lin quan.Cn khng gian thit
b cho mt thit b c th c th c cng gc ta v hng ca cc trc
hoc l c th khng.Ngoi ra cc ta ca khng gian ngi s dng
c th chuyn i mt cch t ng vo khng gian thit b ph hp mi
khi mt i tng ha c t trt,thng th cc chng trnh driver
ca cc thit b thc hin iu ny.
1.2.1.2 Device Space
Java 2D API nh ngha 3 mc thng tin cu hnh h tr cho vic
chuyn i t khng gian ngi s dng sang khng gian thit b. Thng
tin ny c cha trong 3 lp :
GraphicsEnvironment
GraphicsDevice
GraphicsConfiguration
Hai trong s chng s biu din tt c cc thng tin cn thit cho vic
xc nh thit bi t trt v cho vic chuyn i ta t khng gian ngi

http://tailieuhay.com

13

Lp trnh ha trn Java 2D v 3D


s dng sang khng gian thit b. ng dng c th truy cp thng tin ny
nhng khng nht thit phi thc hin bt k php chuyn i no gia hai
h ta chuyn .
Lp GraphicsEnvironment m t tp cc thit b m c chp nhn bi
cc ng dng Java trong mt mi trng c th.Cc thit b s dng cho
qu trnh t trt gm c mn hnh , m in v cc b m nh.Lp
GraphicsEnvironment cng bao gm tp cc font ph hp trong mi
trng .
Lp GraphicsDevice m t thit b t trt nh mn hnh hoc my in.Mi
cu

hnh

ph

hp

ca

thit

biu

din

bi

lp

GraphicsConfiguration. V d,mt thit b hin th SVGA c th thc


hin trong mt s ch mu nh : 640x480x16 colors, 640x480x256
colors, and 800x600x256 colors.
Mn hnh SVGA c biu din bi mt i tng GraphicsDevice
v ng vi mi ch mu ca mn hnh SVGA s c biu din bi
mt

tng

GraphicsConfiguration.Mt

tng

kiu

GraphicsEnvironment c th bao gm 1 hay nhiu i tng


GraphicsDevices. Ngc li ,mi i tng GraphicsDevice c th c 1
hay nhiu i tng kiu GraphicsConfigurations.
1.2.2 Transforms
Java 2D API c mt ch chuyn ta thng nht. Tt c cc php
chuyn ta ,bao gm cc php chuyn t khng gian ngi s dng n
khng gian ca thit b,u c biu din bi i tng kiu
AffineTransform .AffineTransform nh ngha cc lut cho nhng thao
tc trn cc h ta bng cc ma trn(cc php bin i nh bng cc b
lc).
Cng c th thm i tng AffineTransform cho cc dng ha bng
cc php xoay ,ly t l ,chuyn i hoc ct ta cho mt mt hnh hc

http://tailieuhay.com

14

Lp trnh ha trn Java 2D v 3D


,vn bn hay nh khi chng c t trt.Cc php bin i c thm vo
ny s c ng dng cho cc i tng ha c t trt trong trng
hp php bin i ny c thc hin khi chuyn t ta khng gian
ngi s dng sang khng gian ca thit b.
1.2.3 Fonts
Mt xu thng c hiu l tp cc k t tao thnh.Khi mt xu
c v, hnh dng ca n s c xc nh bi font m chng ta
chn.Tuy nhin, hnh dng m font s dng hin th ln mn hnh xu
khng phi lc no cng ging vi hnh dng ca mi k t ring bit.
v d s kt hp ca 2 hay nhiu k t thng c thay th bi mt hnh
dng k hiu no c gi l ligature.
Cc hnh dng m mt phng ch s dng biu din cc k t trong
mt xu c gi l glyphs. Mt font c th biu din mt k t nh ch
thng hoc ch hoa bng cch s dng nhiu glyphs, hoc biu din cc
lin kt k t nh fi ch biu din bi 1 glyph. Trong Java 2D API, mt
glyph ch n gin l mt dng (Shape) m c th oc thao tc v t trt
mt cch ging nhau nh bt k vi cc dng khc Shape.
Mt font c th c xem nh tp cc glyph. Mt font n c th c
rt nhiu kiu khc nhau nh ki ch m ,va,nghing ,gtchtt c
cc kiu ch ny trong mt font c cng thit k in v c th v nh
chng l cc thnh vin trong cng mt gia nh. Hay ni cch khc ,mt
nhm cc glyphs vi cc kiu ring bit to nn mt dng font,nhm cc
dng font tao nn mt h font ,h cc font to nn mt tp font v tp ny
c sn trong mt i tng GraphicsEnvironment c th no .
Trong Java 2D API, cc font c xc nh bi mt tn m m t mt
dng font ring bit no ,v d Helvetica Bold. Nhng iu ny li khc
vi fn mm JDK 1.1 ,cc font c m t bng cc tn lgc m nh x
trn cc dng font khc nhau f thuc liu cc dng font c sn trong

http://tailieuhay.com

15

Lp trnh ha trn Java 2D v 3D


mi trng ang xt khng.Nh tng thch cho iu ; the Java 2D
API h tr vic xc nh cc font bng tn lgc cng nh bng tn dng
font.
S dng Java 2D API, c th son tho v t rt cc xu bao gm
nhiu font thuc cc h font,hnh dng,kich thc, v thm ch c ngn
ng khc nhau. Cc dng ca vn bn c lu ring bit mt cch lgc
vi s sp xp cc vn bn.Cc i tng Font c s dng m t cc
hnh dng hin th ca font, v thng tin sp xp c lu trong i tng
TextLayout v TextAttributeSet . Vic lu gi cc font v thng tin sp
xp ring bit nhau lm d dng hn cho vic s dng cng font ch
nhng khc v cu hnh sp xp.
1.2.4 Images
nh c to nn t tp cc pixel . Mt im nh hay mt pixel s
nh ngha th hin ca mt nh ti vng quan st ca mn hnh . Mt
mng hai chiu ca im nh c gi l mt raster.
Th hin ca mt im nh c th c nh ngha mt cch trc tip
hoc nh l mt ch s trong bng mu dnh cho nh.
Trong nh mu a mu (hn 256 mu) cc im nh thng trc tip
biu din lun mu sc v cc c trng khc cho mi vng hin th ca
nh. Nhng nh nh vy s c kch thc ln hn nh mu m hin th
bng ch s(indexed-color images), nhng chng nhn s tht hn .
Trong nh mu hin th bng ch s (indexed-color image), nhng
mu sc ca nh s b gii hn bi bng mu , v thng s lng mu
trong bng mu s t hn sovi nh tht. Tuy nhin cc nh khi c lu
nh tp cc ch s mu s lm cho kch thc nh nh i.nh dng ny
thng c dng cho nhng nh c 256 mu.
nh trong Java 2D API c hai thnh phn chnh
D liu nh th(cc im nh)

http://tailieuhay.com

16

Lp trnh ha trn Java 2D v 3D


Nhng thng tin cn thit cho qu trnh chuyn i cc im nh
Cc lut cho vic chuyn i cc im nh c lu bi i tng
ColorModel. i vi mt im nh hin th cn phi i km vi mt
kiu mu sc.
Mt di mu l mt thnh phn ca khng gian mu sc dnh cho
nh.V d cc thnh phn mu l cc da mu trong nh RGB . Mt
im nh trong nh dng mu trc tip c th c hiu nh mt tp .
Gi java.awt.image bao gm mt s phng thc ColorModel cho
cc biu din thnh phn im nh.
Mt i tng ColorSpace cha cc lut sao cho tp cc gi tr
mu tng ng vi mt mu sc nht nh .Cc phng thc ca
ColorSpace trong java.awt.color s biu din cc khng gian mu sc
thng dng, gm c khng gian mu RGB v gray scale. Lu rng mt
khng gian mu khng phi l mt tp cc mu sc m tp ny nh ngh
cc lut c th chuyn i cc gi tr mu thnh cc mu tng ng
thng dch.
Vic chia khng gian mu sc thnh cc ch mu s to nn s linh
hot hn trong vic biu din v chuyn i t php biu din mu ny
sang mt php biu din mu khc.
1.2.5 Fills and Strokes
Vi Java 2D API, c th t cc hnh bng cch s dng cc kiu but
khc nhau v cc kiu t khc nhau. V cc ch xt cho cng cng c
biu din bng tp cc glyph, nn cc xu k t cng c th c v v t.
Cc kiu bt c nh ngha bng cc i tng kiu Stroke.C th
xc nh rng cng nh cc nt cho cc ng thng v ng cong.
Cc kiu t c nh ngha bi cc phng thc thuc i tng
Paint. Lp Color c sn trong cc phin bn trc ca AWT y l mt

http://tailieuhay.com

17

Lp trnh ha trn Java 2D v 3D


dng n gin ca i tng Paint c s dng nh ngha t mu
trn (solid color). Java 2D API cung cp thm hai phng thc mi cho
Paint l TexturePaint v GradientPaint. TexturePaint nh ngha kiu
t dng mu nh n gin(simple image fragment ) m c lp nh
nhau. GradientPaint nh ngha mt kiu t mu loang(gradient) gia
hai mu.
Trong Java 2D, rendering mt ng nt ca mt hnh v t hnh
bng mt kiu no c thc hin hai thao tc ring bit:
S dng mt trong cc thut ton draw render cc ng nt
ca hnh s dng cc kiu bt c xc nh bi cc thuc tnh ca
Stroke v kiu t c xc nh bi thuc tnh Paint.
S dng phng thc fill t cc vng trong ca hnh vi kiu
t dc xc nh.
Khi mt chui k t c render,cc thuc tnh hin ti ca Paint
c p dng cho cc glyphs to nn chui .Lu thc cht i tng
drawString s t cc glyphs m c render. v cc nt ca cc glyphs
trong chui k t cn phi chn cc ng nt v render chng nh i
vi cc hnh s dng phng thc draw .
1.2.6 Composites
Khi render mt i tng m chng ln mt i tng tn tai trc
cn phi xc nh lm th no kt hp mu ca cc i tung. Java
2D API c cc lut cho vic kt hp mu trong trng hp ny trong i
tng Composite.
Tuy nhin c mt s vn trong cch tip cn ny:
S tht kh trong trng hp nu mu Red v mu Blue c thm
vo hy khng c thm vo.
Vic kt hp lgc s khng c h tr trong trng hp ccmu
thuc cc khng gian mu khc nhau.

http://tailieuhay.com

18

Lp trnh ha trn Java 2D v 3D


S kt hp s khng c ngha trong trng hp mu c biu
din bng cc gia tr mu th khi s kt hp hai im nh l s kt hp
ca hai gi tr mu.
Java 2D API trnh cc loi ny bng cch thc hin cc lut pha trn
alpha m s a vo cc thng tin v kiu biu din im nh mi khi
thc hin kt hp mu. Mt i tng AlphaComposite bao gm cc
kiu v mu sc ca cc mu sc ca ngun v ch.

Backward Compatibility and Platform independence


Nh ni,Java 2D API c s tng thch i vi phn mm JDK
1.1 . V Java 2D API l mt kin trc chnh v vy m cc ng dng
ca n c tnh c lp v mi trng
1.3.1 Backward Compatibility
tng thch vi cc tnh nng tn ti trong ha JDK .Java
2D API tng cng thm mt s tnh nng cho AWT bng cch thm cc
phng thc mi vo cc lp tn ti,m rng thm cc lp tn ti
v ng thi thm cc lp mi v cc interface mi m khng nh hng
ti cc API hp l.
V d,C rt nhiu tnh nng caJava 2D API c bt ngun t vic
m rng cc thuc tnh v ha trong Graphics2D. cung cp cc
thuc tnh m rng v ha trong bao gm c yu t tng thch vi
cc phn mm ha khc, Graphics2D m rng cc lp Graphics
trong JDK1.1.
paint
paintAll
update
print

http://tailieuhay.com

19

Lp trnh ha trn Java 2D v 3D


printAll
getGraphics
JDK 1.1 applet thng dch ng cnh ha m c a vo nh l
mt th hin ca lp Graphics. c th truy nhp nhng chc nng
c thc thi trong i tng Graphics2D, th mt applet tng thch vi
Java 2D API s a ng cnh ha ti i tng Graphics2D:

public void Paint (Graphics g) {


Graphics2D g2 = (Graphics2D) g;
...
...
g2.setTransform (t);
}

Trong mt vi trng hp , hay ng hn l m rng mt lp tha k,


Java 2D API khi quat ha n. C hai k thut c s dng khi
quat ha cc lp k tha:
Mt hay nhiu lp cha c chn vo biu phn cp ca lp , v
cc lp tha k c cp nht m rng cc lp cha mi. K thut ny
c s dng thm cc phng thc v cc d liu th hin cho lp k
tha.
Mt hay nhiu trin khai cc interface c thm vo lp k tha .
K thut ny c s dng thm cc phng thc o tng qut(general
abstract methods) cho lp k tha .
V d, Java 2D API khi qut ha lp AWT Rectangle bng cch s
dng c hai k thut S phn cp cho hnh ch nht ging nh:

http://tailieuhay.com

20

Lp trnh ha trn Java 2D v 3D

Trong phn mm JDK 1.1 , Rectangle l mt i tung m rng n


gin. By gi m rng cc lp Rectangle2D mi v trin khai c hai
interface Shape v Serializable. Hai lp cha c thm vo phn cp ca
lp Rectangle l RectangularShape v Rectangle2D. Cc Applet c
vit cho phn mm JDK 1.1 khng truy cp c cc lp mi v cc phn
trin khai ca cc interface,nhng iu ny khng nh hng bi v lp
Rectangle vn bao gm cc phng thc v cc thnh phn c trong cc
phin bn trc.
1.3.2 Platform independence
C kh nng php trin cc ng dng c lp vi mi trng. Java 2D
API khng m ng v khng gian mu sc hay l ch mu ca thit
b rendering v Java 2D API c bt k nh dng nh c th no.
V ch c lp v font khi cc font c xy dng sn(c
cung cp nh l mt phn ca phn mm JDK ),hay l khi chng c
gi to bng lp trnh. Java 2D API khng h tr cc font xy dng sn
v cc font c to nn nh chng trnh to font nhng n li h tr
vic nh ngha cc font thng qua tp cc glyph ca n. Mi glyph li c
th c nh ngha bi Shape m bao gm cc on ng thng v cc
ng cong. C rt nhiu kiu font vi nhiu hnh dang v kich thc
c bt ngun t tp cc glyph n l.
1.4

The Java 2D API Packages


Cc lp Java 2D API c t chc trong cc package sau:

http://tailieuhay.com

21

Lp trnh ha trn Java 2D v 3D


java.awt
java.awt.geom
java.awt.font
java.awt.color
java.awt.image
java.awt.image.renderable
java.awt.print
Package java.awt bao gm cc lp Java 2D API cp trn v
cc interface tn ti trc v cc interface ft trin thm. (R dng
l khng phi tt c cc lp trong java.awt l cc lp ca Java 2D )

Package java.awt.geom bao gm cc classe v interface c lin quan n


vic nh ngha cc dng hnh hc nguyn thy:

http://tailieuhay.com

22

Lp trnh ha trn Java 2D v 3D


C nhiu dng hnh hc nguyn thy ng vi

cc phn

implementation. Float v Double


iu ny cho php cc implementation c th hai mc chnh xc l
gi tr single v double.
Gi java.awt.font cha cc lp v cc giao din c s dng cho
vic b tr vn bn v nh ngha cc kiu font:

Gi java.awt.color cha cc lp v cc giao din cho vic nh ngha


cc khng gian mu v cc mu mu:

Cc gi java.awt.image v java.awt.image.renderable cha cc lp


v cc giao din cho vic nh ngha v to bng ca nh.

http://tailieuhay.com

23

Lp trnh ha trn Java 2D v 3D

Package java.awt.image tn ti trong cc version trc ca AWT.


Java 2D API tng cng thm cc lp nh k tha t AWT sau y:
ColorModel
DirectColorModel
indexColorModel
Cc lp ch mu sc ny vn tn ti trong package
java.awt.image package cho s tng thch . m bo tnh thng
nht,cc lp cho ch mu mi cng c trong package java.awt.image .
Package java.awt.print bao gm cc lp v cc interface cho php in
tt c cc dng vn bn , ha v nh da trn cng ngh Java 2D.

http://tailieuhay.com

24

Lp trnh ha trn Java 2D v 3D

Chng 2:
Rendering with Graphics2D

Graphics2D m rng java.awt.Graphics to ra iu khin tinh vi


hn v biu din cc hnh ,vn bn v nh .Qu trnh t trt Java 2D
c iu khin thng qua i tng Graphics2D v cc thuc tnh
trng thi ca n.
Cc thuc tnh tng thi Graphics2D , nh l cc kiu ng thng v
cc php bin i,c p dng cho cc i tng ha khi chng c
t trt. Tp cc thuc tnh trng thi kt hp vi Graphics2D c tham
chiu ti nh l Graphics2DContext.
t trt vn bn ,hnh v nh,cn thit lp Graphics2D context v sau
gi mt trong cc phng thc t trt Graphics2D nh draw hay fill.

http://tailieuhay.com

25

Lp trnh ha trn Java 2D v 3D


2.1

Cc lp v giao din.
Bng cho sau y s lit k cc giao din v lp trong vic kt hp

vi ng cnh Graphics2D context,bao gm cc lp biu din cc thuc


tnh trng thi. Hu ht cc lp ny l mt phn ca package java.awt.
Cc giao din v m t chng:
Giao din
Composite

M t
nh ngha cc phng thc cho vic kt hp mt
i tng v gc vi cng ha c nh du.

CompositeContex

c thc thi bi phng thc AlphaComposite.


nh ngha mt mi trng ti u v c lp cho

vic thc hin cc php kt hp .Vic thc hin cc


lut kt hp ty chn c thc hin bit ngi lp

Paint

trnh.
M rng: Transparency
nh ngha cc mu sc cho vic t hoc v. c
thc thi bi i tng

PaintContext

Color,Gradient-Paint v

TexturePaint.
nh ngha mt mi trng ti u v c lp cho
vic v.Cc thao tc v c ty chn bi ngi lp

Stroke

trnh.
To ra mt i tng Shape m cc ng vin ca
n oc to bng.c thc thi bi phng thc
BasicStroke.

Cc lp v m t s lc v chng:
Lp
AffineTransform

M t
Miu t mt php bin i 2D affine ,m thc hin

(java.awt.geom)

vic nh x tuyn tnh t ta 2D ny n ta


2D khc.

http://tailieuhay.com

26

Lp trnh ha trn Java 2D v 3D


AlphaComposite

Thc thi : Composite


Thc hin cc lut kt hp cc gi tr alpha c bn cho

BasicStroke

cc i tng Shape,Text v Image.


Thc thi :Stroke
nh ngha kiu bt v( pen style) c p dng
cho cc ng bao ca i tng Shape.

Color

Thc thi: Paint


nh ngha mt kiu t mu ng nht cho i tng

GradientPaint

Shape.
Thc thi: Paint
nh ngha mt mu t mu loang tuyn tnh cho i
tng Shape.Mu ny s thay i t mu C1 (ti im

Graphics2D

P1) ti mu C2(tai im P2).


M rng: Graphics
Lp c s cho qu trnh to bng trong khng gian

TexturePaint

2D.M rng lp gc java.awt.Graphics


Thc thi: Paint
nh ngha mt kiu t theo mu cho i tng
Shape.Mu

to

ra

tu

tng

BufferedImage.

2.2

Rendering Concepts
t trt mt i tng ha s dng Java 2D API, cn thit lp

ng cnh Graphics2DContext v s dng mt trong cc phng thc t


trt Graphics2D i vi i tng.
C th thay i cc thuc tnh trng thi m to nn ng cnh
Graphics2D nh :
Thay i rng ca nt bt
Thay i cho cc nt bt kt hp vi nhau nh th no.

http://tailieuhay.com

27

Lp trnh ha trn Java 2D v 3D


Thit lp mt khung ct gii hn vng c t trt.
Chuyn i ta ,xoay,ly t l hoc ct c i tng khi
chng c render.
nh ngha cc mu v cc kiu t cc hnh.
Xc nh cc i tng a ha(multiple graphics objects) cn
phi c to ra nh th no.
Graphics2D nh ngha mt s phng thc thm v thay i cc
thuc tnh trong ng cnh ha . Hu ht nhng phng thc ny l
nhng i tng biu din cc thuc tnh ring bit nh i tng Paint
hay Stroke .
Ng cnh Graphics2D ct gi cc tham chiu ti cc i tng thuc
tnh . Nu bin i mt i tng thuc tnh m l mt phn ca ng cnh
Graphics2D ,th cn phi gi phng thc thit lp ph hp khai bo
ng cnh.Thay i mt i tng trong qu trnh thao tc render s gy
nn mt s biu hin bt thng thng v khng n nh .
2.2.1 Rendering Process
Khi mt i tng ha c render, thng tin v hnh hc ,nh v
thuc tnh c kt hp tnh ton nhng gi tr im nh cn phi thay
i trn mn hin th.
Qu trnh render cho mt i tng Shape c th c chia thnh 4
bc :
1. Nu i tng Shape c ta nt ,i tng Stroke quy vo ng
cnh Graphics2D c s dng to nn mt i tng Shape mi
bao quanh nhng ng nt .
2. Ta ca ng thuc i tng Shape c bin i t khng
gian ngi s dng sang khng gian ca thit b theo cc thuc tnh bin
i trong ng cng ha Graphics2D .

http://tailieuhay.com

28

Lp trnh ha trn Java 2D v 3D


3. ng (path)ca i tng Shape c ct b bng cch s dng
cc thuc tnh ct trong ng cnh Graphics2D.
4. Phn cn li ca i tng Shape c t bng cch s dng
thuc tnh ca i tng Paint v Composite thuc tnh trong ng cnh
ca i tng Graphics2D.
To bng (Rendering) vn bn tng ng vi vic to bng cc i
tng thuc kiu Shape, khi vn bn c to bng vi tng glyph v
mi glyph l mt i tng thuc kiu Shape. Ch c iu khc l Java
2D API phi xc nh i tng Font no s dng cho vn bn v ly
kiu glyph tng ng t i tng Font trc khi to bng.
i vi nh th c s khc bit , s chuyn i v thc hin cc php
ct b vi hp xc nh bin nh( images bounding box). Thng tin v
mu sc ly t chnh nh v ngun alpha(alpha channel) c s dng
kt hp vi thuc tnh hin ti ca Composite khi cc im nh c
hp trn b mt to bng.
2.2.2 Controlling Rendering Quality
Java 2D API a ra cc la chn cho php ngi s dng to bng
nhanh hay to bng vi cht lng cao. Nhng tham chiu ca ngi su
dng c xc nh nh l cc ch dn thng qua thuc tnh ca i tng
RenderingHints trong ng cnh ca i tng Graphics2D . Khng phi
tt c cc mi trng u h tr vic thay i ch to bng v vy xc
nh cc ch dn cho qu trnh to bng s khng c m bo chng s
c s dng hay khng .
Lp RenderingHints h tr c kiu ch dn sau y:
Alpha interpolation - c th thit lp ty chn default, quality,
speed.
Antialiasing - c th thit lp ty chn default :on hoc off.

http://tailieuhay.com

29

Lp trnh ha trn Java 2D v 3D


Color Rendering - c th thit lp ty chn default, quality, hoc
speed.
Dithering - c th thit lp ty chn default:disable, enable.
Fractional Metrics - c th thit lp ty chn default, on, hoc off.
Interpolation- c th thit lp ty chn nearest-neighbor, bilinear,
hoc bicubic.
Rendering - c th thit lp ty chn default, quality, hoc speed.
Text antialiasing - c th thit lp ty chn default: on hoc off.
thit lp hoc thay i cc thuc tnh RenderingHints trong ng
cnh ca i tng Graphics2D th gi phng thc setRenderingHints.
Khi mt ch dn c thit lp mc nh ,mi trng to bng mc nh
s c s dng .
K thut lm trn(Antialiasing)
Khi cc thc th c s c to bng trn thit b hin th ,cc
bin(cnh) ca chng c th khng trn hay nhm l do thuc tnh
aliasing. Cc ng cung v ng cho c dng nhm bi v chng
c xp x bi cc im nh m gn nht v hn dng vi chng . y l
iu m chng ta c th nhn thy vi cc thit b trc y vi cc cnh
nhm xut hin tri ngc hon ton vi cc cnh trn ca gn nm
ngang hay thng ng.
Antialiasing l mt k thut c s dng to bng cc i tng
vi cc cnh trn hn. Thay v s dng cc im nh gn ging vi cc
ng cho v ng cong ,tng mt cc im nh bao quanh ti cc
vng c to bng. iu ny lm cho cch cnh trn hn v tri rng s
chuyn tip bt/tt vi cc pixel a im(multi pixel) . Tuy nhin k thut
antialiasing i hi nhiu v ti nguyn my tnh v lm tng thi gian to
bng.

http://tailieuhay.com

30

Lp trnh ha trn Java 2D v 3D

2.2.3 Stroke Attributes


To nt mt i tng thuc kiu Shape nh i tng GeneralPath
tng nng vi vic s dng mt bt lgc theo cc on ca i tng
GeneralPath. Thuc tnh ca Graphics2DStroke nh ngha cc tnh
cht ca nt bt v.
i tng BasicStroke c s dng nh ngha cc thuc tnh
ng nt cho mt ng cnh ca Graphics2D. BasicStroke inh ngha
cc thuc tnh nh rng cu nt v ,mu t
thit lp hay thay i cc thuc tnh Stroke trong ng cnh ca
Graphics2D th gi phng thc setStroke.
Nh v du,nh u tin trong hnh 2-3 s dng miter join-style,v hnh
th hai s dng kiu round join-style, a round endcap style, and a dashing
pattern.

http://tailieuhay.com

31

Lp trnh ha trn Java 2D v 3D


Cc phng thc to bng Graphics2D c s dng thuc tnh ca
Stroke v nh drawArc, drawLine, drawOval, drawPolygon,
drawPolyline, drawRect, v
drawRoundRect.Khi mt trong cc phng thc c gi th cc ng
nt ca i tng Shape xc nh s c to bng. Thuc tnh
Stroke nh ngha cc tnh cht ca ng thng v cc thuc tnh ca
Paint nh ngha mu sc hay mu ca nt bt. V d phng thc
draw(myRectangle) c gi:
1. Thuc tnh ca Stroke s quy nh cho ng nt ca hnh ch nht .
2. Cc ng nt ny s c bin i thnh mt i tng kiu Shape
.
3. i tng Paint is c p dngcc im nh thuc min gii hn
bi ng

bao ca i tng Shape.

Qu trnh x l ny c minh ho trong hnh 2-4:

2.2.4 Fill Attributes


Thuc tnh t mu trong ng cnh Graphics2D c biu din bi
i tng Paint. C th thm mt i tng vo ng cnh ca i tng
Graphics2D (Graphics2D context) bng cch gi phng thc setPaint.
Khi mt i tng Shape hay l cc glyph c v (bi cc phng thc
Graphics2D.draw, Graphics2D.drawString),
http://tailieuhay.com

32

Lp trnh ha trn Java 2D v 3D


i tng Paint ny s c p dng ti tt c cc pixel nm trong
i tng Shape m biu din cc ng nt bao quanh i tng . Khi
mt i tng Shape c t mu (Graphics2D.fill), i tng Paint
c p dng ti tt c cc im nh nm trong ng bao ca i tng
Shape.
Cc kiu t mu ng nht n gin (solid color) c khi to bi
phng thc setColor.Color l phn trin khai (implementation) n gin
nht ca giao tip Paint (Paint interface).
t cc hnh vi cc kiu t phc tp hn nh l t loang(gradient)
v t dt ( texture) bng cch s dng cc lp trong Java 2D Paint l
GradientPaint v TexturePaint. Cc lp ny s loi b cc cng vic
tiu tn thi gian to cc kiu t phc tp bng cch s dng cc kiu
t mu ng nht n gin .

Khi gi phong thc fill to bng mt i tng Shape,th h


thng s:
1. Xc nh cc im nh no th hin i tng .
2. Xc nh mu cho mi im nh t i tng Paint.
3. Chuyn cc mu ny ti gi tr im nh tng ng cho cc
thit b hin th.
4. Ghi cc im nh ra thit b hin th .

http://tailieuhay.com

33

Lp trnh ha trn Java 2D v 3D


Qu trnh x l theo phin
t chc hp l qu trnh x l cc im nh , Java 2D API t chc
chng theo tng phin.
Mi phin c th l tp cc im nh k nhau trn mt ng qut
hay l mt khi (block)cc im nh. Qu trnh x l theo phin c
thc hin theo 2 bc:
1. Phng thc createContext ca i tng paint c gi to
mt i tng PaintContext. i tng PaintContext ny s lu thng
tin ng cnh v thao tc to bng hin thi v nhng thng tin cn thit
to ra cc mu. Phng thc createContext method is passed the
bounding boxes of thegraphics object being filled in user space and in
device space,i tng ColorModel l ni to cc mu sc,v thc
hin qu trnh chuyn i nh x t khng gian ngi s dng vo
khng gian ca thit b. i tng ColorModel xem nh mt ch dn
khng phi tt c cc i tng Paint c th h tr mt i tng
ColorModel bt k.
2. Phng thc getColorModel c gi nhn gi tr ca i tng
ColorModel cho mu v t i tng PaintContext.
Phng thc getRaster sau c gi lp li nhiu ln nhn gi
tr ca i tng Raster m bao gm d liu mu tht cho mi phin.
Thng tin ny passed to the next stage in the rendering pipeline, m v
cc mu c to bng cch s dng i tng Composite hin thi .
2.2.5 Clipping Paths
Mt khung nhn s xc nh phn ca i tng Shape hay Image
cn c to bng . Khi mt khung nhn l mt phn ca ng cnh ca
i tng Graphics2D, th ch nhng phn ca i tng Shape hay
image nm trong khung nhn mi c to bng.

http://tailieuhay.com

34

Lp trnh ha trn Java 2D v 3D


thm khung nhn cho ng cnh ca Graphics2D th go phng
thc setClip. Bt k i tng Shape cng c th c s dng nh
ngha mt khung nhn.
thnh i khung nhn cn phi s dng phng thc setClip
xc nh mt khung nhn mi hay l gi phng thc clip thay i
khung nhn cho phn giao nhau gia khung nhn c v mt i tng
Shape.
2.2.6 Transformations
Ng cnh ca i tng Graphics2D bao gm mt php bin i m
c s dng bin i nhng i tng t khng gian ngi s dng
vo khng gian thit b trong qu trnh to bng. thc hin cc php
bin i khc nh php quay hay ly t l th cn phi thm cc php bin
i khc vo ng cnh ca i tng.Cc php bin i c thm vo
ny s tr thnh mt phn ca ng bin i (pipeline of transformations)
m c pdng trong sut qua trnh to bng.
Graphics2D cung cp mt vi cch khc thay i php bin i
trong ng cnh ca i tng Graphics2D . Cch n gin nht l gi
mt trong cc phng thc bin i trong i tng Graphics2D nh :
rotate, scale, shear, hay translate. Xc nh cc tnh cht ca php bin
i p dng trong sut qa trnh to bng v Graphics2D t ng to
ra cc thay i ph hp.
Cng c th ni mt php bin i AffineTransform vi php bin
i Graphics2D hin ti. Php bin i AffineTransform thc hin cc
php bin i cho ng nh php dch,t l ,quay v ct b vi tp cc
hnh c bn.
Khi mt php bin i c ni vo php bin i tn ti trc
th php bin i sau cng s c xc nh nh l php bin i c

http://tailieuhay.com

35

Lp trnh ha trn Java 2D v 3D


thc hin u tin. tip ni mt php bin i vi php bin i hin
ti , you pass an AffineTransform to Graphics2D.transform.
Lp Graphics2D cng bao gm phng thc setTransform , nhng
phng thc ny khng bao gi c s dng ni vi cc php bin
i ta khc ca php bin i ang tn ti. Phng thc setTransform
s ghi ln php bin i hin thi ca i tng Graphics2D, nhng
phng thc ny cn cho mt s mc ch khc nh:
p dng php bin i t l iu chnh cho my in.
V mt i tng JComponent

non-zero translation from its

parents origin
Phng to mt thnh phn d dng quan st.
Cc tnh hung khc m ngi cung cp i tng Graphics2D
mun chuyn i cho qu trnh to bng hiu qu .
Phng thc setTransform method c xem nh thit lp i
tng Graphics2D tr lai php bin i ban u sau qu trnh to bng
ha ,vn bn v nh c chuyn i:

Aff i n e T r a n s f o r m

aT

g2d . g e t T r a n s f o r m ( ) ;

g2d . t r a n s f o r m ( . . . ) ;
g2 d . d r a w ( . . . ) ;
g2d . s e t T r a n s f o r m ( a T ) ;

Graphics2D cng cung cp mt phin bn v drawimage m trong


i tng AffineTransform
c xem nh mt tham s . iu ny cho php p dng mt php
bin i cho i tng nh khi n c v m khng cn chnh sa
ng ng cu php bin i. nh ny c c v nh khi kt ni

http://tailieuhay.com

36

Lp trnh ha trn Java 2D v 3D


php bin it ny vi php bin it hin ti trong ng cnh ca
Graphics2D
Cc php bin i quan h(Affine Transforms)
Java 2D API cung cp mt lp bin i l AffineTransform.
AffineTransforms c s dng bin i vn bn ,hnh v cc nh
khi chng c to bng.
Cng c th ng dng cc php bin i cho i tng Font to ra
cc dn xut font mi(new font derivations).
Mt php bin i ng nht (affine transformation) thc hin mt php
bin i tuyn tnh trn tp ho c bn. N lun bin cc ng thng
thnh cc ng thng v cc ng thng song song thnh cc ng
thng song song,tuy nhin khong cch gia cc im v cc gc ca cc
ng thng khng song song c th thay i.
Cc php bin i c th kt hp to ra ng ng cc php bin
i mt cch hiu qu nhm p dng cho mt i tng no . S kt
hp ny xem nh l s mc ni. Khi mt php bin i c kt ni vi
mt php bin i ang tn ti nh vi AffineTransform.concatenate,
th php bin i cui cng c xc nh l php bin i u tin c
p dng . Mt php bin i cng c th c mc ni trc vi mt
php bin i ang tn ti . Trong trng hp ny th php bin i cui
cng s c thc hin cui cng . Php mc ni trc c c p
dng thc hin cc php bin i c lin quan vi khng gian thit b
thay v khng gian ngi s dng. V d c th s dng phng thc
AffineTransform.preConcatenate thc hin php chuyn i c lin
quan ti khng gian cc im nh..
2.2.6.1 Constructing an AffineTransform

http://tailieuhay.com

37

Lp trnh ha trn Java 2D v 3D


AffineTransform cung cp mt tp cc phng thc cho vic xy
dng cc i tng AffineTransform.
getTranslateinstance
getRotateinstance
getScaleinstance
getShearinstance
s dng cc phng thc ny cn phi xc nh cc tnh cht ca
php bin i m cn to ra v lp AffineTransform s to ra cc ma
trn chuyn i ph hp. Cng c th xy dng php bin i ng nht
mt cch trc tip m khng cn thng qua lp AffineTransform bng
cch xc nh cc thnh phn ca php bin i .
2.2.7 Composite Attributes
Khi hai i tng ha trng ln nhau th iu cn thit l phi xc
nh nhng mu no s c to bng cho cc im nh chng ln nhau.
V d nu mt hnh ch nht mu v mt hnh ch nht mu xanh
chng ln nhau th cc im nh s c mu hoc mu xanh hay l
s kt hp ca c hai mu. Mu ca nhng im nh trong vng chng
nhau s xc nh hnh ch nht no nm trn v b che khut nh th
no. Qu trnh x l xc nh mu no to bng cho cc im nh s
c chia s cho cc i tng chng (overlaping objects)c gi
compositing.
C hai interface to cc kiu kt hp c bn trong Java 2D l :
Composite v CompositeContext.
xc nh cc kiu kt hp s c s dng th cn phi thm vo
mt i tng AlphaComposite

cho ng cnh ca i tng

Graphics2D

phng

bng

cch

gi

thc

setComposite.

AlphaComposite,v mt trin khai(implementation)

ca interface

Composite , c h tr mt s kiu kt hp khc nhau . Mi i tng ca

http://tailieuhay.com

38

Lp trnh ha trn Java 2D v 3D


lp ny l mt lut kt hp m t s pha trn mt mu mi vi mu
ang tn ti..
Mt trong nhng lut kt hp trong lp AlphaComposite l SRC_OVER,
lut ny ch ra mu mi (mu ngun) s c pha trn vi mu ang tn
ti (mu ch ) nh th no.

2.2.7.1 Managing Transparency


Gi tr alpha ca mt mu l gi tr o trong sut ca mu ,n
ch ra (theo phn trm) bao nhiu phn trm mu trc khi t c hin
th ra khi cc mu chng ln nhau. Cc mu ti (co gi tri alpha=1.0) th
cc mu t ln chng s khng c hin th, trong khi cc mu
trong sut (c gi tr alpha=0.0) cho php cc mu t ln n c hin
th.
Khi vn bn v hnh c to bng th gi tr alpha s bt ngun t
thuc tnh ca i tng Paint trong

ng cnh ca i tng

Graphics2D . Khi cc hnh v vn bn c lm trn th gi tr alpha t


thuc tnh Paint (trong ng cnh ca Graphics2D) c kt hp vi
thng tin v cc im nh b che t rasterized path. Cc nh lu thng
tin v gi tr alpha ca chnh n .
Khi to mt i tng AlphaComposite , c th xc nh c gi tr
alpha c thm vo . Khi thm i tng AlphaComposite ny ti ng
http://tailieuhay.com

39

Lp trnh ha trn Java 2D v 3D


cnh ca Graphics2D ,gi tr alpha thm vo ny s lm tng gi tr trong
sut ca bt k i tng ha no khi chng c to bng - gi tr
alpha ca mi i tng ha c nhn ln bi gi tr alpha ca i
tng AlphaComposite.
2.2.7.2 Transparency and images
Cc nh c th lu thng tin v trong sut cho mi im nh ca
n. Thng tin ny oc gi l knh alpha( alpha channel,) ,n c s
dng kts hp vi i tng Composite trong ng cnh ca Graphics2D
pha trn mu ca nh cc ha ang tn ti.

2.3

Thit lp Graphics2Context
cu hnh ng cnh Graphics2D cho qu trnh to bng phi s

dng cc phng thc khi to cho i tng Graphics2D xc nh


cc thuc tnh nh RenderingHints, Stroke, Paint,Clipping path,
Composite, and Transform.
2.3.1 Setting Rendering Hints
i tng RenderingHints ng gi tt cc tham chiu xc nh
mt i tng s c to bng nh th no . to cc ch dn cho qu
http://tailieuhay.com

40

Lp trnh ha trn Java 2D v 3D


trnh to bng trong ng cnh Graphics2D ,th cn to mt i tng
RenderingHints v chuyn n vo lp Graphics2D.setRendering
To ch dn cho qu trnh to bng s khng m bo vic s s dng
mt thut ton to bng c th: khng phi mi trng cng h tr ch
to bng .
Trong v d cho sau y th cho php s dng k thut lm trn
(antialiasing) v to ra cc tham chiu xc nh cht lng cho qu
trnh to bng:

qu a l i t y H i n t s

new

Ren d e r i n g H i n t s ( R e n d e r i n g H i n t s . K E Y _ A N T i A L i A S
iNG ,
Ren d e r i n g H i n t s . V A L U E _ A N T i A L i A S _ O N ) ;
qua l i t y H i n t s . p u t ( R e n d e r i n g H i n t s . K E Y _ R E N D E R
iNG ,
Ren d e r i n g H i n t s . V A L U E _ R E N D E R _ Q U A L i T Y ) ;
g2 . s e t R e n d e r i n g H i n t s ( q u a l i t y H i n t s ) ;
2.3.2 Specifying Stroke Attributes
Mt i tng BasicStroke s nh ngha cc tnh cht uwoc p
dng cho ng vin bao quanh mt i tng Shape, gm c rng v
kiu ng (dashing pattern), lm th no cc on thng c kt hp
vi nhau. khi to cc thuc tnh v ng nt trong ng cnh
Graphics2D ,th khi to mt i tng BasicStroke v chuyn n vo
phng thc setStroke
2.3.2.1 Setting the Stroke Width
khi to rng ng nt th khi to i tng BasicStroke vi
rng mong mun v sau gi phng thc setStroke
http://tailieuhay.com

41

Lp trnh ha trn Java 2D v 3D


Trong v d cho sau y , rng ng nt c khi to vi 12
im v gi tr mc nh c s dng cho vic b tr kiu jont v kiu
endcap.

wid e S t r o k e

new

Bas i c S t r o k e ( 1 2 . 0 f ) ;

g2. s e t S t r o k e ( w i d e S t r o k e ) ;
2.3.2.2 Specifying Join and Endcap Styles
khi to cho cc kiu join v endcap ,cn to mt i tng
BasicStroke vi cc thuc tnh mong mun .
Trong v d cho sau y, rng ng nt c khi to vi 12 im
v cc kiu join v endcap c s dng thay cho cc gia tri mc nh:

rou n d S t r o k e

new

Ba s i c S t r o k e ( 4 . 0 f ,

Bas i c S t r o k e . C A P _ R O U N D ,
Bas i c S t r o k e . J O i N _ R O U N D ) ;
g2. s e t S t r o k e ( r o u n d S t r o k e ) ;
2.3.2.3 Setting the Dashing Pattern
Cc kiu ng phc tp c th d dng c nh ngha vi mt i
tng BasicStroke.
Khi to mt i tng BasicStroke ,phi xc nh 2 tham s kim
sot kiu ng:
dash - l mt mng biu din kiu ng. Cc phn t xen k
ca mng biu din kch thc nt gch v khong cch gia cc nt
gch .
Phn t 0 biu din nt gch u tin, phn t th 1 biu din khong
trng u tin.

http://tailieuhay.com

42

Lp trnh ha trn Java 2D v 3D


dash_phase - l mt offset nh ngha ni bt u ca mu nt
gch.
Trong v d sau y, hai mu nt gch c p dng cho mt ng
thng. Trong mu th nht ,kch thc ca cc nt gch v khong trng
gia chng l khng thay i. Mu th hai th phc tp hn ,s dng
mng su phn t nh ngha

flo a t

das h 1 [ ]

Bas i c S t r o k e

{10 . 0 f } ;

new

bs

Bas i c S t r o k e ( 5 . 0 f ,

Bas i c S t r o k e . C A P _ B U T T ,
Ba s i c S t r o k e . J O i N _ M i T E R ,

10 . 0 f ,

das h 1 ,

0.0 f ) ;
g2 . s e t S t r o k e ( b s ) ;
Li n e 2 D
10 . 0 f ,

lin e

new

10 0 . 0 f ,

Lin e 2 D . F l o a t ( 2 0 . 0 f ,

10. 0 f ) ;

g2 . d r a w ( l i n e ) ;
fl o a t [ ]
4.0 f ,
bs

da s h 2
2.0 f ,
=

{6. 0 f ,

4.0 f ,

2.0 f ,

4.0 f } ;
new

Ba s i c S t r o k e ( 5 . 0 f ,

Bas i c S t r o k e . C A P _ B U T T ,
Ba s i c S t r o k e . J O i N _ M i T E R ,

10 . 0 f ,

das h 2 ,

0.0 f ) ;
g2 . s e t S t r o k e ( b s ) ;
g2 . d r a w ( l i n e )

http://tailieuhay.com

43

Lp trnh ha trn Java 2D v 3D


C hai mu u s dng offset(a ch bt u ca hai mu) 0 khi
cc nt gch u tin s v tr u ca mu. Hai mu ny c minh ha
trong hnh2-7

2.3.3 Specifying Fill Attributes


Thuc tnh cu i tng Paint trong ng cnh Graphics2D xc
nh cc mu t hay cc mu (kiu )t khi mt i tng vn bn v
Shape c to bng.
2.3.3.1 Filling a Shape with a Gradient
Lp GradientPaint cung cp mt cch n gin t mt hnh bng
kiu t loang . Khi khi to i tng GradientPaint, cn xc nh v tr
u tin cng vi mu t v v tr cui cng mt mu t. Kiu t ny s
thay i t l t mu ny sang mu khc dc theo ng ni ca hai v tr
chn, minh ha trong hnh 2-8.

Trong ngi sao th ba,c hai im u nm trong cng mt hnh.Tt


c cc im dc theo ng t loang m rng qua im P1 s nhn c
mu ban u v cc im dc theo ng t loang c m rng ngoi
im P2 s nhn mu kt thc.
Cc bc cn thc hin t loang theo hai mu:

http://tailieuhay.com

44

Lp trnh ha trn Java 2D v 3D


1. Khi to i tng GradientPaint .
2. Gi phng thc Graphics2D.setPaint.
3. Khi to i tng Shape.
Trong v d sau y, mt hnh ch nht c t vi mu dt n gin
t mt i tng buffered image.

Gr a d i e n t P a i n t

gp

Gra d i e n t P a i n t ( 5 0 . 0 f ,
50 . 0 f ,

25 0 . 0 f ,

=
50 . 0 f ,

new

Col o r . b l u e

Col o r . g r e e n ) ;

g2 . s e t P a i n t ( g p ) ;
g2. f i l l R e c t ( 5 0 ,

50,

200 ,

200 ) ;

2.3.3.2 Filling a Shape with a Texture


Lp TexturePaint cung cp mt cch n gin t hnh bng mu lp.
Khi to mt i tng Bufferedimage s dng nh l mt mu t. Cn
chuyn hm khi to mt hnh ch nht nh ngha tn s lp cho
mu ,c chi ra trong hnh 2-9.
t hnh theo mu dt:
1. To i tng TexturePaint
2. Gi phng thc Graphics2D.setPaint.
3. To i tng Shape.
4. Gi phng thc Graphics2D.fill(shape).
Trong v d sau y, mt hnh ch nht c t vi mu dt
n gin t mt i tng bufferedimage.
//

Create

of

size

buffered

image

texture

patch

//5x5

http://tailieuhay.com

45

Lp trnh ha trn Java 2D v 3D


Bufferedimage

bi

new

Bufferedimage(5,

5,

Bufferedimage.TYPE_iNT_RGB);
Graphics2D

big

bi.createGraphics();

big.setColor(Color.green);
big.fillRect(0,0,5,5);
big.setColor(Color.lightGray);
big.fillOval(0,0,5,5);
//

Create

buffered

texture

paint

from

the

image

Rectangle

TexturePaint

new

tp

Rectangle(0,0,5,5);
new

TexturePaint(bi,r,TexturePaint.NEAREST_NEiGHBOR)
;
//

Add

the

texture

paint

to

the

graphics

context. g2.setPaint(tp);
//
with

Create
the

and

render

rectangle

filled

texture. g2.fillRect(0,0,200,200);

}
2.3.4 Setting the Clipping Path
nh ngha mt khung nhn:
1. Khi to mt i tng Shape m biu din vng mun to

bng.
2. Gi phng thc Graphics2D.setClip s dng i tung

shape nh l mt khung nhn cho ng cnh Graphics2D .


thu hp khung nhn:
1. Khi to i tng Shape m giao vi khung hnn hin ti.
2. Gi phng thc clip thay i khung nhn cho phn giao

nhau ca khung nhn hin ti v i tng Shape mi.

http://tailieuhay.com

46

Lp trnh ha trn Java 2D v 3D


Trong v d cho sau y, mt khung nhn c to ra t mt elip v
sau c thay i bng cch gi phng thc clip.

pub l i c

voi d

Gra p h i c s 2 D

//

The

pai n t ( G r a p h i c s

g2

wid t h

g)

(Gr a p h i c s 2 D )

and

hei g h t

get S i z e ( ) . w i d t h ;

int

get S i z e ( ) . h e i g h t ;

//
the

Cre a t e

an

ell i p s e

cl i p p i n g

g;

of

int

the

and

use

can v a s

it

as

pat h

Ell i p s e 2 D

new

El l i p s e 2 D . F l o a t ( w / 4 . 0 f , h / 4 . 0 f ,
w/2 . 0 f , h / 2 . 0 f ) ;
g2. s e t C l i p ( e ) ;

//

Fil l

wit h i n

the

can v a s .

the

cl i p

Onl y

the

are a

is

ren d e r e d

pa t h ,

set t i n g

g2. s e t C o l o r ( C o l o r . c y a n ) ;
g2. f i l l R e c t ( 0 , 0 , w , h ) ;

//

Cha n g e

it

to

//

the

the
the

cl i p p i n g

int e r s e c t i o n
cu r r e n t

cli p

of
and

new

rec t a n g l e .
Rec t a n g l e

new

Rec t a n g l e ( w / 4 + 1 0 , h / 4 + 1 0 , w / 2 - 20, h / 2 - 20) ;


http://tailieuhay.com

47

Lp trnh ha trn Java 2D v 3D


g2. c l i p ( r ) ;

//

Fil l

the

wit h i n

the

//

ren d e r e d

is

new

can v a s .

Onl y

the

are a

cli p

g2 . s e t C o l o r ( C o l o r . m a g e n t a ) ;
g2. f i l l R e c t ( 0 , 0 , w , h ) ;

2.3.5 Setting the Graphics2D Transform


bin i i tng Shape,xu vn bn, hay nh cn phi thm vo
mt php bin i mi AffineTransform cho ng ng php bin i
tronh ng cnh ca Graphics2D trc khi to bng . php bin i c
p dng khi i tng ha c to bng .
V d v mt hnh ch nht nghing 45 :
1. Ly mt php bin i Graphics2D trc khi thc hin bt k

php bin i no . Lun gi phng thc getTransform trong


i tng Graphics2D trc khi thm vo mt php bin i
cho ng cnh ha bi v ng cnh ha c th tn ti
mt php bin i cho mt l do khc ,nh v Swing v cc
thnh phn trong mt ca s.
2. Ly

php

quay

bng

cch

gi

AffineTransform.

getRotateinstance.
3. Gi phng thc Graphics2D.transform thm vo cc php

bin i mi cho ng ng bin i. Khng c s dng


phng thc setTransform thm mt php bin i ta
mi,bi v setTransform s ghi ln php bin i hin ti
trong ng cnh ha

http://tailieuhay.com

48

Lp trnh ha trn Java 2D v 3D


1. 4.To i tng Rectangle2D.Float .
4. Gi phn thc Graphics2D.draw to bng hnh ch nht.
5. Sau khi to bng cho hnh ch nht c bin i , th reset

php bin i ca Graphics2D tr v php bin i ban u m


lu trong bc 1 bng cch gi phng thc setTransform
cho php bin i ban u .
Trong v d sau y, mt th hin ca AffineTransform c s
dng quay hnh ch nht i 45 khi n c to bng.

Aff i n e T r a n s f o r m
Rec t a n g l e 2 D

aT

g2. g e t T r a n s f o r m ( ) ;

rec t

new

Rec t a n g l e 2 D . F l o a t ( 1 . 0 , 1 . 0 , 2 . 0 , 3 . 0 ) ;
Aff i n e T r a n s f o r m

rot a t e 4 5

Aff i n e T r a n s f o r m . g e t R o t a t e i n s t a n c e ( M a t h . P
i/4 . 0 , 0 . 0 , 0 . 0 )
g2. t r a n s f o r m ( r o t a t e 4 5 ) ;
g2 . d r a w ( r e c t ) ;
g2. s e t T r a n s f o r m ( a T ) ;

Cn trong v d ny,mt i tng AffineTransform c s dng


quay cc cu text xung quang mt im trung tm.

//

Def i n e

http://tailieuhay.com

the

ren d e r i n g

tra n s f o r m

49

Lp trnh ha trn Java 2D v 3D


Aff i n e T r a n s f o r m

at

new

Aff i n e T r a n s f o r m ( ) ;
//
mak e
//

App l y

roo m

for

ro t a t e d

tra n s l a t i o n

tra n s f o r m

to

the
tex t .

at. s e t T o T r a n s l a t i o n ( 4 0 0 . 0 ,

40 0 . 0 ) ;

g2 . t r a n s f o r m ( a t ) ;
//

Cre a t e

rot a t e

the

rot a t i o n

tra n s f o r m

tex t

at. s e t T o R o t a t i o n ( M a t h . P i
//

Re n d e r

J a v a
for

fou r
at

(in t

to

cop i e s

90
i

deg r e e
=

0;

2.0 ) ;

of

the

str i n g

ang l e s
i

g2. d r a w S t r i n g ( J a v a ,

<

4;

0.0 f ,

i++ )

0.0 f ) ;

g2 . t r a n s f o r m ( a t ) ;
}

C th bin i nh trong cch tng t -php bin i trong ng


cnh Graphics2D c p dng trong qu trnh to bng m khng cn
quan tm n kiu i tng ho ang c to bng
p dng php bin i cho nh m khng cn thay i php bin
i trong ng cnh Graphics2D , th chuyn AffineTransform sang
drawimage:

Aff i n e T r a n s f o r m

http://tailieuhay.com

rot a t e 4 5

50

Lp trnh ha trn Java 2D v 3D


Aff i n e T r a n s f o r m . g e t R o t a t e i n s t a n c e ( M a t h . P
i/4 . 0 , 0 . 0 , 0 . 0 )
g2 . d r a w i m a g e ( m y i m a g e ,

rot a t e 4 5 ) ;

Cc php bin i cng c p dng cho i tng Font to ra


mt kiu.
2.3.6 Specifying a Composition Style
Mt i tng AlphaComposite cha cc lut kt hp xc nh
cc mu s c to bng nh th no khi i tng nu ln i tng
khc . xc nh cc kiu kt hp cho ng cnh Graphics2D , cn to
mt i tng AlphaComposite v chuyn n vo phng thc
setComposite. Kiu thng dng nht l SRC_OVER.
2.3.6.1 Using the Source Over Compositing Rule
Lut kt hp SRC_OVER s kt hp cc im nh ngun (source
pixel) vi cc im nh ch (destination pixel). V d ,nu to bng mt
hnh ch nht mu xanh nc bin (blue) v sau to bng mt hnh
ch nht mu m ln mt phn ca hnh ch nht kia,th vng giao
nhau s c mu . Hay ni cch khc ,i tng m c to bng
cui cng s xut hin trn cng .
s dng lut kt hp SRC_OVER :
1. To mt i tng AlphaComposite bng cch gi phng
thc getinstance v xc nh lut
SRC_OVER .
AlphaComposite

ac

=AlphaComposite.getinstance(AlphaComposite.SRC_OV
ER);

http://tailieuhay.com

51

Lp trnh ha trn Java 2D v 3D


2. Gi

phng

thc

setComposite

thm

tung

AlphaComposite cho ng cnh ca Graphics2D.


g2.setComposite(ac);
Mi khi i tng kt hp ny c thit lp ,th i tng ln
c to bng bng cch s dng lut kt hp xc nh.
2.3.6.2 Increasing the Transparency of Composited Objects
AlphaComposite cho php xc nh mt gi tr hng s alpha thm
vo m c nhn vi gi tr alpha ca cc im nh ngun tng
trong sut.
V d , khi to mt i tng AlphaComposite m to bng i
tng ngun c trong sut l 50% ,xc nh mt gi tr alpha l .5:

AlphaComposite

ac

=AlphaComposite.getinstance(AlphaComposite.SRC_O
VER, .5f);

Trong v d cho sau y, a source over alpha composite object is


created with an alpha of .5 and added to the graphics context, causing
subsequent shapes to be
rendered 50% transparent.

pub l i c

voi d

Gra p h i c s 2 D

g2

pai n t ( G r a p h i c s
=

(Gr a p h i c s 2 D )

g)

g;

g2 . s e t C o l o r ( C o l o r . r e d ) ;

g2. t r a n s l a t e ( 1 0 0 , 5 0 ) ;
//

rad i a n s = d e g r e e

http://tailieuhay.com

pi e

180

52

Lp trnh ha trn Java 2D v 3D


g2 . r o t a t e ( ( 4 5 * j a v a . l a n g . M a t h . P i ) / 1 8 0 ) ;
g2. f i l l R e c t ( 0 , 0 , 1 0 0 , 1 0 0 ) ;
g2. s e t T r a n s f o r m ( n e w
//
//

set

Cre a t e

to
a

Al p h a C o m p o s i t e

Aff i n e T r a n s f o r m ( ) ) ;

ide n t i t y
new

alp h a

ac

com p o s i t e

Al p h a C o m p o s i t e . g e t i n s t a n c e ( A l p h a C o m p o s i t e . S
RC _ O V E R , 0 . 5 f ) ;
g2. s e t C o m p o s i t e ( a c ) ;
g2 . s e t C o l o r ( C o l o r . g r e e n ) ;
g2. f i l l R e c t ( 5 0 , 0 , 1 0 0 , 1 0 0 ) ;
g2 . s e t C o l o r ( C o l o r . b l u e ) ;
g2 . f i l l R e c t ( 1 2 5 , 7 5 , 1 0 0 , 1 0 0 ) ;
g2 . s e t C o l o r ( C o l o r . y e l l o w ) ;
g2 . f i l l R e c t ( 5 0 , 1 2 5 , 1 0 0 , 1 0 0 ) ;
g2 . s e t C o l o r ( C o l o r . p i n k ) ;
g2. f i l l R e c t ( - 25, 7 5 , 1 0 0 , 1 0 0 ) ;
}

2.4

Rendering Graphics Primitives


Graphics2D cung cp cc phng thc to bng cho cc c s

ha nh Shapes, Text, v images:


drawto nt cho ng vin ca i tng Shape bng cch s
dng cc i tng Stroke v Paint trong ng cnh Graphics2D .
fillt mt i tng Shape bng cch s dng i tng Paint
trong ng cnh Graphics2D .

http://tailieuhay.com

53

Lp trnh ha trn Java 2D v 3D


drawStringto bng cc xu vn bn dc xc nh bng cch
s dng i tng Paint trong ng cnh Graphics2D .
drawimageto bng cc nh c xc nh
2.4.1 Drawing a Shape
ng bin ca bt k i tng Shape cng c to bng bng
phng thc Graphics2D.draw.
Phng thc v t cc phin bn trc cng c h tr : drawLine,
drawRect,

drawRoundRect,

drawOval,

drawArc,drawPolyline,

drawPolygon, draw3DRect.
Khi mt i tng Shape c v , th ng bin ca n s c to
nt bng i tng Stroke trong ng cnh Graphics2D
Bng vic thit lp i tng BasicStroke ph hp trong ng cnh
Graphics2D ,th c th v ng thng vi rng v mu nt gch bt
k . i tng BasicStroke cng nh ngha cc thuc tnh endcap v
join ca ng thng .
to bng cho cc ng bin ca i tng shape:
1. Khi to cho i tng BasicStroke
2. Gi phng thc Graphics2D.setStroke
3. Khi to cho i tng Shape.
4. Gi phng thc Graphics2D.draw(shape).
Trong v d sau,i tng GeneralPath c s dng nh ngha
mt ngi sao v mt i tng BasicStroke c thm vo ng cnh
Graphics2D nh ngha cho cc cnh ca ngi sao vi cc thuc tnh
join .

pub l i c

voi d

http://tailieuhay.com

pai n t ( G r a p h i c s

g)

54

Lp trnh ha trn Java 2D v 3D


Gra p h i c s 2 D

//

g2

cre a t e

(Gr a p h i c s 2 D )

and

g2. s e t S t r o k e ( n e w

//

Cre a t e

pat h

set

g;

the

st r o k e

Bas i c S t r o k e ( 4 . 0 f ) ) ;

sta r

usi n g

gen e r a l

obj e c t

Gen e r a l P a t h

new

Ge n e r a l P a t h ( G e n e r a l P a t h . N O N _ Z E R O ) ;
p. m o v e T o ( -

10 0 . 0 f ,

25. 0 f ) ;

p. l i n e T o ( +

10 0 . 0 f ,

25. 0 f ) ;

p. l i n e T o ( -

50 . 0 f ,

100 . 0 f ) ;

p. l i n e T o ( +

0.0 f ,

p. l i n e T o ( +

50 . 0 f ,

100 . 0 f ) ;
+

100 . 0 f ) ;

p.c l o s e P a t h ( ) ;

//

tra n s l a t e

of

can v a s

ori g i n

to w a r d s

ce n t e r

g2 . t r a n s l a t e ( 1 0 0 . 0 f ,

100 . 0 f ) ;

//

re n d e r

the

sta r ' s

pat h

g2 . d r a w ( p ) ;
}

2.4.2 Filling a Shape


Phng thc Graphics2D.fill c th c s dng t bt k i
tng Shape. Khi mt i tng Shape c t, th phn b gii hn bi

http://tailieuhay.com

55

Lp trnh ha trn Java 2D v 3D


ng bao ca i tng s c to bng vi ng cnh Graphics2D ca
thuc tnh Paint attributenh Color, TexturePaint, or GradientPaint.
Phng thc t t cc phin bn trc ca phn mm JDK cng
c h tr: fillRect, fill3DRect, fillRoundRect, fillOval, fillArc,
fillPolygon,clearRect.
t mt i tng Shape:
1. Xc nh mu t v kiu t trong ng cnh ha bng
cch

dng

Graphics2D.setColor

hay

Graphics2D.setPaint.
1. Khi to i tng Shape.
2. Gi phng thc Graphics2D.fill to bng i tng
Shape.
Trong v d sau y ,phng thc setColor c gi nh ngha
mu t l green fill cho mt i tng Rectangle2D.

pub l i c

voi d

Gra p h i c s 2 D

pai n t ( G r a p h i c s

g2

g)

(Gr a p h i c s 2 D )

g;

g2 . s e t P a i n t ( C o l o r . g r e e n ) ;
Rec t a n g l e 2 D

r2

new

Rec t a n g l e 2 D . F l o a t ( 2 5 , 2 5 , 1 5 0 , 1 5 0 ) ;

g2. f i l l ( r 2 ) ;
}

http://tailieuhay.com

56

Lp trnh ha trn Java 2D v 3D


2.4.3 Rendering Text
to bng vn bn ,cn gi Graphics2D.drawString, sau chuyn
vo xu m bn mun to bng
2.4.4 Rendering images
to bng vn bn ,cn gi Graphics2D.drawimage, sau chuyn
vo xu m bn mun to bng .
2.5

Defining Custom Composition Rules


C th to mt kiu mi hon ton ca php kt hp bng cch thc

thi cc interface Composite v CompositeContext . Mt i tng


Composite cung cp mt i tng CompositeContext m thc cht l
lu trng thi v thc hin cng vic kt hp. Nhiu i tng
CompositeContext c th c to t mt i tng Composite lu
cc trng thi ring bit trong mi trng a lung (multithreaded
environment.)
2.6

Rendering in a Multi-Screen Environment


TrongJavaTM 2 SDK, version 1.3, Java 2DTM API h tr nhng cu

hnh a mn hin thi khc nhau m c th c cu hnh bi mt mi


trng m :
C hai hoc nhiu mn hnh c lp
C hai hoc nhiu mn hnh ni ch c mt mn hnh chnh v
cc mn hin th khc s copy nhng hnh nh xut hin trn mn
hnh chnh
Hai hoc nhiu mn hnh m c dng nh mt my o v n cho
php gi cc thit b o.
Java 2D API cho php to cc i tng Frame, JFrame, Window,
hoc Jwindow .Vi mt i tng GraphicsConfiguration xc nh
cc thit b hin th cho qu trnh to bng. Trong c ba cu hnh,mi thit
http://tailieuhay.com

57

Lp trnh ha trn Java 2D v 3D


b hin th c biu din bi mt i tng GraphicsDevice.Mt i
tng GraphicsDevice c nhiu i tng GraphicsConfiguration kt
hp vi n .
Khi hai hoc nhiu mn hnh c s dng to mt thit b o ,h
ta o (m tn ti c lp vi thit b hin th vt l )c s dng
biu din thit b o . Cc bin cu mi i tng
GraphicsConfiguration trong cu hnh a mn hin th c quan h vi
h ta o . Mt mn hin th trong mi trng ny c xc nh nh
l mn hin th chnh v t v tr (0, 0) ca h ta o . Da trn v tr
ca mn hin th chnh ,thit b o c th c ta m ,nh trong hnh 210:

xc nh nu l mi trng thit b o ni m mt i tng


Window
hay Frame c th xut hin trn hai hay nhiu mn hnh vt l ,th gi
phng thc getBounds trn mi i tng GraphicsConfiguration
trong h thng v kim tra nu gc ta khc v tr (0, 0). Phng thc
getBounds ca i tng GraphicsConfiguration tr v mt i tng
hnh Rectangle trong h ta o .V vy ,nu mt gc ta khng phi
v tr (0, 0), th mi trng chnh l mi trng o.

http://tailieuhay.com

58

Lp trnh ha trn Java 2D v 3D


Trong mi trng thit b o ,cc ta ca cc i tng
GraphicsConfiguration c quan h vi h ta o . V vy, phi s
dng ta o khi gi phng thc setLocation ca i tng Frame
hay Window. Cho v d,on m ny s ly ng bao ca mt i
tng GraphicsConfiguration v s dng cc ng bao thit lp v
tr ca i tng Frame ti ta (10, 10) trong h ta ca mn hin
th vt l .

Frame

Fra m e ( G r a p h i c s C o n f i g u r a t i o n
Rec t a n g l e

bo u n d s

f.s e t L o c a t i o n ( 1 0

new
gc) ;

gc. g e t B o u n d s ( ) ;
+

bou n d s . x ,

10

bo u n d s . y ) ;

Nu cc ng bao ca i tng GraphicsConfiguration khng


c tnh n , th i tng Frame c hin th ti v tr (10, 10) trn
m hnh vt l chnh , iu ny c th khc vi m hnh vt l ca i
tng GraphicsConfiguration c xc nh .
Phng thc getBounds c th c s dng xc nh cc ng
bin cu thit b o. Gi phng thc getBounds trn mi i tng
GraphicsConfiguration trong h thng . xc dnh cc ng bao cu
thit b o , tnh ton s kt hp ca cc ng bao. K thut ny c s
dng trong v d sau.

http://tailieuhay.com

59

Lp trnh ha trn Java 2D v 3D


Rec t a n g l e

vir t u a l B o u n d s

new

Rec t a n g l e ( ) ;
Gra p h i c s E n v i r o n m e n t

ge

Gra p h i c s E n v i r o n m e n t . g e t L o c a l G r a p h i c s E n v i r o
nme n t ( ) ;
Gr a p h i c s D e v i c e [ ]

gs

ge. g e t S c r e e n D e v i c e s ( ) ;
for

(in t

j++ )

Gra p h i c s D e v i c e

gd

0;

<

gs. l e n g t h ;

gs[ j ] ;

Gr a p h i c s C o n f i g u r a t i o n [ ]

gc

gd . g e t C o n f i g u r a t i o n s ( ) ;
for

(in t

i++ )

0;

<

gc . l e n g t h ;

vi r t u a l B o u n d s

vi r t u a l B o u n d s . u n i o n ( g c [ i ] . g e t B o u n d s ( ) ) ;
}
}

Applet sau s to mt i tng JFrame vi mi i tng


GraphicsConfiguration ca mi i tng GraphicsDevice trong i
tng GraphicsEnvironment. Mi i tng JFrame hin th mt tp
cc vch , xanh m ,xanh nht,s lng cc mn hin th s lng cc
i tng GraphicsConfiguration v cc ng bao cu i tng
GraphicsConfiguration. on m sau phi c chy vi JavaTM 2
SDK, version 1.3 hoc cao hn.

http://tailieuhay.com

60

Lp trnh ha trn Java 2D v 3D

/*
* Transform.java
* 1.0
* 27/03/06
* Day la doan chuong trinh mieu ta cac phep bien
doi.
*/

import java.awt.*;

import javax.swing.*;

/*
* Chuong trinh nay tao bong mot hinh duoc chon
boi nguoi su dung.Voi cac phuong
* thuc paint,stroke, va rendering cung duoc lua
chon boi nguoi su dung.
*/

/**
* @author Administrator
*
*/
public class Transform extends JApplet implements
itemListener, ActionListener {
/**
*

http://tailieuhay.com

61

Lp trnh ha trn Java 2D v 3D


*/
private static final long serialVersionUiD =
-2514519718222913151L;

JLabel

primLabel,

lineLabel,

paintLabel,

transLabel, strokeLabel;

TransPanel display;

static

JComboBox

primitive,

line,

paint,

trans, stroke;

JButton redraw;

public static boolean no2D = false;

public void init() {


GridBagLayout

layOut

new

GridBagLayout();
getContentPane().setLayout(layOut);
GridBagConstraints

new

GridBagConstraints();

c.weightx = 1.0;
c.fill = GridBagConstraints.BOTH;
primLabel = new JLabel();
primLabel.setText("Hnh gc");

Font newFont = getFont().deriveFont(1);


primLabel.setFont(newFont);

http://tailieuhay.com

62

Lp trnh ha trn Java 2D v 3D

primLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(primLabel, c);
getContentPane().add(primLabel);

lineLabel = new JLabel();


lineLabel.setText("Cc ng");
lineLabel.setFont(newFont);

lineLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(lineLabel, c);
getContentPane().add(lineLabel);

paintLabel = new JLabel();


paintLabel.setText("Kiu v");
paintLabel.setFont(newFont);

paintLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(paintLabel, c);
getContentPane().add(paintLabel);

c.gridwidth

GridBagConstraints.RELATiVE;
transLabel = new JLabel();
transLabel.setText("Cc php bin i");
transLabel.setFont(newFont);

http://tailieuhay.com

63

Lp trnh ha trn Java 2D v 3D

transLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(transLabel, c);
getContentPane().add(transLabel);

c.gridwidth

GridBagConstraints.REMAiNDER;
strokeLabel = new JLabel();
strokeLabel.setText("T trt");
strokeLabel.setFont(newFont);

strokeLabel.setHorizontalAlignment(JLabel.CENTER)
;
layOut.setConstraints(strokeLabel, c);
getContentPane().add(strokeLabel);

GridBagConstraints

ls

new

GridBagConstraints();
ls.weightx = 1.0;
ls.fill = GridBagConstraints.BOTH;
primitive = new JComboBox(new Object[] {
"Hnh ch nht", "Hnh elip",

"Vn b n" });

primitive.additemListener(this);
newFont = newFont.deriveFont(0, 14.0f);
primitive.setFont(newFont);
layOut.setConstraints(primitive, ls);
getContentPane().add(primitive);

http://tailieuhay.com

64

Lp trnh ha trn Java 2D v 3D

line

new

JComboBox(new

Object[]

{ "Mnh", "m", "Nt t" });

line.additemListener(this);
line.setFont(newFont);
layOut.setConstraints(line, ls);
getContentPane().add(line);

paint

new

JComboBox(new

Object[]

{ " ng nh t", "T loang", "polka" });


paint.additemListener(this);
paint.setFont(newFont);
layOut.setConstraints(paint, ls);
getContentPane().add(paint);

ls.gridwidth

GridBagConstraints.RELATiVE;

trans

new

JComboBox(new

Object[]

{ "identity", "Quay", "T l",


"shear" });

trans.additemListener(this);
trans.setFont(newFont);
layOut.setConstraints(trans, ls);
getContentPane().add(trans);

ls.gridwidth

GridBagConstraints.REMAiNDER;

http://tailieuhay.com

65

Lp trnh ha trn Java 2D v 3D


stroke

new

JComboBox(new

Object[]

{ " ng nt", "T y",


" ng nt va T y" });
stroke.additemListener(this);
stroke.setFont(newFont);
layOut.setConstraints(stroke, ls);
getContentPane().add(stroke);

GridBagConstraints

button

new

GridBagConstraints();
button.gridwidth

GridBagConstraints.REMAiNDER;
redraw = new JButton("V li");

redraw.addActionListener(this);
redraw.setFont(newFont);
layOut.setConstraints(redraw, button);
getContentPane().add(redraw);

GridBagConstraints

tP

new

GridBagConstraints();
tP.fill = GridBagConstraints.BOTH;
tP.weightx = 1.0;
tP.weighty = 1.0;
tP.gridwidth

GridBagConstraints.REMAiNDER;
display = new TransPanel();
layOut.setConstraints(display, tP);
display.setBackground(Color.white);
getContentPane().add(display);

http://tailieuhay.com

66

Lp trnh ha trn Java 2D v 3D

validate();

public void itemStateChanged(itemEvent e) {


}

public void actionPerformed(ActionEvent e) {

display.setTrans(trans.getSelectedindex());
display.renderShape();
}

@SuppressWarnings("deprecation")
public static void main(String[] argv) {
if (argv.length > 0 && argv[0].equals("no2d")) {
Transform.no2D = true;
}

JFrame

frame

new

JFrame("Cc

php

chuyn i");

frame.addWindowListener(new

WindowAdapter() {
public

void

windowClosing(WindowEvent e) {
System.exit(0);
}

http://tailieuhay.com

67

Lp trnh ha trn Java 2D v 3D


});

JApplet applet = new Transform();

frame.getContentPane().add(BorderLayout.CENTER,
applet);

applet.init();

frame.setSize(550, 400);
frame.show();
}

@SuppressWarnings("serial")
class TransPanel extends JPanel {

AffineTransform at = new AffineTransform();

int w, h;

Shape shapes[] = new Shape[3];

Bufferedimage bi;

boolean firstTime = true;

http://tailieuhay.com

68

Lp trnh ha trn Java 2D v 3D


public TransPanel() {
setBackground(Color.white);
shapes[0]

shapes[1]

new

Rectangle(0,

0,

100,

100);
new

Ellipse2D.Double(0.0,

0.0, 100.0, 100.0);


TextLayout

textTl

new

TextLayout("Brother Hood", new Font("Tomaha",


1,

76),

new

FontRenderContext(null, false, false));


AffineTransform

textAt

new

AffineTransform();
textAt.translate(0,

(float)

textTl.getBounds().getHeight());
shapes[2] = textTl.getOutline(textAt);
}

public void setTrans(int transindex) {


switch (transindex) {
case 0:
at.setToidentity();
at.translate(w / 2, h / 2);
break;
case 1:
at.rotate(Math.toRadians(45));
break;
case 2:
at.scale(0.5, 0.5);
break;

http://tailieuhay.com

69

Lp trnh ha trn Java 2D v 3D


case 3:
at.shear(0.5, 0.0);
break;
}
}

public void renderShape() {


repaint();
}

public void paintComponent(Graphics g) {


super.paintComponent(g);

if (!Transform.no2D) {
Graphics2D g2 = (Graphics2D) g;
Dimension d = getSize();
w = d.width;
h = d.height;
String instruct = "Nh p mt hnh c

s ban u, ki u ng,ki u v , php bi n i,";


TextLayout

thisTl

new

TextLayout(instruct, new Font("Helvetica",


0,

10),

g2.getFontRenderContext());
float

width

(float)

(float)

thisTl.getBounds().getWidth();
float

height

thisTl.getBounds().getHeight();

http://tailieuhay.com

70

Lp trnh ha trn Java 2D v 3D


thisTl.draw(g2, w / 2 - width / 2,
15);
instruct = "v cc phng th c

to

bng sau nh n nt VE LAi.";


thisTl

new

TextLayout(instruct,

new Font("Helvetica", 0, 10), g2


.getFontRenderContext());
width

(float)

thisTl.getBounds().getWidth();
thisTl.draw(g2, w / 2 - width / 2,
height + 17);

// initialize the transform.


if (firstTime) {
at.setToidentity();
at.translate(w / 2, h / 2);
firstTime = false;
}

// Sets the Stroke.


Stroke oldStroke = g2.getStroke();

switch
(Transform.line.getSelectedindex()) {
case 0:
g2.setStroke(new
BasicStroke(3.0f));
break;

http://tailieuhay.com

71

Lp trnh ha trn Java 2D v 3D


case 1:
g2.setStroke(new
BasicStroke(8.0f));
break;
case 2:
float dash[] = { 10.0f };
g2.setStroke(new
BasicStroke(3.0f, BasicStroke.CAP_BUTT,
BasicStroke.JOiN_MiTER,
10.0f, dash, 0.0f));
break;
}

// Sets the Paint.


Paint oldPaint = g2.getPaint();

switch
(Transform.paint.getSelectedindex()) {
case 0:
g2.setPaint(Color.blue);
break;
case 1:
g2.setPaint(new GradientPaint(0,
0, Color.lightGray, w - 250,
h, Color.blue, false));
break;
case 2:
Bufferedimage

buffi

new

Bufferedimage(15, 15,

http://tailieuhay.com

72

Lp trnh ha trn Java 2D v 3D

Bufferedimage.TYPE_iNT_RGB);
Graphics2D

buffig

buffi.createGraphics();
buffig.setColor(Color.blue);
buffig.fillRect(0, 0, 15, 15);

buffig.setColor(Color.lightGray);
buffig.translate((15 / 2) - (5 /
2), (15 / 2) - (5 / 2));
buffig.fillOval(0, 0, 7, 7);
Rectangle r = new Rectangle(0,
0, 25, 25);
g2.setPaint(new
TexturePaint(buffi, r));
break;
}

// Sets the Shape.


Shape

shape

shapes[Transform.primitive.getSelectedindex()];
Rectangle r = shape.getBounds();

// Sets the selected Shape to the


center of the Canvas.
AffineTransform

saveXform

g2.getTransform();
AffineTransform

toCenterAt

new

AffineTransform();

http://tailieuhay.com

73

Lp trnh ha trn Java 2D v 3D


toCenterAt.concatenate(at);
toCenterAt.translate(-(r.width / 2),
-(r.height / 2));

g2.transform(toCenterAt);

// Sets the rendering method.


switch
(Transform.stroke.getSelectedindex()) {
case 0:
g2.draw(shape);
break;
case 1:
g2.fill(shape);
break;
case 2:
Graphics2D tempg2 = g2;
g2.fill(shape);
g2.setColor(Color.darkGray);
g2.draw(shape);
g2.setPaint(tempg2.getPaint());
break;
}

g2.setStroke(oldStroke);
g2.setPaint(oldPaint);
g2.setTransform(saveXform);

http://tailieuhay.com

74

Lp trnh ha trn Java 2D v 3D


}
}
Kt qu sau khi chy chng trnh :

http://tailieuhay.com

75

Lp trnh ha trn Java 2D v 3D


Chng 3
Cc i tng hnh ha

Java 2D API cung cp mt s lp nh ngha cc i tng


geometric (hnh hc),chng hn nh im,ng thng,ng
cong,hnh ch nht.Nhng lp hnh hc mi l mt phn ca gi
java.awt.geom. c th tng thch vi cc phin bn c,cc lp
geometry c cha trong cc phin bn trc ca b JDK software,nh
rectangle,point v polygon,c cha trong gi java.awt.
Cc i tng hnh hc trong Java 2D API nh GenneralPath,Arc2D
v Rectangle2D cho php thc thi vic to giao din b mt c nh ngha trong
gi java.awt.Hnh dng c th cung cp cho ta mt phng thc chung cho vic
miu t v kim tra ng dn ca cc i tng hnh hc.Mt giao din mi
Pathlterator,cung cp cc phng thc nh ngha vic khi phc cc phn t t
mt i tng hnh hc. S dng cc lp hnh hc bn c th d dng xc nh v
thao tc vi nhiu i tng hai chiu.
3.1 Giao din v lp.
Bng di y lit k nhng giao din v cc lp chnh ca cc i
tng hnh hc.Hu ht trong s cc giao din v cc lp l thnh phn
ca gi java.awt.geom.Mt s,chng hn nh Shape,l thnh phn ca
gi java.awt,thnh phn chnh c th tng thch vi cc phin bn
trc y ca b JDK.
Cc lp v giao din ca java.awt.geom
http://tailieuhay.com

76

Lp trnh ha trn Java 2D v 3D


Giao din
PathIterator

M t
nh ngha cc phng thc cho vic phc hI cc

Shape

phn t t mt ng dn.
Cung cp mt tp cc phng thc cho vic miu t

(java.awt)

v kim tra ng dn hnh hc.c thc thi bI


GaneralPath v cc lp hnh hc khc.

Cc lp

Arc2D Arc2D.Double M rng:RectangularShape


Arc2D.Float

Miu t mt ng cong c nh ngha bng


mt hnh ch nht c giI hn,gc ban u,v
mt kiu ng kn.Vic thc thi ch r nhng
ng cong trong kiu s float v double.

Area

Chnh xc:Arc2D.Float v Arc2D.Double.Area


Lp thc thi:Shape,Cloneable.
Miu t mt din tch hnh hc m h tr cc
php ton nh phn.

CubicCurve2D

Implements: Shape

CubicCurve2D.Doubl Lp thc thi:Shape.


e

Miu t cc on ng cong tham s bc ba

CubicCurve2D.Float

trong khng gian ta .Vic thc thi ch r


cc ng cong bc ba vI chnh xc float v
double do hai lp: CubicCurve2D.Float

and

CubicCurve2D.Double.
Dimension2D

ng gi c chiu rng v chiu cao.Mt siu


lp tru tng cho tt c cc I tng lu tr
dng lu tr cc I tng hai chiu.

http://tailieuhay.com

77

Lp trnh ha trn Java 2D v 3D

Ellipse2D

M rng: RectangularShape

Ellipse2D.Double

Miu t vic nh ngha ng e-lip bng cc

Ellipse2D.Float

hnh ch nht giI hn.Cng c ch r cc


ng cong elip vI chnh xc float v

double: Ellipse2D.Float v Ellipse2D.Double


FlatteningPathIterator Tr v mt flattened view ca mt i tng
PathLterator.
C th s dng cung cp cc flattening
behavior cho cc i tng Shape m n khng
GeneralPath

thc hin vic tnh ton cc thnh phn thm vo.


Thc thi i tng Shape
Miu t mt khung hinhg c xy dng t cc

Line2D

ng thng v cc ng bc hai v bc ba
Thc thi i tng Shape.

Line2D.Double

Miu t mt on thng trong khng gian ta

Line2D.Float

(x,y) .c thc thi xc nh cc ng thng


vi chnh xc float v double:: Line2D.Float

Point2D

v Line2D.Double.
Mt im miu t mt v tr trong khng gian ta

Point2D.Double

(x,y).c thc thi xc inh cc im vi

Point2D.Float

chnh xc float v double: Point2D.Float v

QuadCurve2D

Point2D.Double.
Thc thi i tng Shape.

QuadCurve2D.Doubl

Miu t mt on ng cong tham s bc hai

trong khng gian ta (x,y).c thc thi

QuadCurve2D.Float

xc nh cc ng bc hai vi chnh xc
float

Rectangle2D

http://tailieuhay.com

double:

QuadCurve2D.Float

QuadCurve2D.Double.
M rng: RectangularShape
78

Lp trnh ha trn Java 2D v 3D


Rectangle2D.Double

Miu t mt hnh ch nht c nh ngha bi

Rectangle2D.Float

mt v tr (x,y) v kch thc(w,x,h). c thc


thi xc inh cc hnh ch nht vi chnh
xc float v double: Rectangle2D.Float

RectangularShape

Rectangle2D.Double.
Thc thi i tng Shape.
Cung cp s thao tc chung cho cc tc ng ln
cc i tng Shape m n c cc hnh ch nht

RoundRectangle2D

bin.
M rng: RectangularShape

RoundRectangle2D.D Miu t mt hnh ch nht cc gc c lm trn


ouble

c nh ngha bng mt v tr (x, y),mt kch

RoundRectangle2D.Fl thc (w x h),v chiu rng v chiu cao ca


oat

gc cung. c thc thi xc inh cc hnh ch


nht c gc trn vi chnh xc float v double:
RoundRectangle2D.Float

RoundRectangle2D.Double.

3.2 Cc khi nim hnh hc:


Shape l mt th hin ca nhiu lp m n thc thi Shape
interface,nh
GeneralPath or Rectangle2D.Float. ng vin (outline) cn c
nh ngha l path.
Khi mt Shape c v,kiu ng nt v c ng ngha bi i
tng Stroke trong th vin ha 2D,c p dng cho Shapes
path.Khi mt Shape c ph y,Paint trong th vin ha 2D c
p dng cho phn din tch bn trong ng vin ca n. bit thm
thng tin,bn xem thm phn Rendering with Graphics2D.

http://tailieuhay.com

79

Lp trnh ha trn Java 2D v 3D


ng vin ca mt hnh cng c th c s dng nh ngha
mt clipping path.Mt clipping path xc nh nhng im nh no c
a ra(render). clipping path l mt phn ca Graphics 2D. bit thm
thng tin,bn xem thm phn Setting the Clipping Path.
Mt GeneralPath l mt shape m n c th c s dng
miu t mt s i tng 2 chiu c th c v t cc ng v
cc ng bc hai hoc bc ba. thun li,java.awt.geom cung
cp thm cc thnh phn thc thi ca giao tip Shape m n miu
t cc i tng ha ph bin nh hnh ch nht,hnh
elip,cung trn v cc ng cong. The Java2D API cn cung cp
mt kiu shape c bit h tr cho vic xy dng din tch hnh hc.
3.2.1 Constructive Area Geometry
Constructive Area Geometry (CAG) l mt qu trnh to ra cc i
tng hnh hc mi bng vic thc hin cc php ton nh phn trong cc
i tng tn ti.Trong Java 2D API mt kiu c bit ca Shape
c gi l Area h tr cc php ton nh phn.Bn c th to ra mt i
tng Area t mt s Shape.
Cc Area h tr cc php ton nh phn sau:
Union(hp)
intersection(giao)
Subtraction(tr)
Exclusive OR (XOR) (OR dnh ring)
Cc php ton c miu t nh hnh 3-1 di y:

http://tailieuhay.com

80

Lp trnh ha trn Java 2D v 3D

3.2.2 Bounds and Hit Testing


Mt bounding box l mt hnh ch nht bao bc hon ton mt mt
th thin hnh hc. bounding box c s dng qut nh mt i
tng c c chn hay khng hoc c hit bi ngi s dng.
Giao din Shape xc nh hai phng thc cho vic truy li mt
shapes bounding box, l getBounds v getBounds2D.Phng thc
getBounds2D tr v mt i tng Rectangle2D, mt th hin ca
Rectangle.Cung cp mt chnh xc cao hn trong vic miu t
shapes bounding box.
Shape cng cung cp nhiu phng thc cho vic xc nh :

Mt im c th bn trong bao ng ca hnh

th(contains)
Mt hnh ch nht c th nm hon ton bn trong mt
bao ng ca hnh th. (contains)
Mt hnh ch nht c th phn ct hnh th (intersects)

/*
* Composite.java
* 1.0
* 20/03/06
*/

http://tailieuhay.com

81

Lp trnh ha trn Java 2D v 3D


import java.awt.*;

import javax.swing.*;

/*
* Chuong trinh nay la mot vi du ve cac luat ket
hop giua cac hinh.
*/

@SuppressWarnings("serial")
public class Composite extends JApplet implements
itemListener {
CompPanel comp;

JLabel alphaLabel, rulesLabel;

JComboBox alphas, rules;

String alpha = "1.0";

int rule = 0;

public void init() {


GridBagLayout

layOut

new

GridBagLayout();
getContentPane().setLayout(layOut);

http://tailieuhay.com

82

Lp trnh ha trn Java 2D v 3D


GridBagConstraints

new

GridBagConstraints();
l.weightx = 1.0;
l.fill = GridBagConstraints.BOTH;
l.gridwidth

GridBagConstraints.RELATiVE;
alphaLabel = new JLabel();
alphaLabel.setText("C ng

m u");

Font newFont = getFont().deriveFont(1);


alphaLabel.setFont(newFont);

alphaLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(alphaLabel, l);
getContentPane().add(alphaLabel);
getContentPane().setLayout(layOut);

l.gridwidth

GridBagConstraints.REMAiNDER;
rulesLabel = new JLabel();
rulesLabel.setText("Cc lut kt hp.");
newFont = getFont().deriveFont(1);
rulesLabel.setFont(newFont);

rulesLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(rulesLabel, l);
getContentPane().add(rulesLabel);

http://tailieuhay.com

83

Lp trnh ha trn Java 2D v 3D


GridBagConstraints

new

GridBagConstraints();
a.gridwidth

GridBagConstraints.RELATiVE;
a.weightx = 1.0;
a.fill = GridBagConstraints.BOTH;
alphas = new JComboBox();
layOut.setConstraints(alphas, a);
alphas.additem("1.0");
alphas.additem("0.75");
alphas.additem("0.50");
alphas.additem("0.25");
alphas.additem("0.0");
alphas.additemListener(this);
getContentPane().add(alphas);

a.gridwidth

GridBagConstraints.REMAiNDER;
rules = new JComboBox();
layOut.setConstraints(rules, a);
rules.additem("SRC");
rules.additem("DST_iN");
rules.additem("DST_OUT");
rules.additem("DST_OVER");
rules.additem("SRC_iN");
rules.additem("SRC_OVER");
rules.additem("SRC_OUT");
rules.additem("CLEAR");
rules.additemListener(this);

http://tailieuhay.com

84

Lp trnh ha trn Java 2D v 3D


getContentPane().add(rules);

GridBagConstraints

fC

new

GridBagConstraints();
fC.fill = GridBagConstraints.BOTH;
fC.weightx = 1.0;
fC.weighty = 1.0;
fC.gridwidth

GridBagConstraints.REMAiNDER;
comp = new CompPanel();
layOut.setConstraints(comp, fC);
getContentPane().add(comp);

validate();
}

public void itemStateChanged(itemEvent e) {


if

(e.getStateChange()

!=

itemEvent.SELECTED) {
return;
}

Object choice = e.getSource();


if (choice == alphas) {
alpha

(String)

alphas.getSelecteditem();
} else {
rule = rules.getSelectedindex();
}

http://tailieuhay.com

85

Lp trnh ha trn Java 2D v 3D


comp.changeRule(alpha, rule);
}

public static void main(String s[]) {


JFrame f = new JFrame("Kt hp");
f.addWindowListener(new

WindowAdapter()

{
public

void

windowClosing(WindowEvent e) {
System.exit(0);
}
});
JApplet applet = new Composite();
f.getContentPane().add("Center",
applet);
applet.init();
f.pack();
f.setSize(new Dimension(300, 300));
f.show();
}
}

class CompPanel extends JPanel {

AlphaComposite

ac

AlphaComposite.getinstance(AlphaComposite.SRC);

float alpha = 1.0f;

http://tailieuhay.com

86

Lp trnh ha trn Java 2D v 3D


public CompPanel() {
}

public void changeRule(String a, int rule) {


alpha = Float.valueOf(a).floatValue();
ac

AlphaComposite.getinstance(getRule(rule), alpha);
repaint();
}

public int getRule(int rule) {


int alphaComp = 0;
switch (rule) {
case 0:
alphaComp = AlphaComposite.SRC;
break;
case 1:
alphaComp = AlphaComposite.DST_iN;
break;
case 2:
alphaComp = AlphaComposite.DST_OUT;
break;
case 3:
alphaComp = AlphaComposite.DST_OVER;
break;
case 4:
alphaComp = AlphaComposite.SRC_iN;
break;
case 5:

http://tailieuhay.com

87

Lp trnh ha trn Java 2D v 3D


alphaComp = AlphaComposite.SRC_OVER;
break;
case 6:
alphaComp = AlphaComposite.SRC_OUT;
break;
case 7:
alphaComp = AlphaComposite.CLEAR;
break;
}
return alphaComp;
}

public void paintComponent(Graphics g) {


super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;

Dimension d = getSize();
int w = d.width;
int h = d.height;

Bufferedimage

buffimg

new

Bufferedimage(w, h,
Bufferedimage.TYPE_iNT_ARGB);
Graphics2D

gbi

buffimg.createGraphics();

g2.setColor(Color.white);
g2.fillRect(0, 0, d.width, d.height);

http://tailieuhay.com

88

Lp trnh ha trn Java 2D v 3D


int rectx = w / 4;
int recty = h / 4;
gbi.setColor(new Color(0.0f, 0.0f, 1.0f,
1.0f));
gbi.fill(new

Rectangle2D.Double(rectx,

recty, 150, 100));


gbi.setColor(new Color(1.0f, 0.0f, 0.0f,
1.0f));
gbi.setComposite(ac);
gbi.fill(new

Ellipse2D.Double(rectx

rectx / 2, recty + recty / 2,


150, 100));
g2.drawimage(buffimg, null, 0, 0);
}
}
Kt qu ca chng trnh :

http://tailieuhay.com

89

Lp trnh ha trn Java 2D v 3D


3.3

Combining Areas to Create New Shapes


Cc Area c th c s dng to ra mt cch nhanh chng

cc Shape phc tp nh cc hnh trn v cc hnh vung.To mt


hnh th phc tp mi bng cch kt hp cc Area nh sau:
1.S dng cc Shape,to ra cc Area kt hp li.
2.Gi cc ton t nh phn thch hp: add,subtract,intersect,
exclusiveOr
V d,CAG c th c s dng to ra qu l ging nh hnh 3-2 di
y:

Cch thc hin:


Thn ca qu l c to ra bng cch kt hp cc thao tc trong 2
over- lapping Areas: circle v oval.Ci l c to ra bng cch thc hin
mt php giao trn hai vng trn chng ln nhau v sau c a vo
mt Shape n thng qua php hp.Vic np chng cc vng trn cn
c s dng to cung l thng qua hai php tr.
Chng trnh:

/*
* @(#)Pear.java

1.0

27/03/06

*/

http://tailieuhay.com

90

Lp trnh ha trn Java 2D v 3D

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;

import javax.swing.JApplet;
import javax.swing.JFrame;

/*
* Chuong trinh nay ve mot qua le,su dung phuong
thuc ket hop giua cac

vung.

*/

@SuppressWarnings("serial")
public class Pear extends JApplet {

Ellipse2D.Double circle, oval, leaf, stem;

Area circ, ov, leaf1, leaf2, st1, st2;

public void init() {


circle = new Ellipse2D.Double();
oval = new Ellipse2D.Double();
leaf = new Ellipse2D.Double();

http://tailieuhay.com

91

Lp trnh ha trn Java 2D v 3D


stem = new Ellipse2D.Double();
circ = new Area(circle);
ov = new Area(oval);
leaf1 = new Area(leaf);
leaf2 = new Area(leaf);
st1 = new Area(stem);
st2 = new Area(stem);
setBackground(Color.white);
}

public void paint(Graphics g) {


Graphics2D g2 = (Graphics2D) g;
Dimension d = getSize();
int w = d.width;
int h = d.height;
double ew = w / 2;
double eh = h / 2;
g2.setColor(Color.green);
leaf.setFrame(ew - 16, eh - 29, 15.0,
15.0);
leaf1 = new Area(leaf);
leaf.setFrame(ew - 14, eh - 47, 30.0,
30.0);
leaf2 = new Area(leaf);
leaf1.intersect(leaf2);
g2.fill(leaf1);
leaf.setFrame(ew

1,

eh

29,

15.0,

15.0);
leaf1 = new Area(leaf);

http://tailieuhay.com

92

Lp trnh ha trn Java 2D v 3D


leaf2.intersect(leaf1);
g2.fill(leaf2);
g2.setColor(Color.black);
stem.setFrame(ew, eh - 42, 40.0, 40.0);
st1 = new Area(stem);
stem.setFrame(ew

3,

eh

47,

50.0,

50.0);
st2 = new Area(stem);
st1.subtract(st2);
g2.fill(st1);
g2.setColor(Color.yellow);
circle.setFrame(ew

25,

eh,

50.0,

50.0);
oval.setFrame(ew - 19, eh - 20, 40.0,
70.0);
circ = new Area(circle);
ov = new Area(oval);
circ.add(ov);
g2.fill(circ);
}

public static void main(String s[]) {


JFrame f = new JFrame("Qu l");
f.addWindowListener(new

WindowAdapter()

{
public

void

windowClosing(WindowEvent e) {
System.exit(0);
}

http://tailieuhay.com

93

Lp trnh ha trn Java 2D v 3D


});
JApplet applet = new Pear();
f.getContentPane().add("Center",
applet);
applet.init();
f.pack();
f.setSize(new Dimension(600, 400));
f.show();
}

}
Kt qu ca chng trnh:

http://tailieuhay.com

94

Lp trnh ha trn Java 2D v 3D


Chng 4:
Hin th Font v vn bn

Bn c th s dng cc php bin i v cc cng c drawing ca


Java 2D API vi vn bn.Hn na, Java 2D API cn cung cp cc
lp lin quan ti vn bn h tr cc iu khin font v cc cch b tr vn
bn phc tp.N cn bao gm c lp Font v lp TextLayout.
Chng ny tp chung vo kh nng h tr cc kiu font v cc cch
b tr vn bn(text layout) bng vic s dng cc giao din v cc lp
trong java.awt v java.awt.font.
c thm thng tin v phn tch vn bn,bn tham kho thm vn
bn hng dn v java.text v theo di phn Writing Global Programs
trong b Java Tutorial.
c thm thng tin v cch s dng cng c b tr vn bn bng cch
s dng Swing,bn xem thm phn java.awt.swing.text v Using the
JFC/Swing Packages trong Java Tutorial.
4.1.Giao din v lp.
Bng di y lit k cc giao din v cc lp chnh s dng cho font
v textlayout.Hu ht trong s giao din v lp ny l thnh phn ca gi
ava.awt.font.Mt s,nh Font,l mt phn ca gi java.awt c s
dng m bo tnh tng thch vi cc phin bn trc ca b JDK.
Bng m t giao din v lp :
Giao din
MultipleMaste

Miu t
Miu t cc font kiu 1 vi nhiu ng.c thc thi

bi cc i tng Font m chng l cc kiu font nhiu

OpenType

ng c th truy cp n cc thit k iu khin.


Miu t cc font kiu m(Open Type)v kiu thc(True

http://tailieuhay.com

95

Lp trnh ha trn Java 2D v 3D


Type).c thc thi bi cc i tng Font m chng l
cc font Open Type hoc True Type c th truy cp n
cc bng fonts sfnt.
Lp
Font

M t
Miu t mt th hin ca b mt font(font face)

(java.awt)

t tp hp cc font face c sn trong my.H


tr vic c t chi tit v thng tin font v cung
cp kh nng truy cp ti cc thng tin v cc

FontRenderContext

kiu font v cc ng nt ca n.
ng gi thng tin cn thit cho cc php o vn

GlyphJustificationInfo

bn mt cch chnh xc.


Miu t cc thng tin v c tnh cn l ca mt
ng nt,nh trng lng (ch), u tin,s

GlyphMetrics
GlyphVector
GraphicAttribute

thu ht v gii hn.


Cung cp cc php o cho mt ng nt n.
Mt tp hp cc ng nt v cc v tr.
L lp c s cho thuc tnh TextLayout m n
c t mt i tng Graphics c nhungd
vo

vn

bn.c

ShapGaphicAttribute

thc

thi

bi
v

ImageGraphicAttribute,m n c th cho php


cc i tng Shape v i tng Image nhng
vo mt i tng TextLayout.C th phn lp
thc thi k t ty chn thay th cc
graphic.
ImageGraphicAttribute M rng:GraphicAttribute
Mt i tng GraphicsAttribute c s dng
LineBreakMeasurer

v cc nh bn trong mt TextLayout.
Chia mt khi vn bn thnh nhiu dng trong
cc i tng TextLayout m n khit bn trong
mt dong.

http://tailieuhay.com

96

Lp trnh ha trn Java 2D v 3D


LineMetrics

Cung cp kh nng truy cp n cc thc o


font cn thit hin th cc k t trn mt hng
v hin th tp cc hng .Cc thc o bao
gm phn nh ln,phn pha di,phn m,chiu
cao v thng tin ng c bn(ascent, descent,

leading, height, and baseline information).


ShapeGraphicAttribute M rng:GraphicAttribute
Mt i tng GraphicsAttribute

c s

dng v cc i tng Shape trong mt i


TextAttribute

tng TextLayout
nh ngha cc thuc tnh quan trng v cc gi
tr c s dng cho vic to bng vn bn(text

TextHitInfo

rendering).
Miu t thng tin hit test cho cc k t trong mt

TextLayout

i tng TextLayout
Thc thi:Cloneable
Cung cp mt s biu din ha c nh ca
cc d liu k t c nh kiu,bao gm c
cc vn bn hai chiu.

4.2.Cc khi nim v Font


Lp Font c ci tin h tr vic c t chi tit thng tin v
kiu font v c th s dng cc c tnh phc tp.
Mt i tng Font miu t mt th hin ca kiu font trong tp hp
cc font ca h thng.Cc font thng hay c s dng nh font Helvet
Bold v Courier Bold italic.
C ba kiu tn cho mt i tng Font- l logical name, family
name, v font face name:
http://tailieuhay.com

97

Lp trnh ha trn Java 2D v 3D


Mt logical name ca i tng Font l tn c nh x n mt
trong nhiu font c th c sn trong platform. logical name l tn font
c s dng ch r mt i tng Font trong JDK 1.1 v cc phin
bn trc .Khi ch nh mt i tng Font trong Java 2 SDK bn
nn s dng font face name thay cho logical name.Bn c th nhn
logical name t i tng font bng cch goi j phng thc getName.
nhn

danh

sch

cc

logical

name,hy

gi

java.awt.Toolkit.getFontList.
Mt family name ca i tng Font l tn trong h font m n nh
ngha cch thit k vic in thng qua mt s b mt,chng hn nh kiu
ch Helvetica.Bn ly h tn font bng cch s dng phng thc
getFamily.
Mt font face name ca i tng Font dng m ch kch thc
tht ca font c ci t trong h thng. l tn m bn c th s dng
khi ch r mt kiu font trong Java 2 SDK.N cng thng c m ch
cho font name.Bn c th ly tn font bng cch gi phng thc
geFontName. xc nh kiu font no c s dng trong h thng,bn
c th gi phng thc GraphicsEnvironment.getAllFonts.
Bn c th truy xut cc thng tin v mt i tng Font bng vic
gi phng thc getAttributes. Cc thuc tnh ca Font bao gm tn,kch
c font,transform,c tnh font nh hnh dng font.
Mt i tng LineMetrics ng gi cc thng tin v cc s o ca
Font,nh ascent,descent v khong cch gia cc dng ch.

Ascent l khong cch t ng baseline n ng

ascender.Khong cch ny miu t chiu cao ca cc ch vit hoa,nhng


mt s k t c th m rng v pha trn ca ng ascender.

Descent l khong cch t ng baseline n ng

descender.im thp nht ca hu ht cc k t s nm bn trong

http://tailieuhay.com

98

Lp trnh ha trn Java 2D v 3D


descent,nhng c mt s k t c th m rng v pha di ca ng
descender.

Leading c ni ti nh l khong cch t y ca ng

descender n nh ca dng tip theo.


Thng tin ny c s dng nh v mt cch chnh xc cc k
t dc theo mt dng,v cc ng c th lin quan n cc ng khc.
Bn c th truy xut nhng php o cc line bng vic s dng cc
phng thc getAscent, getDescent, v getLeading .Bn cng c th
truy xut thng tin v weight, baseline v underline ca Font thng qua
LineMetrics.

4.3

Cc khi nim v Text Layout.


Trc khi mt on ch c c hin th,n cn phi c ch r v

hnh dng cng nh v tr hin th bng vic s dng cc nt ch v cc


cch kt hp mt thch hp.Qu trnh ny c gi l text layout,bao gm
cc giai on sau:
Sp t cc ch s dng cc nt ch v cc cch kt hp thch
hp.
Ordering cc on text thch hp.
nh gi v b tr cc on text.

http://tailieuhay.com

99

Lp trnh ha trn Java 2D v 3D


Cc thng tin cho c s dng hin th text cng rt cn thit cho
vic biu din text nh caret positioning, hit detection, v highlighting.
pht trin cc phn mm c th trin khai trn ton cu,text phi c
th hin trn nhiu ngn ng khc nhau bng nhiu c th thch hp
vi quy tc ca cc h thng vn bn thch hp.
4.3.1 V ch.
Gyph(nt ch) l mt cch hin th trc quan cho mt hay nhiu k
t.Hnh dng,kch thc,v v tr ca glyph ph thuc vo vn cnh ca
n.Rt nhiu loi glyph c th c s dng miu t mt k t n
hoc nhiu k t kt hp vi nhau,ph thuc vo font v kiu dng(style).
V d nh trong on text vit bng tay,cc k t c bit c th th
hin cc hnh dng ch khc nhau ph thuc vo cch n kt hp vi cc
k t lin k vi n.
Trong mt s h thng vn bn,c bit l ch Rp, the context of a
glyph must always be taken into account .Khng ging ting Anh,cc
cursive form c tnh bt buc trong ch Rp.
Ph thuc vo tng context,cc cursive form c th khc nhau hon
ton v hnh dng.V d,ch heh trong ting Rp c bn cursive form

http://tailieuhay.com

100

Lp trnh ha trn Java 2D v 3D


nh trong hnh 4-2 di y:

Mc d bn kiu form ny ch khc nhau i cht so vi c form


khc,nhng nhng s thay i v hnh dng khng phi l s khc bit c
bn v cursive trong ting Anh.
Trong mt s ng cnh,hai glyph c th thay i hnh dng mt cch
c bn v kt hp vo form mt glyph n.Kiu kt hp ny c gi l
ligature.V d,hu ht cc font ting anh cha ligature nh trong hnh 43.Vic ha hp glyph a vo tnh ton phn nh ra trong k t f v kt
hp cc k t theo mt cch t nhin,thay v cc k t k nhau

http://tailieuhay.com

101

Lp trnh ha trn Java 2D v 3D


Cc ch ghp cng c s dng trong ting rp v cch s dng
ca mt s ch ghp is mandatory-n khng c chp nhn hin th
cc k t kt hp chnh xc m khng s dng ch ghp thch hp.Khi cc
ch ghp c to thnh t cc k t Rp,hnh dng thay i mt cch
c bn hn so vi ting Anh.V d,nh trong hnh 4-4 miu t cch hai
ch ci rp kt hp vi nhau thnh mt ch ghp khi chng xut hin
cng nhau.

4.3.2 Ordering Text


Trong ngn ng lp trnh Java,vn bn c m ha bng cch s
dng cc k t m ha Unicode.Vn bn s dng k t m ha Unicode
c lu tr trong b nh trong logical order. logical order l ni m
trong cc k t v cc t c c v ghi. logical order khng nht
thit phi ging nh visual order,l ni m trong cc glyph tng ng
c hin th.
Visual order cho cc glyph trong h thng ghi c th(script) c gi
l script order.V d, script order cho vn bn kiu Roman c b tr t
tri qua phi v script order cho cc vn bn Arabic v Hebrew c b
tr t phi sang tri.
Mt s h thng ghi(writing systems) c cc nguyn tc trong vic thm
cc script order cho vic sp xp cc glyph v cc t trong nhiu dng ca
vn bn.V d, cc s Arabic v Hebrew chy t tri qua phi,mc d cc
http://tailieuhay.com

102

Lp trnh ha trn Java 2D v 3D


k t chy t phi qua tri.(iu ny c ngha Arabic v Hebrew,ngay c
khi khng c cc vn bn bng ting Anh nhng vo,chng vn thc s l
(k thut) hai chiu)
Mt h thng ghi visual order phi khng c thay i ngay c khi
cc ngn ng ha trn vi nhau.iu ny c m t trong hnh 4-5,miu
t mt nhm t Arabic nhng vo mt cu vn bn ting Anh.
Ch :Trong v d ny v trong cc v d sau, cc vn bn Arabic v
Hebrew c hin th bng cc ch ci in hoa v cc khong cch gia
cc ch c hin th bng du gch di.Mi phn miu t chia thnh
hai phn:vic hin th ca cc k t c lu tr trong b nh(cc k t
trong logical order) sau l cch hin th ca nhng k t c hin
th(cc k t trong visual order).Cc s bn di khung k t ch nh
insertion offsets.

Hnh 4-5

Bidirectional Text

Cho d chng l mt phn trong mt cu ting Anh,cc t Arabic


c hin th trong cc Arabic script,t phi qua tri.
Khi mt dng vn bn vi mt s pha trn hai cch b tr t tri qua
phi v t phi qua tri c hin th, base direction s c ch
nh.Base direction l mt script order ca h thng ghi.V d,nu vn

http://tailieuhay.com

103

Lp trnh ha trn Java 2D v 3D


bn gc l ting Anh vi mt s ch Arabic c nhng vo,th base
direction s l t tri qua phi.Ngc li,nu vn bn gc l ting Arabic
vi mt s ch Anh nhng vo hoc cc con s,th base direction s l t
phi qua tri.
Base direction xc nh cc b tr trong mi on ca vn bn vi mt
common direction c hin th.Trong v d 5-4, base direction l t tri
qua phi.C ba hng b tr vn bn trong v d ny,vn bn ting Anh
on u ca cu chy t tri qua phi,vn bn Arabic chy t phi qua
tri,v cc vn bn khc chy t tri qua phi.
4.3.3 o v nh v vn bn
Tr khi bn lm vic vi font n cch,cc k t khc nhau trong kiu
font c chiu rng khc nhau.iu ny c ngha tt c cc v tr v kch
thc ca cc vn bn phi c tnh ton mt cch chnh xc vi cc k
t c s dng.V d, mt ct cc ch s c cn l phi c hin th
trong kiu font cn xng,bn khng th d dng s dng cc khng gian
m rng cho v tr ca cc vn bn. cn l cc ct mt cch ng
n,bn cn phi bit chnh xc chiu rng ca mi s m bn c th iu
chnh sao cho ph hp.
Cc vn bn thng s dng cch hin th theo nhiu dng v nhiu
kiu dng,nh theo kiu nt m v in nghing.Trong trng hp ny,cc
k t ging nhau c th c cc hnh dng khc nhau v chiu rng,ph
thuc vo cch n th hin ki u dng. c v tr ,kch thc v render
text chnh xc,bn cn phi kim tra mi k t ring l v kiu dng c
s dng cho k t .Tht may l lp TextLayout lm iu ny cho
bn.
hin th cc vn bn ng trong nhiu ngn ng chng hn nh
Hebrew v Arabic,mi k t cn phi c cn nhc v t vo bn trong
mt ng cnh vi cc k t bn cnh.Bi v hnh dng v v tr ca cc k

http://tailieuhay.com

104

Lp trnh ha trn Java 2D v 3D


t c th thay i c ph thuc vo tng ng cnh,vic cn nhc v sp
t cc on vn bn m khng cn xt n vn cnh l mt iu khng
c tn thnh.
4.3.4 H tr thao tc vi vn bn.
cho php ngi dng c th sa i text c hin th,bn phi:
Hin th du caret m n ch n ni mt k t mi s c thm
vo khi ngi dng thm vo text.
Di chuyn du caret v im chn trong cu tr li khi ngi dng
a vo.
Pht hin s la chn ca ngi dng(hit detection).
Lm ni bt on text c la chn.
4.3.4.1 Hin th du nhc
Trong cc text c th chnh sa c,du caret c s dng hin
th im chn hin ti,v tr trong on text ni m cc k t mi s c
chn vo.Thng thng,mt du caret c th hin l mt thanh thng
ng nhp nhy gia hai glyph.K t mi c chn vo v c hin th
ti v tr ca du caret.
Vic tnh ton v tr du caret c th rt phc tp,c bit l trong cc
text hai chiu.Cc on chn vo trong cc ng bin nh hng c hai
v tr c th chn bi v hai glyph ph hp vi khong k t khng
c hin th st ngay cc k t khc.iu ny c miu t trong hnh 46.Trong hnh v ny,cc du caret c th hin l cc du ngoc vung.

http://tailieuhay.com

105

Lp trnh ha trn Java 2D v 3D


Hnh 4-6

Dual Carets

K t v tr th 8 nm sau du _ v nm trc k t A.Nu ngi


dng mun thm mt k t Arabic vo ch ,glyph ca n c hin th
bn phi(pha trc) ca k t A.Cn nu ngi dng mun chn mt k
t English,glyph ca n c hin th bn tri(pha sau) ca du _.
lm c iu ny mt s h thng hin th hai du caret,mt
du l chnh (primary) cn mt du l ph (secondary).Du caret chnh
ch nh ni m mt k t chn vo c hin th khi hng ca k t
cng vi hng c s ca c on text.Cn du caret ph cho bit mt k
t chn vo s c hin th khi hng ca k t ngc vi hng c
s ca on text.Lp TextLayOut t ng h tr c hai du caret,cn lp
JtextComponent th khng.
Khi lm vic vi vn bn hai chiu,bn khng th n gin thm vo
b rng ca cc glyph trc mt khong trng ca k t tnh ton v tr
du caret.Nu bn lm vy,du caret c th hin ra ti v tr sai nh bn
thy trong hnh 4-7:

Figure 4-7 Caret Drawn incorrectly


du caret c th hin th mt v tr hp l,b rng ca cc glyph
pha bn tri ca khong trng cn phi c thm vo v ng cnh

http://tailieuhay.com

106

Lp trnh ha trn Java 2D v 3D


hin ti a vo tnh ton.Tr khi ng cnh c a vo tnh ton,cc
php o glyph s khng cn thit khp vi vic hin th.
4.3.4.2 Di chuyn du nhc.
Tt c cc trnh bin son vn bn u cho php ngi s dng di
chuyn du caret vi cc phm mi tn.Ngi s dng mong mun du
caret s di chuyn theo hng ca cc phm mi tn c n.T tri qua
phi ca on text,vic di chuyn cc khong trng thm vo rt n
gin:Phm mi tn phi lm tng khong trng c thm vo bng cn
phm mi tn tri lm gim i.Trong cc vn bn hai chiu hoc cc vn
bn c nhiu ch ghp,cch lm ny c th khin du caret nhy qua cc
glyph theo hng ca ng bin v di chuyn trong theo hng ngc
li.
di chuyn du caret mt cch mt m(smoothly) qua vn bn hai
chiu,bn cn phi tnh ton hng ca vn bn thi hnh..Bn ko th n
gin tng khong trng thm vo khi phm mi tn phi c n v gim
n kh phm mi tn tri c n.Nu khong trng thm vo hin ti nm
bn trong mt thi hnh ca cc k t t phi qua tri,th phm mi tn
phi c th lm gim khong trng thm vo v phm mi tn tri s lm
tng n.
Di chuyn du caret ngang qua hng ng bin l mt vic kh
phc tp nh trong hnh 4-8 di y:

http://tailieuhay.com

107

Lp trnh ha trn Java 2D v 3D


Figure 4-8 Caret Movement
Chc chn cc glyph s khng bao gi c du caret gia chng.thay
vo du caret di chuyn qua cc hin th ca glyph mt k t n.V
d,khng bao gi c mt du caret bn trong ch o v mt s bin m(an
umlaut) nu chng c hin th bng hai k t phn cch.Lp
TextLayOut

cung

cp

cc

phng thc

getNextRightHit

and

getNextLeftHit c th d dng di chuyn du caret mt cch mt m


qua cc vn bn hai chiu.
4.3.4.3 Hit Testing
Thng thng,mt v tr trong khng gian ca cng c phi c
chuyn thnh khng gian trng ca text.V d nh,khi ngi s dng
nhn chut vo vn bn c chn,v tr ca chut c chuyn thnh
khong trng v c s dng nh im cui ca vng la chn.Theo
mt cch logic,n c chuyn ngc thnh v tr ca du caret.
Khi bn lm vic vi vn bn hai chiu,mt v tr trc quan trong
phn hin th c th p ng cho hai offset khc nhau trong on vn bn
gc,nh trong hnh 4-9 di y:

Hnh 4-9

Hit Testing Bidirectional Text

Bi v mt v tr trc quan c th p ng cho hai offset khc nhau,


hit testing cc vn bn hai chiu khng phi l quan trng ca cc php o
b rng ca cc ng nt (measuring glyph widths) tr glyph ti cc v

http://tailieuhay.com

108

Lp trnh ha trn Java 2D v 3D


tr chnh xc c tm thy v sau nh x v tr n mt character
offset.
Bn c th thc hin hit testing bng vic s dng lp
TextLayout.hitTestChar. Thng tin v hit c ng gi trong i
TextHitinfo bao gm cc thng tin v cnh m vic hit c thy trn .
4.3.4.4 nh du vng la chn.
Mt vng cc k t c lc chn c hin th ha bng mt
vng c t sng, l vng m mi ng nt c hin th vi mu
tri ngc vi mu nn.
Vng c t sng,ging nh du caret,c nhiu phc tp trong cc vn
bn hai chiu hn l trong cc vn bn mt chiu(monodirectional
text).Trong vn bn hai chiu,mt di lin tc cc k t c th khng c
mt vng c t sng lin tc khi hin th.Ngc li,mt vng sng lin
tc cho thy mt cch trc quan mt di lin tc cc nt c th khng ph
hp vi mt k t n,di lin tip ca cc k t.
C hai cch la chn vng sng trong vn bn hai chiu:
Logical highlighting(vng sng logic) - Vi vng sng logic,cc
k t c la chn thng lin tip nhau trong mo hnh vn bn(text
model),v vng sng c la chn mt cch lin tip.Xem v d v
logical highlighting,xem hnh 4-10.

Visual highlighting(vng sng trc quan)

- vi visual

highlighting,bn c th c nhiu di cc k t c la chn,nhng vng


sng thng thng lin tip nhau.V d v visual highlighting,xem hnh 411.

http://tailieuhay.com

109

Lp trnh ha trn Java 2D v 3D

Hnh 4-10

Logical Highlighting (contiguous characters)

Hnh 4-11

Visual Highlighting (contiguous highlight region)

Logical highlighting n gin hn trong vic thc thi,cc k t c la


chn thng lin tip nhau.
4.3.5 Thc thi vic hin th vn bn trong ng dng Java .
Ph thuc vo Java APIs m bn s dng,bn c th c t hoc
nhiu cc iu khin v text layout (hin th vn bn) nh bn cn:
1. Nu bn mun hin th c mt khi text hoc cn cc iu khin

chnh sa text,bn c th s dng JtextComponent,n s thc hin


text layout cho bn. JtextComponent c thit k iu khin
vic cn thit ca hu ht cc ng dng v h tr cho cc vn bn
hai chiu. thm thng tin v JtextComponent bn xem thm
phn Using the JFC/Swing Packages ca b Java Tutorial.
2. Nu bn mun hin th mt on chui k t n gin,bn c th

gi i tng Graphics2D.drawString v yu cu Java 2D hin th


chui k t cho bn.Bn cng c th s dng drawString

http://tailieuhay.com

110

Lp trnh ha trn Java 2D v 3D


render(tr v) kiu ca xu k t v cc xu k t cha kiu vn
bn hai chiu. c thm thng tin v rendering text qua lp
Graphics2D,bn xem thm phn Rendering Graphics Primitives.
3. Nu bn mun thc thi vic chnh sa vn bn ca bn,bn c th

s dng TextLayout iu khin vic hin th vn bn(text


layout),t sng( highlighting),v hit detection.Cc tin li c
cung cp bi lp TextLayout cho hu ht cc trng hp ph
bin,bao gm cc xu vn bn vi vic pha trn cc kiu Font,pha
trn cc kiu ngn ng,v vn bn hai chiu. c thm thng tin
v cch s dng TextLayout,bn xem thm phn Managing Text
Layout.
4. Nu bn mun iu khin ton b vic lm th no text c

shape v c nh v tr,bn c th xy dng lp Glyphvector ca


bn bng cch s dng Font v sau render chng da trn lp
Graphics2D. c thm thng tin v cch thc thi cng c text
layput ca bn,bn xem thm phn implementing a Custom Text
Layout Mechanism .
Thng thng,bn khng cn phi thc hin text layout.Cho hu ht
cc ng dng,JtextComponent l gii php tt nht cho vic hin th cc
vn bn tnh v vn bn c th chnh sa.Tuy nhin, JtextComponent
khng h tr vic hin th du caret kp hoc cc on la chn lin tip
trong vn bn hai chiu.Nu ng dng ca bn yu cu nhng c tnh
trn,hoc bn thch thc hin vic chnh sa vn bn ca bn,bn c th
s dng Java 2D text layout APIs.
Qun l vic hin th vn bn.
Lp TextLayout h tr cc text m n cha ng nhiu kiu
dng(style) v nhiu k t t cc h thng writing khc nhau,bao gm

http://tailieuhay.com

111

Lp trnh ha trn Java 2D v 3D


Arabic v Hebrew(Arabic v Hebrew l cc kiu c bit kh hin th
bi v bn phi reshape v reorder vn bn c chp nhn hin th).
Lp TextLayout lm n gin vic s l cch hin th m cc php
o vn bn nu bn lm vic vi cc vn bn ch c ting Anh.Bng vic
s dng TextLayout bn c th t c vic to ch vi cht lng cao
m khng tn nhiu cng sc.
Text Layout Performance
Lp TextLayout gip bn trong vic xc nh v tr v th t ca cc
ng nt.Bn c th dng TextLayout :
Hin th cc vn bn mt hng v vn bn hai hng.
Hin th v di chuyn du caret.
Thc hin hit testing trn vn bn.
T sng vng vn bn c la chn.
ng hp,bn c th tnh ton cch b tr vn bn ca bn bng cch
iu khin mt cch chnh xc cc ng nt m bn s dng v ni
chng s c t(vo vn bn).Vic s dng cc thng tin nh cc kch
c ng nt(glyph sizes),cc bng co ko(kerning tables),v cch ghp
ch(ligature information),bn c th xy dng gii thut ca bn tnh
ton cch b tr vn bn,bypassing cng c b tr ca h thng(bypassing
the sys- tems layout mechanism). c thm thng tin bn xem thm
phn implementing a Custom Text Layout Mechanism.
4.4.1 Trnh by vn bn.
Lp TextLayout s t vn bn mt cch t ng,k c cc vn bn
mt hng(BiDi-bidirectional),vi vic to hnh dng(shaping) v
ordering chnh xc. shape v order mt cch chnh xc,cc ng nt
phi miu t cc ng(line) ca vn bn, TextLayout phi bit ton b
ng cnh ca vn bn:

http://tailieuhay.com

112

Lp trnh ha trn Java 2D v 3D


Nu vn bn nm trn mt ng n(single line) ,chng hn nh
mt t n ca nhn(label) cho mt nt lnh hoc mt ng trong hp
thoi(dialog box),bn c th xy dng mt i tng TextLayout trc
tip t vn bn.
Nu bn c nhiu vn bn hn l ch c mt dng hoc bn mun
chia vn bn t cc single line thnh cc on,bn khng th xy dng
i tng TextLayout mt cch trc tip.Bn phi s dng i tng
LineBreakMeasure p ng cc ng cnh.
Hng c bn ca mt vn bn thng c thit lp bng cc thuc
tnh(kiu dng) trn vn bn.Nu thuc tnh b thiu,lp TextLayout
s dng gii thut ca bng m hai chiu Unicode,v nhn c hng
c bn t cc k t bt u trong on.
Hin th du nhc kp.
Lp TextLayout cha cc thng tin v du caret nh hnh dng ca
du(caret shape),v tr v gc(angle).Bn c th s dng cc thng tin ny
d dng hin th du caret trong c vn bn mt hng v hai
hng.Khi bn v du caret cho vn bn mt chiu,vic s dng lp
TextLayout s m bo du caret c t v tr mt cch chnh xc.
TextLayout cung cp cho ta nhiu hnh dng mc nh ca du caret
v h tr mt cch t ng du caret kp,nh bn thy trong hnh 412.Cc v tr ca du caret cng c s dng nh ng bin gia
cc ng nt cho vic t sng v hit testing.

Hnh 4-12

http://tailieuhay.com

Angled Carets

113

Lp trnh ha trn Java 2D v 3D


Cn

vo

khong

trng

thm

vo,phng

thc

getCaretShapes tr v mt mng hai phn t ca shape:phn t th nht


cha du caret chnh v phn t th hai cha du caret ph,nu chng
cng tn ti. hin th c hai du caret(du caret kp),bn n gin ch
l v c hai shape ca du caret;cc du caret s c render mt cch t
ng ti nhng v tr chnh xc.
Nu bn mun s dng shape ca du caret mt cch ty thch,bn c
th tm n v tr v gc ca cc du caret bng i tng TextLayout v
v chng theo cch ca bn.
Trong v d di y,hnh dng ca du caret chnh v ph mc nh
c v trn cc mu khc nhau.y l cch ph bin to s khc bit
ca hai du caret .
Shape[]

caretShapes

layout.getCaretShapes(hit);
g2.setColor(PRiMARY_CARET_COLOR);
g2.draw(caretShapes[0]);
if

(caretShapes[1]

!=

null){

g2.setColor(SECONDARY_CARET_COLOR);
g2.draw(caretShapes[1]);
}
4.4.3 Di chuyn du nhc.
Bn cng c th s dng lp TextLayout xc nh kt qu ca
vic thm vo cc khong trng khi ngi s dng n cc phm mi tn
tri hoc phi.Da vo i tng TextHitinfo,n cho ta bit v tr hin ti
ca khong trng thm vo,phng thc getNextRightHit tr v kiu i
tng TextHitinfo m n cho bit chnh xc v tr ca khong trng thm

http://tailieuhay.com

114

Lp trnh ha trn Java 2D v 3D


vo khi phm mi tn phi c nhn.Cn phng thc getNextLeftHit
cho ta thng tin nh vy khi phm mi tn tri c nhn.
Trong v d di y,v tr hin ti ca khong trng chn vo c di
chuyn n ni tng ng khi m phm phi c n.
TextHitinfo

newinsertionOffset

layout.getNextRightHit(insertionOffset);
if

(newinsertionOffset

!=

null)

{
Shape[]

caretShapes

layout.getCaretShapes(newinsertionOffset);
//

draw

carets

...
insertionOffset

newinsertionOffset;

4.4.4 Hit Testing


Lp TextLayout cho ta mt cng c n gin hit testing vn
bn.Phng thc hitTestChar s ly ta x v y t chut(takes x and y
coordinates from the mouse) nh cc i s v tr v kiu i tng
TextHitinfo.i tng TextHitinfo cha khong trng chn vo cho v
tr v cnh m vic hit was on.
Trong v d di y,phng thc hitTestChar c gi trong i tng
TextLayout v sau phng thc getinsertindex c s dng ly
li khong cha trng.
TextHitinfo
int

hit

layout.hitTestChar(x,

insertindex

hit.getinsertindex();

http://tailieuhay.com

y);

115

Lp trnh ha trn Java 2D v 3D


4.4.5 nh du vng la chn.
Bn c th nhn mt i tng Shape m n hin th vng sng t i
tng TextLayout. i tng TextLayout s t ng gi ng cnh trong
mt mng khi tnh ton s chiu ca vng c t sng.Lp TextLayout
h tr c vng sng logic v vng sng trc quan.
Trong v d di y,vng sng c in vi mu sng v sau
i tng TextLayout s v ton b vng c in .y l mt cch
n gin hin th on vn bn c t sng.

Shape

highlightRegion

layout.getLogicalHighlightShape(hit1,
hit2);
graphics.setColor(HiGHLiGHT_COLOR);
graphics.fill(highlightRegion);
graphics.drawString(layout,

0,

0);

4.4.6 Querying Layout Metrics


Lp TextLayout cung cp cch truy cp n cc php o ha cho
ton b di vn bn hin th.Cc php o c sn trong lp TextLayout
bao gm ascent,descent,leading(khong cch gia cc dng ch so vi
dng c s), advance, visible advance v bounding rectangle (gii hn
ca khung hnh ch nht).
C nhiu hn mt i tng Font c th c lin kt vi mt i
tng TextLayout:s khc nhau v kiu dng khi thc thi c th s dng
cc kiu font khc nhau.Cc gi tr ascent v descent ca ton b kiu
font c s dng trong i tng TextLayout.Vic tnh ton gi tr
leading ca i tng TextLayout th phc tp hn nhiu,n khng c gi
tr leading cc i.

http://tailieuhay.com

116

Lp trnh ha trn Java 2D v 3D


Gi tr advance ca i tng TextLayout chnh l chiu di ca
n: l khong cch t cnh bn tri ca nt bn tri nht n cnh bn
phi ca nt bn phi nht.Gi tr advance thng c ch nh l total
advance.Cn gi tr visible advance l chiu di ca i tng
TextLayout m khng c cc khong trng.
Khung gii hn ca mt i tng TextLayout bao quanh ton b
vn bn trong phn b tr..N bao gm ton b cc n nt trc
quan(thy c) v cc du caret bin.(Mt s trong c th c ly t
gc hoc gc + advance).Khung gii hn c quan h vi ngun gc ca
i tng TextLayout,khng lin quan n v tr trn mn hnh.
Trong v d di y,vn bn trong mt i tng TextLayout c
v bn trong mt khung gii hn.

graphics.drawString(layout,
Rectangle2D

bounds

0,

0);

layout.getBounds();

graphics.drawRect(bounds.getX()-1,
bounds.getY()-1,
bounds.getWidth()+2,

bounds.getHeight()+2);

4.4.7 V vn bn trn nhiu dng.


Lp TextLayout cn c th c s dng hin th on text m
n c nhiu dng.V d nh,bn c th ly mt on ca vn bn,chng
cc line ca vn bn mt b rng no ,v hin th cc on nh
nhiu dng ca vn bn.
lm c iu ny,bn khng phi lm trc tip bng vic to ra
nhiu i tng TextLayout m bn hin th mi dng ca vn bnphng thc LineBreakMeasure s lm iu cho bn.Cc kiu vn bn
hai chiu khng th thc hin iu ny mt cch chnh xc tr khi tt c

http://tailieuhay.com

117

Lp trnh ha trn Java 2D v 3D


vn bn trong mt on c sn.Phng thc LineBreakMeasure ng
gi ton b thng tin v ng cnh to ra cc i tng TextLayout
chnh xc.
Khi vn bn c hin th qua nhiu dng,chiu di ca nhng dng
thng c xc nh bng chiu rng ca vng hin th.S chia
dng(Line breaking hay line wrapping) l vic xc nh ni m nhng
dng bt u v kt thc.

/*
* FontSelection.java
* 1.0
* 12/03/06
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.event.itemEvent;
import java.awt.event.itemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;

http://tailieuhay.com

118

Lp trnh ha trn Java 2D v 3D


import javax.swing.JApplet;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/*
* Applet nay hien thi mot xau voi lua chon cua
nguoi su dung.
*/

public

class

FontSelection

extends

JApplet

implements itemListener {
/**
*
*/
private static final long serialVersionUiD =
5469031020823166920L;

JLabel fontLabel, sizeLabel, styleLabel;

FontPanel fontC;

JComboBox fonts, sizes, styles;

int index = 0;
String fontchoice = "La chn Font";
http://tailieuhay.com

119

Lp trnh ha trn Java 2D v 3D


int stChoice = 0;

String siChoice = "10";

@SuppressWarnings("unchecked")
public void init() {

getContentPane().setLayout(new
BorderLayout());

JPanel topPanel = new JPanel();


JPanel fontPanel = new JPanel();
JPanel sizePanel = new JPanel();
JPanel stylePanel = new JPanel();
JPanel sizeAndStylePanel = new JPanel();

topPanel.setLayout(new BorderLayout());
fontPanel.setLayout(new

GridLayout(2,

sizePanel.setLayout(new

GridLayout(2,

stylePanel.setLayout(new

GridLayout(2,

1));

1));

1));
sizeAndStylePanel.setLayout(new
BorderLayout());

topPanel.add(BorderLayout.WEST,
fontPanel);

http://tailieuhay.com

120

Lp trnh ha trn Java 2D v 3D


sizeAndStylePanel.add(BorderLayout.WEST,
sizePanel);

sizeAndStylePanel.add(BorderLayout.CENTER,
stylePanel);
topPanel.add(BorderLayout.CENTER,
sizeAndStylePanel);

getContentPane().add(BorderLayout.NORTH,
topPanel);

fontLabel = new JLabel();


fontLabel.setText("Fonts");
Font newFont = getFont().deriveFont(1);
fontLabel.setFont(newFont);

fontLabel.setHorizontalAlignment(JLabel.CENTER);
fontPanel.add(fontLabel);

sizeLabel = new JLabel();


sizeLabel.setText("Kch C");
sizeLabel.setFont(newFont);

sizeLabel.setHorizontalAlignment(JLabel.CENTER);
sizePanel.add(sizeLabel);

styleLabel = new JLabel();


styleLabel.setText("Kiu ch");
http://tailieuhay.com

121

Lp trnh ha trn Java 2D v 3D


styleLabel.setFont(newFont);

styleLabel.setHorizontalAlignment(JLabel.CENTER);
stylePanel.add(styleLabel);

GraphicsEnvironment

gEnv

GraphicsEnvironment
.getLocalGraphicsEnvironment();
String

envfonts[]

gEnv.getAvailableFontFamilyNames();
Vector vector = new Vector();
for (int i = 1; i < envfonts.length; i+
+) {
vector.addElement(envfonts[i]);
}
fonts = new JComboBox(vector);
fonts.setMaximumRowCount(9);
fonts.additemListener(this);
fontchoice = envfonts[0];
fontPanel.add(fonts);

sizes

new

JComboBox(new

Object[]

{ "10", "12", "14", "16", "18" });


sizes.setMaximumRowCount(9);
sizes.additemListener(this);
sizePanel.add(sizes);

styles

new

JComboBox(new

Object[]

{ "PLAiN", "BOLD", "iTALiC",


http://tailieuhay.com

122

Lp trnh ha trn Java 2D v 3D


"BOLD & iTALiC" });
styles.setMaximumRowCount(9);
styles.additemListener(this);
sizes.setMaximumRowCount(9);
stylePanel.add(styles);

fontC = new FontPanel();


fontC.setBackground(Color.white);

getContentPane().add(BorderLayout.CENTER,
fontC);
}

public void itemStateChanged(itemEvent e) {


if

(e.getStateChange()

!=

itemEvent.SELECTED) {
return;
}

Object list = e.getSource();

if (list == fonts) {
fontchoice

(String)

fonts.getSelecteditem();
} else if (list == styles) {
index = styles.getSelectedindex();
stChoice = index;
} else {

http://tailieuhay.com

123

Lp trnh ha trn Java 2D v 3D


siChoice

(String)

sizes.getSelecteditem();
}
fontC.changeFont(fontchoice,

stChoice,

siChoice);
}

public static void main(String s[]) {


JFrame f = new JFrame("Chn kiu Font");
f.addWindowListener(new

WindowAdapter()

{
public

void

windowClosing(WindowEvent e) {
System.exit(0);
}
});
JApplet

fontSelection

new

FontSelection();
f.getContentPane().add(fontSelection,
BorderLayout.CENTER);
fontSelection.init();
f.setSize(new Dimension(550, 250));
f.setVisible(true);
}

class FontPanel extends JPanel {

http://tailieuhay.com

124

Lp trnh ha trn Java 2D v 3D


/**
*
*/
private static final long serialVersionUiD =
7850814263388447528L;
Font thisFont;

public FontPanel() {
thisFont = new Font("Arial", Font.PLAiN,
10);
}

public

void

changeFont(String

f,

int

st,

String si) {
integer newSize = new integer(si);
int size = newSize.intValue();
thisFont = new Font(f, st, size);
repaint();
}

public void paintComponent(Graphics g) {


super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
int w = getWidth();
int h = getHeight();

g2.setColor(Color.darkGray);
g2.setFont(thisFont);

http://tailieuhay.com

125

Lp trnh ha trn Java 2D v 3D


String change = "Chn Font ,c ch v

kiu ch.";

FontMetrics

metrics

g2.getFontMetrics();
int width = metrics.stringWidth(change);
int height = metrics.getHeight();
g2.drawString(change, w / 2 - width / 2,
h / 2 - height / 2);
}
}

Kt qu ca chng trnh:

http://tailieuhay.com

126

Lp trnh ha trn Java 2D v 3D


Chng 5
To nh

Java 2D API h tr 3 model v nh.


Model khch ch (producer/consumer) h tr trong phin bn
trc can bn JDK.
Model trung gian (immediate mode model) c gii thiu tr
ong Java 2 SDK release.
Model ng ng tng thch vi model trung gian v sex c
ci t y trong bn Java Advanced imaging API sp ti.
Trong chng ny chng ta tp trung vo cc i tng v cc cng
ngh ca model to nh mode trung gian(immediate mode). Cc lp mode
trung gian v cc giao din can Java 2D API cuang cp cc cng ngh
cho vic x l nh x cc im vi d li ca n trong b nh. Hm API
ny h tr cho vic truy nhp d liu nh tng cc nh dng lu tr khc
nhau v thao tc vi d liu nh qua viloi php ton lc.
5.1 Cc giao din v cc lp
Cc API to nh mode trung gian trong Java 2D API c th
c nhm li trong 6
Cataloge sau: Cc giao din, cc lp d liu nh, cc lp thao ton t nh,
cc lp model mu, cc lp model mu, cc ngoi l (exceptions).

http://tailieuhay.com

127

Lp trnh ha trn Java 2D v 3D


5.1.1 Cc giao din imaging (imaging interfaces)
Interface
BufferedImageOp

Description
M t cc thao tc vo n ra n thc hin
trn i tng Bufferedimage. c ci t
bi

AffineTransformOp,

ColorConvertOp,

ConvolveOp, LookupOp v RescaleOp.


nh ngha cc thao tc vo ra n thc hin

RasterOp

trn cc i tng Raster c ci t bi


AffineTransformOp,

BandCombineOp,

ColorConvertOp, ConvolveOp, LookupOp v


RescaleOp.
RenderedImage

nh ngha giao thc cho cc i tng cha


hoc c th sn sinh d liu nh trong kiu

WritableRenderedImag

Rasters
M rng Renderedimage

nh ngha cac giao thc cho cc i tng


cha hoc sn sinh d liu nh trong kiu
Raster c th c thay i.

TileObserver

nh ngha cc i tng mun c bo khi


trang

thi

chnh

sa

ca

mt

WritableRenderedimage thay i.
.

5.1.2 Cc lp d liu nh(image Data Classes)

Clases
Bufferedimage

Description
M rng image ci t WriteableRenderedimage
Mt nh vi mt b m d liu c th truy cp.

http://tailieuhay.com

128

Lp trnh ha trn Java 2D v 3D


Mt Bufferedimage c mt ColorModel v mt
ByteLookupTable

Raster d liu nh.


M rng LookupTable

DataBuffer

Mt LookupTable cha cc bye d liu.


Bao bc mt hay nhiu cc mng d liu cha d

DataBufferByte

liu
im. Mi mng c gi l bank
M rng DataBuffer. Mt b m d liu cha cc
byte d liu. ( dng trong Java Advanced

DataBufferint

imaging API)
M rng DataBuffer (Final))
Mt b m d liu cha d liu s nguyn (a

DataBufferShort

dng trong Java Avance imaging API)


M rng DataBuffer (Final)
Mt b m d liu cha d liu s nguyn short

DataBufferUShort

( dng trong Java Advanced imanging API).


M rng DataBuffer (Final)
Mt b m d liu cha d liu s nguyn short
khng du.
Kernel

Mt ma trn m t cch nhp mt d

liu v cc im bin ca
LookupTable

n tc ng n gi tr

ca im trong b lc ConvolveOP
M rng Object
Mt bng nh x cc gi tr t d liu im n

Raster

bng ti cc gi tr mu.
Mt mng cc im gc t bn c th nhn v
cc d liu im. Mt Raster cha mt DataBuffer

ShortLookupTable

v mt SampleModel.
M rng LookupTable
Mt bng tham chiu cha cc d liu s nguyn

WritableRaster

short
M rng Raster
Mt Raster c th chnh sa.

http://tailieuhay.com

129

Lp trnh ha trn Java 2D v 3D

5.1.3 image Operation Classes


Clases
AffineTransformOp

Description
Ci t : BufferedimageOp, RasterOp
Mt lp nh ngha mt bin i affine thc
hin mt s nh x tuyn tnh t cc to 2D
trong mt nh ngun hoc Raster sang cc to
2D trong nh ch hoc Raster. Lp ny c th thc
hin c nh x song nh v cc php ton bin i

BandCombineOp

lng ging gn nht.


Ci t RasterOp
Dng mt ma trn xc nh, thao tc ny thc hin
mt s kt hp tuyn tnh tu ca cc di band

trong mt Raster.
BufferedimageFilter M rng imageFilter
Mt imageFilter cung cp mt cch n gin ca
vic sng mt BufferedimageOp(ton t mt
ngun
ColorConvertOp

/mt

ch

n)

lc

mt

Bufferedimage hoc Raster.


Ci t BufferedimageOp, RasterOp
Thc hin s chuyn i d liu mu im theo

ConvolveOp

im trong nh ngun.
Ci t BufferedimageOp, RasterOp
Dng mt Kernel thc hin ci thin nh ngun.
Mt s ci thin l mt s tao tc khng gian ni
cc im cn bin vo c nhn bi bi mt gi
tr Kernel to gi tr ca im ra. Kernel nh
ngha mt cch ton hc quan h gia cc im
trong quan h lng ging trung gian ca im vo
v im ra.

http://tailieuhay.com

130

Lp trnh ha trn Java 2D v 3D


LookupOp

Ci t BufferedimageOp, RasterOp
Thc hin thao tc tham chiu t ngun ti ch.
Vi cc Raster, cc thao tc tham chiu trn cc gi
tr mu, cc Bufferedimage, thao tc tham chiu

RescaleOp

trn thnh phn mu v thnh phn alpha.


Ci t BufferedimageOp, RasterOp
Thc hin vic v li im bi im (pixel by pixel
rescaling) ca d li trong nh ngun bi vic nhn
mi gi tr im vi h s v sau thm vo mt
phn chnh (an offset).

5.1.4 Sample Model Classes

Clases
BandedSampleModel

Description
M rng

ComponentSampleModel

(Final)
Cung cp truy cp d liu nh cha
ging nh cc mu cha nh nhng
di (bands) trong cc bank ring bit
ca DataBuffer. Mt im bao gm
ComponentSampleModel

mt mu t mi di (band)
M rng SampleModel
Cung cp truy cp ti d liu nh cha
vi mt mu ca mt im tp trung
trong mi phn t ring bit ca
DataBuffer. Cc loi chn im khc

MultiPixelPackedSampleModel
PixelinterleavedSampleModel

nhau c h tr
M rng SampleModel
M rng ComponentSampleModel
Cung cp truy nhp ti d liu nh
cha d liu mu cho mi im trong

http://tailieuhay.com

131

Lp trnh ha trn Java 2D v 3D


cc phn t hiu chnh ca mng d
liu, v tt c cc phn t trong bank
n ca mt DataBuffer.
Mt lp tru tng nh ngha mt c

SampleModel

ch cho vic xut ra d liu mu t mt


nh m khng bit cch d liu c
SinglePixelPackedSampleMode

cha trong mt DataBuffer.


M rng SampleModel

Cung cp truy nhp ti d liu nh


c bo qun vi tt c cc mu ph
thuc vo cc im ring l gi vo
trong mt phn t ca mt DataBuffer.

Color Model Classes

Clases
ColorModel

Description
Ci t lp trong sut nh ngha cc
phng thc cho vic chuyn i t cc gi
tr im nh ti cc thnh phn mu nh ,

ComponentColorModel

xanh l cy, xanh da tri (red, green, blue).


M rng ColorModel
Mt ColorModel c th gi mt ColorSpace
c th thay i, mt mng cc thnh phn
mu ng vi ColorSpace. Lp ny c th
c dng biu din hu ht cc model
mu trn hu ht cc loi thit b ho
(GraphicsDevices)

http://tailieuhay.com

132

Lp trnh ha trn Java 2D v 3D


DirectColorModel

M rng lp PackedColorModel JDK1.1 .


Mt ColorModel biu din cc gi tr c
cc thnh phn mu RGB nhng trc tip
trong cc bit ca im. Model mu ny
tng t vi mt

X11 TrueColor. RGB

ColorModel mc nh c tr v bi
ColorModel.getRGBdefault
DirectColorModel.
PackedColorModel

nh

mt

indexColorModel

Extends: ColorModel
M rng ColorModel.
Mt ColorModel tru tng biu din cc
gi tr im c cc thnh phn nhng trc
tip

trong

cc

bit

ca

DirectColorModel

mt

im.
rng

PackedColorModel h tr cc im cha
SampleModel

cc thnh phn mu RGB.


Mt lp tru tng nh ngha mt c ch
cho vic xut ra d liu mu t mt nh m
khng bit cch d liu c cha trong
mt DataBuffer.

5.1.6 Exception Classes

Clases
imagingOpException

Description
M rng RuntimException.
a ra nu mt trong cc phng thc
BufferedimageOp hoc RasterOp khng th

RasterFormatException
http://tailieuhay.com

x l nh.
M rng RuntimException.
133

Lp trnh ha trn Java 2D v 3D


To ra nu c mt thng tin b tr khng
hp l trong Raster.

5.2

Immediate Mode imaging Concepts

Model to nh mode trung gian h tr cc phn gii c nh cha


trong b nh. Model cng h tr cc thao tc lc trn d liu nh. Mt s
cc lp v cc giao din c dng trong model ny

Hnh 5-1

Bufferedimage v cc lp h tr.

Nh hnh 5-1, Bufferedimage cung cp vic qun l nh chung. Mt


Bufferimage c th c to trc tip trong b nh v c dng gi
v thao tc d liu nh nhn t mt file hoc URL. Mt
Bufferedimage c th c hin th dng bt c i tng Graphics2D
no cho mt thit b mn hnh, hoc y ti bt c ch no khc dng
ng cnh tng thch Graphics2D. Mt i tng Bufferedimage cha 2
i tng khc: mt Raster v mt ColorModel.
Lp Raster cung cp qun l d liu nh. N biu din to de-cac
ca nh v duy tr d liu nh trong b nh, v cung cp mt c ch cho
http://tailieuhay.com

134

Lp trnh ha trn Java 2D v 3D


tao nh v nhiu nh nh t mt b m d liu nh n. N cng cung
cp cc phng thc cho vic truy cp cc im xc nh vi mt
nh(image). Mt i tng Raster cha hai i tng khc, mt
DataBuffer v mt SampleModel.
Lp DataBuffer gi d liu im trong b nh.
Lp SampleModel th hin d liu trong b m v cung cp no nh
cc im ring r hoc di im ch nht.
image Package cung cp thm cc lp nh ngha cc thao tc lc
trn cc i tng Bufferedimage v Raster. Mi thao tc x l nh
c nhng trong lp ci t giao din BufferedimageOp, giao din
RasterOp, hoc c hai giao din. lp thao tc nh ngha cc phng thc
lc (filter) thc hin thao tc nh thc s.
Hnh 5-2 minh ho model c bn cho Java 2D API image x l
nh.

Cc thao tc h tr bao gm:


Bin i Affine
Amplitude scaling
Lookup-table modification
Linear combination of bands
Color conversion
http://tailieuhay.com

135

Lp trnh ha trn Java 2D v 3D


Convolution
Ch rng nu bn thch hin th v thao tc cc nh, bn ch cn
hiu lp Bufferedimage v cc lp thao tc lc. Mt khc, nu bn c
nh vit cc b lc hoc trc tip truy nhp d liu nh, bn cn phi
hiu cc lp lin quan vi Bufferedimage.
5.2.1 Terminology
y c vi khi nim c dng qua cc tho lun di y:
Cc phn t d liu-Data Elements: cc loi nguyn t dng nh l cc
n v lu tr d liu nh. Cc Data element l cc thnh vin ring l
ca mt mng DataBuffer. B tr (layout)ca cc phn t trong b m d
liu l c lp vi cch biu in ca d liu nh l cc im bi mt
SampleModel ca nh.
Cc mu - Samples: Cc thnh vin ring bit ca cc im ca mt
nh. Mt SampleModel cung cp mt c ch cho vic chuyn i cc
phn t trong DataBuffer sang cc im v cc mu ca n. Cc mu ca
mt im c th biu din cc gi tr nguyn thu trong model mu c
th. V d, mt im trong model mu RGB bao gm 3 mu : red, green
v blue.
Cc thnh phn - Components: Cc gi tr ca cc im c lp vi
s biu din mu. S phn bit gia thnh phn(component) v
mu(sample) l hu ch vi indexColorModel, ni m cc thnh phn
im c nh ch s sang LookupTable.
Di - Band: Tp tt c cc mu ca mt loi trong mt nh, ging nh
tt c cc mu mu hoc tt c cc mu mu xanh l cy. D liu im
c th c cha trong mt s cch, h tr hai trong Java 2D API ang
c t hp v thm vo. Lu tr tp hp t chc d liu nh bi cc di
(bands), v mt im c trang b mt d liu mu t v tr mu vi

http://tailieuhay.com

136

Lp trnh ha trn Java 2D v 3D


mng n cha tt c cc im, v cc di bao gm tp cc mu cng ch
s v tr trong mi im.
Cc nguyn t - Primaries: Cc thnh vin phn bit ca mt gi tr
mu trong mt model mu xc nh, v d model RGB dng cc gi tr
mu t cc nguyn t red, green, v blue.
5.3

Using Bufferedimages
Lp Bufferedimage l lp chnh h tr mode to nh trung gian. N

cng qun l mt nh trong b nh, cung cp cc cch lu cc d liu


im, biu din d liu im, v y d liu im ti mt Graphics hoc
ng cnh Graphics2D.
5.3.1 Creating a Bufferedimage
to mt Bufferedimage, gi Component.createimaget, hm ny
tr v mt Bufferedimage cc c tnh v ca n tng ng cc thnh
phn dng to n. nh c to l khng r , phn ni v phn nn
c cc mu ca cc thnh phn bn khng th hiu chnh trong ca
mt nh.Bn c th dng k thut ny khi bn mun lm gp i b m
v nh cho s ng trong mt thnh phn.

public

Graphics2D

createDemoGraphics2D(Graphics
Graphics2D

g2

int

width

int

height

if

(offimg

width

g)

null;

getSize().width;
=
==

getSize().height;
null

||

offimg.getWidth()

!=

||

offimg.getHeight()
http://tailieuhay.com

!=

height)

{
137

Lp trnh ha trn Java 2D v 3D


offimg

(Bufferedimage)

createimage(width,

height);
}
if

(offimg

g2

!=

null)

offimg.createGraphics();

g2.setBackground(getBackground());
}
//

..

width,

clear

canvas

.. g2.clearRect(0,

0,

height);

return
}
Bn cng c th to mt Bufferedimage trng trong b nh dng
mt vi hm to c cung cp.
5.3.2 Drawing in an Offscreen Buffer
Lp Bufferedimage c th uc ng chun b cc phn t ho
khng hin th (offscreen )sau copy chng ra mn hnh. K thut ny
hu ch c bit khi mt graphic phc tp hoc dng lp li. V d, nu
bn mun hin th`hnh nh tinh vi trong vi ln, bn c th v n mt ln
trong b m offscreen v sau copy n ti cc v tr khc nhau trn ca
s. Bng vic v cc hnh mt ln v vic sao chp n bn c th hin th
ho nhanh hn.
Java.awt package c kh nng dng cc b m offsceam bi iu
ny bn v mt i tng nh cng cch m bn v ra ca s. Tt c cc

http://tailieuhay.com

138

Lp trnh ha trn Java 2D v 3D


tnh nng y (rendering) Java 2D API c th c dng khi v cc
nh offscreen.
Cc b m offscreen thng c dng cho hot ho. V d, bn c
th dng mt b m offscreen v mt i tng mt ln v sau
cho n chuyn ng trong mt ca s. Tng t, bn c th dng mt b
m offscreen cung cp s hi tip nh khi ngi dng di chuyn mt
hnh dng chut. Thay vo vic v li hnh ti mi v tr, bn c th v
hnh mt ln ra b m offscreen v sau copy n ti v tr chut nh
khi ngi dng th chut(drag the mouse).

Hnh 5-3Using an Offscreen Buffer


Hnh 5-3 m t cch mt chng trnh c th v ra mt offscreen
image sau sao chp n ra mt ca s nhiu ln. Ln cui cng nh
c sao chp, n c bin i. Ch rng s bin i nh thay cho
vic v li n vi s bin i c th kt qu khng c tho mn.
5.3.2.1 Creating an Offscreen Buffer
http://tailieuhay.com

139

Lp trnh ha trn Java 2D v 3D


Cch n gin nht to ra mt image m bn c th dng nh mt
offscreen buffer l dng phng thc Component.createimage.
Bng vic to mt image m khng gian mu ca n, su, v b tr
cc im chnh xc vi ca s trong bn ang v, image c th c
a ti (blitted) thit b ho mt cch hiu qu. iu ny cho php
hm drawimage lm vic nhanh chng.
Bn cng c th to mt i tng Bufferedimage trc tip dng nh
l mt offscreen buffer. iu ny rt hu ch khi bn cn iu khin qua
kiu ca offscreen hoc trong sut.
Bufferedimage h tr vi kiu nh ngha trc:
TYPE_3BYTE_BGR
TYPE_4BYTE_ABGR
TYPE_4BYTE_ABGR_PRE
TYPE_BYTE_BiNARY
TYPE_BYTE_GRAY
TYPE_BYTE_iNDEXED
TYPE_CUSTOM
TYPE_iNT_ARGB_PRE
TYPE_iNT_ARGB
TYPE_iNT_BGR
TYPE_iNT_RGB
TYPE_USHORT_555_RGB
TYPE_USHORT_565_RGB
TYPE_iNT_GRAY
Mt i tng Bufferedimage c th cha mt knh alpha. Trong
hnh 5-3, mt knh alpha c dng phn bit cc vng c v v
khng c v, cho php mt hnh dng bt quy tc xut hin qua cc
hnh m bn v (trong trng hp ny, mt hnh ch nht bng). Trong

http://tailieuhay.com

140

Lp trnh ha trn Java 2D v 3D


vi trng hp khc, bn c th dng mt knh alpha trn cc mu ca
mt nh mi vo n trong mt nh tn ti.
Ch : tr khi bn cn mt d liu nh alpha cho r rng, nh vi
mt hnh nh dng bt thng biu din trong hnh 5-2, bn nn trnh
to mt b m offscreem alpha. Dng alpha ni n khng cn lm
chm hiu nng render.
GraphicsConfiguration cung cp cc phng thc thun tin t ng
to cc b m nh trong nh dng tng thch vi cu hnh ca bn.
Bn cng c th ly v cu hnh ho lin kt vi thit b ho trn
ca s tp trung ly thng tin, bn cn khi to mt i tng
Bufferedimage thch hp

5.3.2.2 Drawing in an Offscreen Buffer


v trong mt b m nh, Gi Bufferimage.createGraphics() , tra
v mt i tng Graphics2D. Vi i tng ny, c th gi tt c cc
phng thc Graphics2D v cc hnh nh nguyn t, text, v render
cc hnh nh khc trong image. K thut v ny h tr vic rung ng v
cc ci thin khc c cung cp bi 2D imaging package.
on code di y minh ho s dng offscreen buffering :
public

void

Graphics2D

update(Graphics
g2

g){

(Graphics2D)g;

getSize();

if(firstTime){
Dimension

dim

int

dim.width;

int

dim.height;

area
bi
big

=
=

new

Rectangle(dim);

(Bufferedimage)createimage(w,
=

h);

bi.createGraphics();

http://tailieuhay.com

141

Lp trnh ha trn Java 2D v 3D


rect.setLocation(w/2-50,
big.setStroke(new
firstTime

h/2-25);

BasicStroke(8.0f));

false;

Clears

the

}
//

previously

rectangle

was

drawn. big.setColor(Color.white);

big.clearRect(0,

0,

//

fills

Draws

that

and

rectangle

area.width,
the

to

area.height);

newly

positioned

the

buffer.

big.setPaint(strokePolka);
big.draw(rect);

big.setPaint(fillPolka);

big.fill(rect);
//

Draws

the

buffered

screen. g2.drawimage(bi,

0,

image
0,

to

the

this);

}
5.3.3 Manipulating Bufferedimage Data Directly
Cng vi vic v nh trc tip trong Bufferedimage, bn c th truy
cp trc tip v x l d liu im nh trong 2 cch. Nhng cch ny hu
ch nu vn ang ci t giao din b lc BufferedimageOp nh c
m t trong chng x l v ci thin nh.
Bn cng c th dng phng thc Bufferedimage.setRGB t
trc tip gi tr ca mt im hoc mt mng cc im ti mt gi tr
RGB xc nh. Ch rng, khng c s lay ng khi bn modify cc

http://tailieuhay.com

142

Lp trnh ha trn Java 2D v 3D


im mt cch trc tip. Bn cng c th x l d liu im nh bi vic
x l mt i tng WritableRaster lin kt vi mt Bufferedimage
5.3.4 Filtering a Bufferedimage
Bn c th ng dng mt b lc cho mt Bufferedimage dng mt
i tng ci t BufferedimageOp. Vic lc v cc lp cung cp giao
din lc tho lun trong phn X l v ci thin nh (image Processing
and Enhancement).
5.3.5 Rendering a Bufferedimage
render mt b m nh vo trong mt ng cnh c th, gi hm
drawiamge ca ng cnh ca i tng Graphics. V d khi rendering
trong

phng thc Component.paint, bn gi drawimage() trn i

tng ho truyn cho phng thc.

public

void

paint(Graphics

if

(getSize().width

getSize().height

<=

g)

<=

||

0)

return;
Graphics2D
if

g2

(offimg

!=

(Graphics2D)
null

g2.drawimage(offimg,

&&
0,

g;

isShowing())
0,

this);

}
}
Chng trnh v d:
http://tailieuhay.com

143

Lp trnh ha trn Java 2D v 3D

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
import java.awt.image.*;
public class BufferedShapeMover extends Applet {
static protected Label label;
public void init() {
setLayout(new BorderLayout());
add(new BSMCanvas());
label = new Label("t hnh ch nht ny
xung quanh vng frame.");
add("South", label);
}
public static void main(String s[]) {
Frame

new

Frame("BufferedShapeMover");
f.addWindowListener(new

WindowAdapter()

{
public

void

windowClosing(WindowEvent e) {
System.exit(0);
}
});

http://tailieuhay.com

144

Lp trnh ha trn Java 2D v 3D


Applet

applet

new

BufferedShapeMover();
f.add("Center", applet);
applet.init();
f.pack();
f.setSize(new Dimension(550, 250));
f.show();
}
}
class

BSMCanvas

extends

Canvas

implements

MouseListener, MouseMotionListener {
Rectangle

rect

new

Rectangle(0,

0,

100,

50);
Bufferedimage bi;
Graphics2D big;
int last_x, last_y;
boolean firstTime = true;
TexturePaint fillPolka, strokePolka;
Rectangle area;

http://tailieuhay.com

145

Lp trnh ha trn Java 2D v 3D


boolean pressOut = false;
public BSMCanvas() {
setBackground(Color.white);
addMouseMotionListener(this);
addMouseListener(this);
bi

new

Bufferedimage(5,

5,

Bufferedimage.TYPE_iNT_RGB);
big = bi.createGraphics();
big.setColor(Color.pink);
big.fillRect(0, 0, 7, 7);
big.setColor(Color.cyan);
big.fillOval(0, 0, 3, 3);
Rectangle r = new Rectangle(0, 0, 5, 5);
fillPolka = new TexturePaint(bi, r);
big.dispose();
bi

new

Bufferedimage(5,

5,

Bufferedimage.TYPE_iNT_RGB);
big = bi.createGraphics();
big.setColor(Color.cyan);
big.fillRect(0, 0, 7, 7);
big.setColor(Color.pink);
big.fillOval(0, 0, 3, 3);
r = new Rectangle(0, 0, 5, 5);
strokePolka = new TexturePaint(bi, r);
big.dispose();
}

http://tailieuhay.com

146

Lp trnh ha trn Java 2D v 3D


public void mousePressed(MouseEvent e) {
last_x = rect.x - e.getX();
last_y = rect.y - e.getY();
if (rect.contains(e.getX(), e.getY())) {
updateLocation(e);
} else {
BufferedShapeMover.label
.setText("u tin t con
tr ln hnh ch nht v ko.");
pressOut = true;
}
}
public void mouseDragged(MouseEvent e) {
if (!pressOut) {
updateLocation(e);
} else {
BufferedShapeMover.label
.setText("u tin t con
tr ln hnh ch nht v ko.");
}
}
public void mouseReleased(MouseEvent e) {
if (rect.contains(e.getX(), e.getY())) {
updateLocation(e);

http://tailieuhay.com

147

Lp trnh ha trn Java 2D v 3D


} else {
BufferedShapeMover.label
.setText("u tin t con
tr ln hnh ch nht v ko.");
pressOut = false;
}
}
public void mouseMoved(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void updateLocation(MouseEvent e) {
rect.setLocation(last_x

e.getX(),

last_y + e.getY());
if (checkRect()) {
BufferedShapeMover.label.setText("Hnh

ch

nht v tr : "

http://tailieuhay.com

148

Lp trnh ha trn Java 2D v 3D


+

rect.getX()

"-

"

rect.getY());
} else {
BufferedShapeMover.label
.setText("ng c gng a
hnh ra ngoi frame.");
}
repaint();
}
public void paint(Graphics g) {
update(g);
}
public void update(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
if (firstTime) {
Dimension dim = getSize();
int w = dim.width;
int h = dim.height;
area = new Rectangle(dim);
bi = (Bufferedimage) createimage(w,
h);
big = bi.createGraphics();
rect.setLocation(w / 2 - 50, h / 2 25);
big.setStroke(new
BasicStroke(8.0f));

http://tailieuhay.com

149

Lp trnh ha trn Java 2D v 3D


firstTime = false;
}
big.setColor(Color.white);
big.clearRect(0,

0,

area.width,

area.height);
big.setPaint(strokePolka);
big.draw(rect);
big.setPaint(fillPolka);
big.fill(rect);
g2.drawimage(bi, 0, 0, this);
}
boolean checkRect() {
if (area == null) {
return false;
}
if

(area.contains(rect.x,

rect.y,

100,

50)) {
return true;
}
int new_x = rect.x;
int new_y = rect.y;
if ((rect.x + 100) > area.width) {
new_x = area.width - 99;
}
if (rect.x < 0) {

http://tailieuhay.com

150

Lp trnh ha trn Java 2D v 3D


new_x = -1;
}
if ((rect.y + 50) > area.height) {
new_y = area.height - 49;
}
if (rect.y < 0) {
new_y = -1;
}
rect.setLocation(new_x, new_y);
return false;
}
}
5.4

Managing and Manipulating Rasters


Mt i tng Bufferedimage dng mt Raster qun l mng d

liu im 2 chiu. Lp Raster nh ngha cc trng cho to h thng


ca nh- rng , cao, v gc to . Mt i tng Raster t n dng
2 i tng qun l d liu im, mt DataBuffer v mt
SampleModel. DataBuffer l i tng lu gi d liu im cho raster
cung cp s biu din bn trong ca d liu im t DataBuffer.

5.4.1 Creating a Raster


Trong hu ht cc trng hp, khng cn phi to mt Raster trc
tip, bi v mt Raster c cung cp vi bt c Bufferedimage bn to
trong b nh. Tuy nhin, mt trong nhng hm khi to ca
Bufferedimage cho php to mt Raster bi truyn vo trong mt
WritableRaster.

http://tailieuhay.com

151

Lp trnh ha trn Java 2D v 3D


Lp Raster cung cp mt s sn sinh (factory) hm tnh cho to ra
cc Raster vi DataBuffers v SampleModels bn xc nh. Bn cng c
th dng cc b sn sinh ny khi ci t cc lp b lc RasterOp.
5.4.2 Parent and Child Rasters
Lp Raster kt hp tng cc raster cha v con. iu ny c th ci
tin hiu qu lu tr bng vic cho php to bt k s b m nh t cng
mt cha. Cha v cc con ca n tham chiu ti cng mt b m d liu,
v mi con c mt ( lch) offset xch nh v danh gii ch nh ti v
tr nh ca n trong b m. Mt con xc nh cha ca n qua bng hm
getParent().
to ra mt Raster con (subraster), dng phng thc
Raster.createSubRaster. Khi to mt subraster, xc nh vng ca cha
ca n m n chim v xc nh offset ca n t gc to ca cha.
Operations on a Raster
Lp Raster nh ngha mt s cch truy cp trc tip cc im v
d liu im. iu rt hu ch khi khi bn ci t giao din RasterOp,
n cung cp b lc cp v x l d liu ca nh, hoc khi ci t bt c
mt phng thc no m cn thc hin x l im mc thp.
Cc phng thc Raster.getPixel cho php ly v mt im ring
bit, n tr v nh l mt mu ring bit trong mt mng. Cc phng
thc Raster.getDataElements tr v mt phn t thc thi c th ca din
d

liu

nh

khng

th

hin

DataBuffer.

Phng

thc

Raster.getSample() tr v mu ca mt im c th. Phng thc


getSamples tr v mt di (band) cho mt vng c th ca mt image.
Cng vi cc phng thc , Cng c th truy cp d b m v
model mu qua cc bin th nghim (instance variables) ca lp Raster .
Cc i tng ny cung cp thm cc cch truy cp v biu din d liu
im ca Raster.

http://tailieuhay.com

152

Lp trnh ha trn Java 2D v 3D


5.4.4 The WritableRaster Subclass
Lp con WritableRaster cung cp cc phng thc t d liu
im v cc mu. Raster lin kt vi mt Bufferedimage thc ra l mt
WritableRaster v cung cp truy cp y x l d liu im ca
n.
5.5

Image Data and DataBuffers


DataBuffer ph thuc vo mt Raster biu din mt mng cc d

liu nh. Khi bn to mt Raster trc tip hoc qua cc hm to


Bufferedimage, bn xc nh rng v chiu cao trong cc pixel, cng
vi mt SampleModel cho d liu nh. Cc thng tin cng c dng
to mt DataBuffer vi d liu v kiu v kch thc ph hp.
C 3 lp con ca DataBuffer, mi lp biu din mt loi khc nhau
ca mt phn t d liu:
DataBufferByte (represents 8-bit values)
DataBufferint (represents 32-bit values)
DataBufferShort (represents 16-bit values)
DataBufferUShort (represents unsigned short values)
Nh nh ngha t trc, cc phn t l cc thnh phn ri rc ca
mng d liu b m, v cc thnh phn hoc cc mu l cc gi tr ri
rc kt hp vi nhau to nn mt im. C nhiu cch nh x gia kiu
ca phn t trong mt DataBuffer v kiu ca im c biu din bi
mt SampleModel. Cc lp con SampleModel cng c kh nng ci t
nh x v cung cp cch ly cc im xc nh t mt DataBuffer c
th.
Cc hm to DataBuffer cung cp cc cch to cc b m vi
mt c xc nh v mt s cc bank xc nh.

http://tailieuhay.com

153

Lp trnh ha trn Java 2D v 3D


Bn c th truy cp d liu ca mt nh trong DataBuffer mt cch
trc tip, bn cng d dng v thun tin lm iu hn qua cc phng
thc ca cc lp Raster v WritableRaster.
5.6

Extracting Pixel Data from a SampleModel


Lp tru tng SampleModel nh ngha cc phng thc cho

extracting cc mu ca mt nh m khng cn bit cch d liu c lu


tr bn di. Lp cung cp cc trng cho vic ghi li chiu cao v
chiu rng c d liu nh trong DataBuffer lin kt n , v cho vic m
t s lng cc band v kiu d liu m. Cc phng thc SampleModel
cung cp d liu nh nh tp(collection) cc im, vi mi im bao gm
c mt s cc mu hoc cc thnh phn.
java.awt.image package cung cp nm loi model mu:
ComponentSampleModel c dng extract cc im t cc
image cha cc mu d liu trong cc phn t mng d liu ring trong
mt bank ca mt DataBuffer
BandedSampleModel c dng extract cc im t cc
image cha mi mu trong mt phn t d liu ring vi cc band cha
trong mt dy cc phn t d liu.
PixelinterleavedSampleModel c dng extract cc im t
cc image cha mi sample trong mt phn t ring vi cc im c
lu trong mt dy tun t (sequence) ca cc phn t d liu.
MultiPixelPackedSampleModel c dng extract cc im
t cc iamge n band cha nhiu mu mt cc im trong mt phn t
d liu( used to extract pixels from single banded images that store
multiple one-sample pixels in one data element ).
SinglePixelPackedSampleModelused to extract samples from
images

http://tailieuhay.com

154

Lp trnh ha trn Java 2D v 3D


that store sample data for a single pixel in one data array element in the
first
bank of a DataBuffer.
D liu im c biu din bi SampleModel c hoc khng th
lin quan trc tip ti mt d liu mu biu din mt model mu c th.
ph thuc vo d liu ngun. V d, trong d liu nh ho photo, cc
mu c th biu din d liu RGB. Trong d liu nh t mt thit b nh y
t, cc mu c th biu din cc loi d liu khc nhau ging nh nhit
hoc mt xng.
C ba category ca cc phng thc cho truy cp d liu nh. Cc
phng thc getPixel tr v c mt im trong mt mng, vi mi u
vo cho mi mu. Cc phng thc getDataElement cung cp truy cp ti
d liu th, khng th hin c cha trong DataBuffer. Cc phng
thc getSample cung cp truy nhp ti cc thnh phn im cho mt band
xc nh.
5.7

ColorModels and Color Data


Cng vi Raster cho qun l d liu nh, lp Bufferedimage bao

gm mt ColorModel cho biu din d liu nh cc gi tr im mu.


Lp tru tng ColorModel nh ngha cc phng thc cho vic t cc
im ca image mt gi tr mu trong ColorSpace lin kt vi n.
Gi java.awt.image cung cp bn loi model mu:
PackedColorModel Mt ColorModel tru tng biu din cc
gi tr im c cc thnh phn mu c nhng trc tip trong cc bit ca
mt im nguyn. DirectColorModel l mt lp con (subclass) ca
PackedColorModel.
DirectColorModelmt ColorModel biu din cc gi tr im c
cc thnh phn mu RGB c nhng trc tip trong cc bit ca im.
DirectColorModel model tng t vi mt X11 TrueColor visual.

http://tailieuhay.com

155

Lp trnh ha trn Java 2D v 3D

ComponentColorModelmt ColorModel c th handle mt

ColorSpace thay i v mt mng cc thnh phn mu tng ng vi


ColorSpace.
indexColorModel Mt ColorModel biu din cc gi tr mu vo
trong bn mu trong khng gian mu sRGB.
Da trn d liu trong DataBuffer, SampleModel cung cp
ColorModel cho im, ColorModel sau biu din nh mt mu.
5.7.1 Lookup Table
Mt bng tham chiu (lookup table) cha d liu cho mt hoc nhiu
knh hoc cc thnh phn, v d, cc mng ring R, G v B. Goi
java.awt.image nh ngha 2 kiu bng tham chiu m rng lp
LookupTable tru tng, mt cha byte d liu v mt cha short data
(ByteLookupTable and ShortLookupData).
5.8

image Processing and Enhancement


Image package cung cp mt cp giao din nh ngha cc thao tc

trn Bufferedimage v Raster : BufferedimageOP v RasterOp.


Cc lp ci t nhng giao din ny bao gm AffineTransformOp,
BandCombineOp,

ColorConvertOp,

ConvolveOp,

LookupOp,

RescaleOp. Cc lp ny c th c dng bin i hnh hc, lm m,


lm sc, thin tng phn, ngng, v lm ng mu.( blur, sharpen,
enhance contrast, threshold, and color correct images).
Hnh 5-4 minh ho pht hin bin v ci thin , mt thao tc lm bng
,thay i tng cng trong mt nh. Pht hin bin thng c dng
trong x l nh y t v cc ng dng bn . Pht hin bin c dng
tng tng phn gia cu trc k trong mt nh, cho php viewer
phn bit chi tit hn.

http://tailieuhay.com

156

Lp trnh ha trn Java 2D v 3D

Figure 5-4 Pht hin bin v ci thin nh


on code sau y minh ho pht hin bin:

float[]
-1.0f,
0.0f,

elements
4.f,
-1.0f,

0.0f,

-1.0f,

0.0f,

-1.0f,
0.0f};

...
Bufferedimage

bimg

new

Bufferedimage(bw,bh,Bufferedimage.TYPE_iNT_RGB);
Kernel

kernel

new

Kernel(3,

3,

elements);
ConvolveOp

cop

new

ConvolveOp(kernel,

ConvolveOp.EDGE_NO_OP, null);
cop.filter(bi,bimg);
Hnh 5 -5 demo x l bng tham chiu. X l bng tham chiu c th
c dng thay cho cc thnh phn ring l ca mt im.

http://tailieuhay.com

157

Lp trnh ha trn Java 2D v 3D

Hnh 5-5

X l Lookup-Table

on code sau demo thao tc Lookup-table:


byte
for

reverse[]
(int

j=0;

new

byte[256];

j<200;

j++){

reverse[j]=(byte)(256-j);
}
ByteLookupTable

blut=new

ByteLookupTable(0,

reverse);
LookupOp

lop

new

LookupOp(blut,

null);

lop.filter(bi,bimg);
Hnh 5-6 minh ho rescaling. Rescaling c th tng hoc gim cng
ca tt c cc im. Rescaling c th c dng tng di ng ca
cc nh t nhin khc, a ra chi tit trong cc vng t nhin hoc
phng.

http://tailieuhay.com

158

Lp trnh ha trn Java 2D v 3D

Hnh 5-6

Rescaling

on Code di y minh ho rescaling:


RescaleOp

rop

new

RescaleOp(1.5f,

1.0f,

null);
rop.filter(bi,bimg);
5.8.1 Using an image Processing Operation
Convolution l qu trnh bn di hu ht cc thot ton lc khng
gian. Convolution la qu trnh nh gi (weighting) hoc lm u
(averaging) gi tr ca mi im trong mt nh vi cc ga tr im ln
cn. iu ny cho php mi im ra c t bi ln cn trung gian
trong cch md c th c xc nh vi mt nhn (kernel)
Hnh 5 -7 minh ho Convolution

http://tailieuhay.com

159

Lp trnh ha trn Java 2D v 3D


on m sau minh ho cch dng mt trong cc lp x l hnh nh,
lp ConvolveOp. Trong v d ny, mi im tng nh ngun c lm
cn bng vi 8 im xung quanh n.
float

weight

float[]
2D

1.0f/9.0f;

elements

new

float[9];

//

create

array

//

fill

the

elements for

(i

elements[i]

array

0;

with
i

<

nine

9;

equal

i++)

weight;

}
//

use

to

create

private

the
a

array

of

elements

as

argument

Kernel

Kernel

myKernel

new

Kernel(3,

3,

new

elements);
public

ConvolveOp

simpleBlur

ConvolveOp(myKernel);
//

sourceimage

of

Bufferedimage

and

destimage

simpleBlur.filter(sourceimage,
blur

the

are

instances

destimage)

//

image

Bin simpleBlur cha mt th nghim mi ca ConvolveOP ci t


ton t blur trn mt Bufferedimage hoc mt Raster. Gi nh rng
sourceimage v destimage l 2 th nghim ca Bufferedimage. Khi bn
gi filter, cc phng thc chnh ca lp ConvolveOp t gi tr ca mi
im trong nh ch bi vic bng gi tr trung bnh ca 8 im xung
quanh im tng ng vi n trong nh ngun.
http://tailieuhay.com

160

Lp trnh ha trn Java 2D v 3D


Nhn convolution trong v d ny c th c biu din bi ma trn
di y, vi cc phn t xc nh ti 4 phn:

Khi mt nh c vonvolved, gi tr ca mi im trong nh ch


c tnh ton bi vic dng mt nhn nh l mt tp vi trung bnh ca
cc gi tr xung quanh mi im tng ng trong nh ngun. Vic x l
ny c thc hin da trn mi knh ca nh.
Cng thc sau biu din cch cc trng s trong nhn c lin h vi
cc im trong nh ngun khi thc hin convolution. Mi gi tr tng
nhn c tied ti cc v tr trong hnh nh.

Gi tr ca im ch tng tng cc kt qu ca trng s trong nhn


c nhn vi gi tr ca cc im ngun tng ng. Vi nhiu b lc
n gin, kernel l mt ma trn vung
Convolution kernel trong v d ny lin quan n gin. N

(weights) mi im t hnh nh ngun bi chn mt nhn o (weights)


nh ngun mc cao hn hoc thp hn, mt chng trnh c th tng
hoc gim cng ca nh ch. i tng Kernel, c t trong khi
to ca ConvolveOP , xc nh kiu b lc n thc thi. Bi vic t cc
ga tr khc, bn c th thc hin cc kiu convolution khc nhau bao gm
blurring (nh Gaussian blur, radial blur, v motion blur), sharpening, v
smoothing
Hnh 5-8 minh ho sharpening dng Convolution.

http://tailieuhay.com

161

Lp trnh ha trn Java 2D v 3D

Hnh 5-8

Sharpening with Convolution

on code di y minh ho sharpening vi


float[]
-1.0f,
0.0f,

elements
5.f,

0.0f,

-1.0f,

0.0f,

-1.0f,

-1.0f,

0.0f };

...
Kernel

kernel

ConvolveOp

cop

new
=

Kernel(3,3,elements);
new

ConvolveOp(kernel,

ConvolveOp.EDGE_NO_OP,
null);
cop.filter(bi,bimg);

http://tailieuhay.com

162

Lp trnh ha trn Java 2D v 3D

Chng 6
Mu sc

V nh mu l mt trong nhng thnh phn nn tng ca cc h thng


ha v n lun l ngun gc ca s phc tp trong nhng hnh to
nh.Th vin Java 2D API cung cp
S h tr cho s to nh mu cht lng cao nhng li d dng s dng
Cc lp qun l mu trong Java 2D API gm CorlorSpace, Color.
Mt ColorSpace biu din cho mt h thng cho vic nh lng
mu, Tiu biu nh biu din bng 3 gi tr s(RGB) hc cc thnh
phn.. Lp ColorSoace cha cc phng thc cho chuyn i cc khng
gian mu v hai khng gian mu chun l CiEYZ v GRB.
Mt Color l mt mu c nh a c xc nh trong nh ngha
ca cc thnh phn ca n trong mt ColorSpace c th. v mt
Shape vi mt mu. chng hn mu . bn phi truyn mt i tngc
Color bu din mu vi ng cnh ho 2D. Color c inh ngha
trong java.awt.ColorModel miu t mt cch c th nhng im c
nh x ti cc mu.
ColorModel oc h tiu biu vi mt image hoc mt B m hnh
nh(Bufferimage) v cung cp thng tin cn thit thc hp biu din
cc ga tr m. ColorModel c nh ngha trong java.awt.image

http://tailieuhay.com

163

Lp trnh ha trn Java 2D v 3D


6.1 Cc lp
Clases
ColorSpace

Description
Identifies the color space of a Color object,
Image, BufferedImage, or GraphicsDevice.
Has methods to transform between RGB and

ICC_ColorSpace

CIEXYZ color spaces.


Extends: ColorSpace
Represents device-independent and devicedependent color spaces based on the ICC

ICC_Profile

Profile Format Specification.


A representation of color profile data for
device independent and device dependent
color spaces based on the ICC Profile

ICC_ProfileGray

Format Specification.
Extends: ICC_Profile

ICC_ProfileRGB

A representation of color space type gray.


Extends: ICC_Profile
A representation of color space type RGB.

6.2 Nhng nh ngha v mu sc.


Mt ColorModel c s dng biu din mt d liu dim trong
nh. iu ny bao gm c nh x cc thnh phn trong nhng di(bands)
ca mt nh ti cc thnh phn ca mt khng gian mu c th. N c th
cng bao hm c xut cc thnh phn im t mt d liu dim dng gi
hay nhn v nhiu thnh phn t mt di n bng s dng cc mt n. v
chuyn d liu im qua mt bng tham chiu(lookup table)
xc nh c gi tr mu ca mt im c th trong nh bn phi
bit cc m ho thng tin cho mi im. ColorModel lin h vi mt nh
s ng gi d liu v cc phng thc cn thit cho vic chuyn i gi
tr im ti v t cc n v thnh phn mu.

http://tailieuhay.com

164

Lp trnh ha trn Java 2D v 3D


Java 2D API cung cp 2 color model va thm vo DirectColor
Model v indexColorModel c nh ngha trong JDK 1.1 release.:
ComponentColorModel co th gi mt ColorSpace khng hn
ch v mt mng thnh phn mu ng vi ColorSpace. Model ny c th
s dng biu din hu ht cc model mu trn hu ht cc loi Thit b
ho(GrphicsDevices ).
PackedColorModel l lp c s cho cc model biu din gi tr
im bao gm cc thnh phn mu nhng trc tip trong cc bit ca mt
im nguyn.
PackedColorModel cha cac thng tin gi m t cch cc thnh phn
mu v alpha c xut ra t mt knh. irectColorModel trong JDK 1.1
release la mt PackedColorModel.
6.2.1 Khng gian mu
i tng ColorSpace biu din mt h thng cho vic nh lng
cc mu, tiu biu nh vic s dng 3 gi tr s ring bit.V d RGB,
CMYK l cc khng gian mu.(ColorSpace).
Mt i tng ColorSpace dng nh l th mt colorspace xc nh
khng gian mu c th ca i tng mu hoc qua mt i tng
ColorModel , ca mt imae , mt Bufferedimage, hoc mt
GraphicsConfiguration. ColorSpace cung cp cc phng thc chuyn
i cc mu trong khng gian xc nh ti v t RGB v ti v t khng
gian CiEXYZ.
Tt c i tng ColorSpace phi c th nh x mt mu t khng
gian biu din sang sRGB v chuyn i mt mu sRGB sang khng gian
biu din mu . V mi Color cha mt i tng ColorSpace t
tng minh hoc mc nh. mi Color cng c th chuyn t sRGB, Mi
GraphicsConfiguration dc lin h vi mt i tng ColorSpace khi
c c lin h vi ColorSpace. Mt mu c xc nh trong bt c

http://tailieuhay.com

165

Lp trnh ha trn Java 2D v 3D


khng gian mu no cung c th hin th c bi bt c thit b no bi
vic nh x n ti sRGB nh mt khng gian mu trung gian.
Cc phng thc c dng cho qu trnh ny l toRGB() v
fromRGB(), toRGB chuyn mt Color trong khng gian mu ti mt mu
trong sRGB fromRGB nhn mt mu trong sRGB v chuyn n sang
khng gian mu
Mc d vic nh x qua sRGB lun thc hin nhng n khng lun
lun la php tt nht.
V d. sRGB khng th biu din mi mu trong c gii mu CiEXYZ.
Nu mt mu c xc nh trong mt vi khng gian c gii ph
mu khc nhau hn sRGB
Th vic s dng sRGB nh l mt khng gian trung gian v b mt
thng tin. gii quyt vn ny, lp ColorSpace c th nh x cc
mu ti v t khng gian mu khc , nh CiEXYZX
Cc phng thc toCiEXYZ v fromCiEXYZ nh x gi tr mu t
khng gian mu ti khng gian khc (CiEXYZ). Cc phng thc ny b
tr chuyn i gia hai khng gian mu bt k vi mt v cp cao,
vi mt Color mt lc.Tuy nhin cng hi vng rng ci t Java 2D API
se b tr cho chuyn i vi hiu nng cao da trn h thng qun l
mu, thao tc trn ton nh.( Xem ColorConvertOp trong imaging trang
67)
Hnh 6-1 v 6-2 minh ho qu trnh translating mt mu c xc
nh trong khng gian mu CMYK hin th trn mn hnh RGB. Hnh
6-1 biu din mapping qua sRGB. Nh hnh minh ho, s chuyn i ca
mu CMYK sang mu RGB khng chnh xc bi s khng tng ng
hon ton.
Tt nhin, nhng mu c s dng trong cc ny mang tnh cht
biu minh ho v khng chnh xc. Nhng im mu s khng c

http://tailieuhay.com

166

Lp trnh ha trn Java 2D v 3D


nh x ng gia cc khng gian mu tr khi c mt s chuyn i khng
gian ph hp c s dng.

Hnh 6-2 biu din cng qu trnh s dng CiEXYZ nh l khng


gian mu chuyn i. Khi CiEXYZ c s dng, mu c chuyn qua
mt cch ng n.

ColorSpace la thc ra l mt lp tru tng. Java 2D API cung cp


s ci t iCC_Profile lp da trn d liu iCC Profile nh c biu
din bi lp iCC_Profile. Bn c th nh ngha lp con ca bn biu
din cc khng gian mu chuyn i min l cc phng thc c tho
lun trn c ci t. Tuy nhin hu ht cc developers c th s dng
mt cch n gin lp ColorSpace mc nh hoc cc khng gian mu
c biu din bi cc iCC Profiles thng thng, ging nh cc thng
tin cho mn hnh v my in, hoc thng tin c nhng trong d liu nh.
ColorSpace trong trang 90 miu t cch i tng ColorSpace biu
din mt khng gian mu v biu din cc mu trong khng gian mu c
th nh x ti v t mt khng gian chuyn i. Cc h thng qun l
mu thng c s dng gi nh x gia cc khng gian mu. Tiu
http://tailieuhay.com

167

Lp trnh ha trn Java 2D v 3D


biu nh h thng qun l mu (CMS) qun l cc thng tin iCC (iCC
profiles) n ging nh i tng ColorSpace; iCC profiles m t mt
khng gian vo v khng gian kt ni, v nh ngha cch nh x gi
chng. H thng qun l mu rt tt vic ch ra cch nh x mt mu
c gn vi mt profile vo trong khng gian mu ca mt profile khc.
Java 2D API nh ngha mt lp gi l iCC_Profile gi d liu cho
mt b chuyn i iCC profile. iCC_ColorSpace l mt s ci t ca lp
tru tng ColorSpace. Cc i tng iCC_ColorSpace c th c khi
to t cc iCC_Profile.(C mt s gii hn khng phi tt c cc iCC
Profile

thch

hp

cho

vic

nh

ngha

mt

iCC_ColorSpace)iCC_Profile c vi lp con tng ng vi cc loi


khng gian mu nh iCC_ProfileRGB v iCC_ProfileGray. Mi lp con
ca n c mt khng gian vo c nh ngha thch hp(ging nh
khng gian RGB) v khng gian kt ni thch hp (khng gian CiEXYZ).
Java 2D API c th s dng h thng nn CMS (platforms CMS ) truy
nhp cc thng tin mu co nhiu loi thit b a dng ging nh
scanner ,my in, mn hnh. Cng c th s dng CMS tm s nh x
tt nht gia cc profiles
6.2.1 Biu din mu
Lp Color cung cp s m t mu trong khng gian mu c th. mt
th nghim ca Color cha gi tr cc thnh phn mu v mt i tng
ColorSpace. Bi mt i tng ColorSpace c th c xc nh thm
vo cc thnh phn mu khi mt th nghim mi ca m c to ra nn
lp Color c th gi cc mu trong bt c khng gian mu no.
Lp Color c mt s phng thc b tr cho khng gian mu chun
RGB

gi

sRGB(tham

kho

http://

www.

W3.

org/pub/www/Graphics/color/sRGB.html). sRGB la khng gian mu mc


nh cho Java 2D API. Vai hm khi to c nh ngha bi lp Color

http://tailieuhay.com

168

Lp trnh ha trn Java 2D v 3D


cho php b qua tham s ColorSpace. Cc khi to ny mc nh rng
gi tr mu RGB c nh ngha trong sRGB, v s dng th nghim
mc nh ca ColorSpace biu din cho khng gian .
Java 2D API dng sRGB to thun li cho cc lp trnh vin lp trnh
ng dng, khng phi l tham chiu khng gian mu cho s chuyn i
mu. Nhiu ng dng ch yu tp trung vo anh RGB v mn hnh v vic
nh ngha khng gian mu RGB lam cho vic vit chng d dng hn.
Lp ColorSpace nh ngha cc phng thc toRGB v frmGB lm cho
cc developers c th nhn cc mu mt cch dng trong khng gian
chun ny. Cc phng thc ny khng mong i s dng cho mu vi
chnh xc cao hay vic chuyn i. (xem ColorSpace trang 90 )
to ra mt mu (color) trong mt khng gian mu khng phi l sRGB,
ban dng hm to Color vi i tng ColorSpace v mt mng so thc
biu din cc thnh phn mu tng ng vi khng gian . i tng
ColorSpace xc nh khng gian mu.
hin th mt hnh ch nht ng mu ging nh mu cyan, bn cn
mt cch m t mu ny cho h thng. C mt s cch khc nhau
m t mt mu, v d mt mu c th c m t bng mt tp hp cc
thnh phn (RGB) (red), xanh l cy(green), xanh da tri(blue) hay tp
hp cc thnh phn(CMYK) Cyan, Magenta, Yellow, Black . Cc k
thut khc nhau ny cho vic xc nh mu c gi l cc khng gian
mu (color spaces).
Nh bn bit, cc mu trn mt mn hnh my tnh c to bi s pha
trn lng khc nhau ca ba thnh phn (Red), xanh l cy (Green), xanh
da tri (Blue). V th nn dng khng gian mu RGB lm chun cho v nh
trn man hnh my tnh. Tng t, qu trnh in 4 mu dng cyan, magenta,
yellow, black to ra mu trn trang giy in ,cc mu in c xc nh
bng t l phn trm trong khng gian mu CMYK.

http://tailieuhay.com

169

Lp trnh ha trn Java 2D v 3D


thch hp vi s ph bin ca c mn hnh v my in mu, c hai
khng gian mu RGB v CMYK c dng biu din mu. Tuy nhin,
c 2 loi khng gian mu c mt hn ch l ph thuc thit b. mc cm
thch(cyan) c s dng bi mt my in c th khng tng ng vi
mc cyan ca mt my in khc. Tng t, mt mu biu din bng mt
mu RGB c th trng ging mu xanh da tri (blue) trn mt mn hnh
v mu ta (purplish) trn mt mn hnh khc .
Mapping Colors qua sRGB v CiEXYZ
Java 2D API dng RGB v CMYK la 2 loi khng gian mu. Mt
model mn hnh pht pho c th xc nh mt khng gian mu RGB ca
n. Tng t, mt model my in cng c khng gian CMYK ca n.
Khng gian khc nhau , Khng gian RGB hoc khng gian CMYK c th
lin h vi nhau qua khng mu gian c lp thit b
Cc chun cho vic xc inh mu c lp thit b c nh ngha
bi international Commission on illumination (CiE). Khng gian mu c
lp thit b thng c dng nht l khng gian 3 thnh phn mu
(three-component XYZ ) c pht trin bi CiE. Khi bn xc nh mt
mu dng CiEXYZ, bn c cch ly vi c lp thit b.
Tht khng may mn, khng phi lc no cng dng khng gian mu
CiEXYZ, c mt s l do cho vic biu din mu trong cc khng gian
mu khc. t c kt qu n nh khi mt mu c biu din dung
khng gian ph thuc thit b nh khng gian RGB, cn biu din chc
khng gian RGB lin h v khng gian c lp thit b ging nh
CiEXYZ.
Mt cch nh x gia cc khng gian mu l thm thng tin vo
cch khng gian ph thuc thit b lin h vi khng gian c lp thit b.
Nhng thng tin thm ny c gi l profile. Color profile thng s
dng l iCC Color Profile, c nh ngha bi international Color
http://tailieuhay.com

170

Lp trnh ha trn Java 2D v 3D


Consortium. Chi tit xem iCC Color Format Specification, phin bn 3.4
trn trang http:// www.color. Org.
Hnh 6-3 minh ho mt mu n (Solid color) v mt nh qut c
truyn cho Java 2D API v cch chng hin th bi cc thit b ra a dng.
Nh bn thy trong 6-3 c mu vo v nh c cc profile c gn vo.

Khi API c mt mu xc nh mt cch chnh xc, n phi to li mu


trn thit b ra, nh mn hnh v my in. Cc thit b ny c cc c tnh
to nh ca n m bo rng kt qu to ra l chnh xc. Mt profile c
lin kt vi mi thit b ra m t cch cc mu cn c chuyn i
to ra kt qu chnh xc.
Vic t c mu n nh v chnh xc yu cu c mu vo v thit
b ra a thm thng tin tr li cho khng gian mu chun. V d, mt
mu vo c th nh x t khng gian mu gc ca n sang khng gian
mu c lp thit b chun, v sau t khng gian sang khng gian
mu thit b ra. Trong nhiu kha cnh, s chuyn i mu bt chc s
chuyn i ca i tng ho trong khng gian to x, y. C 2
trng hp, s chuyn i c dng xc nh to trong khng gian

http://tailieuhay.com

171

Lp trnh ha trn Java 2D v 3D


chun v sau nh x to sang khng gian thit b xc nh cho
u ra.

Chng 7
In n

Java Printing API cho php ng dng cho:


1. In vi AWT v ho Java 2D , bao gm ho a hp
(composited graphics) v hnh nh.
2. Cc hm iu khin cc hm ti liu a hp nh so snh mm,
th t in, v booklet printing.
3. Cc hm in xc nh tr gip nh in duplex (duplex printing)

v stapling.
4. In vi tt c cc platform, c Windows v Solaris. iu ny bao
gm my in c gn trc tip vi my tnh cng nh vi
platform software cho php truy cp s dng cc giao thc in
qua mng.
Khng phi tt c cc tnh nng c b tr v c ci t trong
in n vi Java 2 SDK API. Nhng API s c m rng b tr cho
tt c cc thuc tnh ny cc bn release trong tng lai.
7.1 Cc giao din v cc lp

http://tailieuhay.com

172

Lp trnh ha trn Java 2D v 3D


Interface
Printable

Description
The Printable interface is implemented by each page
painter, the application class(es) called by the
printing system to render a page. The system calls the
page painters print method to request that a page be

Pageable

rendered.
The Pageable interface is implemented by a
document that is to be printed by the printing system.
Through the Pageable methods, the system can
determine the number of pages in the document, the
format to use for each page, and the page painter to

PrinterGraphics

use to render each page.


The Graphics2D objects that a page painter uses to
render a page implement the PrinterGraphics
interface. This enables an application to get the

Printable

PrinterJob object that is controlling the printing.


The Printable interface is implemented by each page
painter, the application class(es) called by the
printing system to render a page. The system calls the
page painters print method to request that a page be
rendered.

Class
Book

Description
Implements: Pageable
Represents a document in which pages can have
different page
formats and page painters. This class uses the
Pageable

PageFormat

http://tailieuhay.com

interface to interact with a PrinterJob.


Describes the size and orientation of a page to be
173

Lp trnh ha trn Java 2D v 3D


printed, as
well as the Paper used to print it. For example,
portrait
and landscape paper orientations are rep- resented by
Paper

PageFormat.
Describes the physical characteristics of a piece of

PrinterJob

paper.
The principal class that controls printing. The
application calls PrinterJob methods to set up a job,
display a print dialog to the user (optional), and to
print the pages in the job.

Cc nh ngha v in
Java Printing API da trn m hnh in callback trong h thng in,
khng phi ng dng s iu khin khi cc trang c in. ng dng cung
cp thng tin v ti liu c in v h thng in s yu cu ng dng y
ti cc trang in khi n cn chng.
H thng in c th yu cu rng mt trang in ring bit c a ra
hn mt ln hoc yu cu cc trang c a ra ngoi theo th t. ng
dng phi cho php to ra hnh nh ng ca trang, khng ph thuc
trang no h thng in yu cu. Trong kha cnh , h thng in ging nh
window toolkit, c th yu cu cc thnh phn v li bt c lc no
trong th t no.
M hnh in callback mm do hn cc m hnh ng dng iu khin in
truyn thng v b tr cho vic in trn di rng hn cc h thng v cc
my in.

http://tailieuhay.com

174

Lp trnh ha trn Java 2D v 3D


V d, nu mt my in thc hin a ra cc trang trong th t o ngc,
h thng in c th yu cu ng dng to cc trang trong th t o ngc
sao cho tc v cui cng l ng th t c .
M hnh ny cng cho php ng dng in ra cc my in nh nh
phn t my tnh m khng c b nh hy khng gian a m cho
ton trang bitmap. Trong tnh hung ny, mt trang c in nh l mt
dy c bitmap nh hay cc di (bands). V d, nu b nh ch m cho
1/10 trang in, thi trang s c ch thnh 10 di. H thng in i hi ng
dng y mi trang 10 ln, mi ln in vo mi di. ng dng khng
cn bit s lng hay c ca cc di, n ch n gin kh y mi trang
khi c yu cu.
7.2.1 Supporting Printing
Mt ng dng phi thc hin 2 tc vu b tr cho vic in l:
1. iu khin in(Job control)- Khi to v qun l vic in.
2. In (imaging) y (rendering) d liu ra mi trang khi h thng in
yu cu n
7.2.1.1 iu khin in (Job Control)
Ngi s dng thng khi to vic in bi vic kch mt nt hoc
chn mc in trn menu trong mt ng dng. Khi mt thao tc in c
kch hot bi ngi s dng, ng dng to ra mt i tng PrinterJob
v dng n qun l qu trnh in.
ng dng c kh nng p ng cho vic ci t iu khin in, hin th
cc hp thoi cho ngi s dng, v bt u qu trnh in.
imaging
Khi mt ti liu c in, ng dng phi y d liu mi trang khi h
thng in yu cu n. b tr cho k thut ny, ng dng cung cp mt

http://tailieuhay.com

175

Lp trnh ha trn Java 2D v 3D


page painter ci t giao din Printable. Khi h thng in cn mt trang
c y ra, n gi phng thc in ca page painter.
Khi mt phng thc ca page painter c gi, n c truyn cho
mt ng cnh ho (Graphics context) dng y hnh anh trang. N
cng c truyn cho mt i tng PageFormat xc nh (specifies)
hnh hin ra ca trang, v ch s xc nh th t v tr ca trang trong vic
in.
H thng in h tr c vic y Graphics v Graphics2D, in Java
2D Shapes ,Text v images, bn a mt i tng Graphics cho
phng thc in cho raphics2D
in cc ti liu trong cc trang dng cc page painter khc nhau
v c cc nh dng khc nhau, bn dng mt pageablejob. to mt
pageable job, bn c th dng lp Book hoc ci t giao din Pageable
ca bn.
ci t cc thao tc in n gin, bn khng cn dng mt pageable
print job, Print- able c th c dng min l tt c cc trang chia s cn
mt nh dng v mt my in
7.2.2 Page Painters
Vic ch yu ca mt page painter l y ra mt trang dng ng cnh
ho c cung cp bi h thng in. Mt page painter ci t phong
thc Printable.print:
public int print(Graphics g, PageFormat pf,
int pageindex)
Ng cnh ho c truyn cho phng thc in l mt th nghim
ca Graphics hoc Graphics2D, ph thuc vo cc package c load
trong Java Vtual Machine ca bn. dng cc tnh nng Graphics2D ,

http://tailieuhay.com

176

Lp trnh ha trn Java 2D v 3D


bn c th thay i tng Graphics bng Graphics2D. Th nghim
Graphics c truyn in cng ci t giao din PrinterGraphics.
PageFormat c truyn cho mt Printable m t hnh nh ca mt
trang c in. H ta ca ng cnh ho c truyn in c
fixed vi trang : gc to ca h thng l gc tri trn ca trang, X tng
theo chiu phi sang tri, Y theo chiu t trn xng di, vi n v l
1/72 inch.
Nu trang trong hng portrait, trc x cn theo chiu rng ca trang giy,
v trc y theo chiu cao ca trang. (Thng thng, nhng khng phi
lun lun, chiu cao ca trang di hn vi chiu rng ca n). Nu trang
theo hng landscape, th ngc li: trc x cn theo chiu cao ca trang
cn trc y cn theo chiu rng ca n.
Bi nhiu my in khng th trn c b mt trang, PageFormat xc
nh (specifies) vng in (imageable area) ca trang: phn ca trang m n
y ra an ton. S xc nh ca vng in khng thay i theo to h
thng, n c cung cp sao cho ni dung ca trang c th c y ra
sao cho chng khng th m rng vo trong vung m my in khng th
in.
Ng cnh ho c truyn in c mt min xn m t phn min
c th in m cn c in. N cng lun an ton in ton b trang vo
trong ng cnh , h thng in s nm d vng xn cn thit.
Tuy nhin, loi overhead ca cc phn v ca trang khng c in,
bn c th dng min ct xn gii hn vng y ra. ly vng ct
xn t ng cnh ho, gi hm Graphics.getClip. Vng ct xn rt
mnh m gim bt rendering overhead.
i khi mong mun c thao tc in thc hin ngm cho ngi dng
c th tip tc tao tc vi ng dng trong khi cc trang ang c y ra
(ang in). lm iu ny, gi hm PrinterJob.print trong mt tuyn
ring.
http://tailieuhay.com

177

Lp trnh ha trn Java 2D v 3D


Nu c th, bn nn trnh cc thao tc ho m yu cu thng tin v
ni dung ca image trc , ging nh copyArea, setXOR, v s lin
hp (compositing).
Cc thao tc ny c th y ra chm v cc kt qu c th khng n
nh.

7.2.3 Printable Jobs and Pageable Jobs


Mt Printable job cung cp cch n gin nht in. Ch mt page
painter c dng , ng dng cung cp mt lp n ci t giao din
Printable. Khi in, h thng goi phng thc in ca page painter y ra
mi trang. Cc trang c yu cu theo th t, bt u vi trang c ch s
l 0. Tuy nhin, page painter c th c yu cu y mi trang vi ln
trc khi n sang trang tip. Khi trang cui cng c in, phng thc in
ca page painter tr v NO_SUCH_PAGE.
Trong mt Printable job:
1. Tt c cc trang dng cung mt page painter v PageFormat. Nu

mt hp thoi in c hin th, n cng s khng hin th s trang


trong ti liu v thng tin khng c vi h thng in.
2. H thng in lun i hi page painter in mi trang ng th t,
bt u vi trang c ch s l 0. Khng trang no b qun. V d,
nu ngi dng yu cu in trang 2 v trang 3 ca mt ti liu, th
page painter s c gi vi cc ch s 0, 1, 2. H thng in c th
yu cu mt trang c y ra nhiu ln trc khi chuyn sang
trang k.
3. Page painter bo cho h thng in khi n n cui ti liu.
4. Tt c cc page painter c gi trong cng mt tuyn.
5. i khi h thng in c th khng c kh nng bit c mc ch
a ra. V d, tc v ca cc trang hin ra t my in c th l th t

http://tailieuhay.com

178

Lp trnh ha trn Java 2D v 3D


sai, hoc cc trang c th khng c kim tra th t nu nhiu bn
sao c yu cu.
6. Mt Pageable job linh hot hn mt Printable job. Khng ging
nh cc trang trong Printable job, cc trang trong Pageable job c
th khc v cch b tr v ci t.
qun l mt Pageable job, bn c th dng lp Book hay ci t
lp Pageable ca bn. Qua Pageable, h thng in c th xc nh s
lng trang in, v page painter dng cho mi trang, v PageFormat
cho mi trang. Cc ng dng cn in cc ti liu c mt cu trc nh v
nh dng nn dng cc Pageable job.
Trong mt Pageable job:
Cc trang khc nhau c th dng cc page painter v cc
PageFormat khc nhau.
H thng in c th i hi cc page painter in cc trang trong
mt th t tu v mt trang c th c b qua. V d, Nu ngi dng
yu cu in cc trang 2 v 3 ca mt ti liu, th page painter se c gi
vi ch s 1 v 2 cn trang ch s 0 s c b qua.
Pageable job khng cn bit c bao nhiu trang tip theo trong ti
liu. Tuy nhin, khng ging vi Printable job, chng phi c kh nng
y ra cc trang trong bt k th t. C th c cc ch trng trong th t
v h thng in c th yu cu mt trang c y ra nhiu ln trc khi
chuyn sang trang tip theo. V d, yu cu in trang 2 v 3 ca mt ti
liu c th kt qu trong dy li gi l cc trang yu cu vi ch s 2, 2, 1,
1 v 1.
7.2.4 Typical Life-Cycle of a PrinterJob
Mt ng dng hng theo i tng PrinterJob qua mt dy cc
bc hon thnh cng vic in. Th t n gin nht c dng bi
ng dng l:

http://tailieuhay.com

179

Lp trnh ha trn Java 2D v 3D


Ly

mt

tng

PrinterJob

mi

bi

vic

gi

PrinterJob.getPrintJob
Xc nh PageFormat dng cho vic in. Mt PageFormat mc

nh c th ly v bi gi hm defaultPage. hoc bn c th gi
mt hp thoi cho php ngi dng xc nh nh dng .
Xc nh cc c im ca cng vic in cho PrinterJob. Cho

mt Printable job, gi setPrintable; vi Pageable job, gi


setPageable. Ch mt i tng Book l mt mu truyn cho
setPageable.
Xc nh cc thuc tnh thm cho vic in, ging nh s bn sao
in hay tn ca cng vic trn u trang.
Gi hm printDialog hin th hp thoi cho ngi dng. iu ny
l tu chn. Nhng ni dung v hnh dng ca hp thoi c th a
dng vi cc platform v cc my in khc nhau. Trn hu ht cc
platform, ngi dng c th dng hp thoi ny thay i cc la
chn ca my in. Nu ngi dng hu vic in, phng thc
printDialog tr v FALSE.
Gi Printerjob.print in. Phng thc ny khi tr v gi print

trn cc page painter tng ng.


Mt cng vic c th b ngt qu trnh in nu:

Mt PrinterException c a vo ngoi l c bt boi


phng thc in v cng vic s b dng. Mt page painter a ra
mt PrinterException nu n pht hin mt trm trng li (fatal
error).

PrinterJob.cancel c gi. vng lp in s b chm dt v cng


vic b hu b. Phng thc cancel c th c gi t mt tuyn
ring bit ci hin th mt hp thoi v cho php ngi dng hy
b vic in bi bm vo mt nt trn hp thoi .

http://tailieuhay.com

180

Lp trnh ha trn Java 2D v 3D


Cc trang phn ra trc khi mt cng vic in b dng c th l khng
c in hoc c in. Vic in thng khng kt thc (finished) khi
phng thc in tra v. Vic ny thng vn ang c thc hin bi trnh
iu khin my in.
Trng thi ca i tng PrinterJob c th khng phn nh trng thi
thc t ca cng vic ang c in.
Do trng thi ca mt PrinterJob thay i trong qu trnh vng i
ca n. Khng hp l yu cu cc phng thc vo nhiu lc. V d, vic
gi setPageable sau khi bn gi hm print l khng hp l. Khi c cc
li gi khng hp l c pht hin PrinterJob s a vo mt ngoi l
java.lang.illegalStatException.
Dialogs
Java Printing API yu cu cc ng dng cn n hp thoi giao tip
vi ngi dng mt cch tng minh. Cc hp thoi ny c th c
cung cp bi h iu hnh (platform software) hoc bi s ci t phn
mm Java 2 SDK . Vi cc ng dng tng tc, nn dng hp thoi.
Tuy nhin, cc ng dng in kt qa(production printing application), cc
hp thoi khng cn thit, v d nh, bn khng cn hin th hp thoi khi
t ng to v in mt bo co c s d liu. Mt vic in khng yu cu
tng tc vi ngi dng i khi c gi l silent print job.
Page setup dialog
Bn c th cho php ngi dung thay i thng tin ci t trang(page
setup information) cha trong PageFormat bi hin th hp thoi page
setup. hin th mt hp thoi page setup bn gi hm
PrinterJob.pageDialog. Hp thoi page setup c khi to dng tham
s truyn cho pageDialog. Nu ngi dng click vo nt OK trong hp
thoi, th mt th nghim ca PageFormat c to(cloned), v thay i

http://tailieuhay.com

181

Lp trnh ha trn Java 2D v 3D


theo ti cc chn la ca ngi dng ri tr v. Nu ngi dng n
cancel, th pageDialog tr v PageFormat cha b thay i.
Print dialog
Thng thng, mt ng dng hin th mt hp thoi in cho ngi
dung khi c kch hot thc n hay bi nt bm. hin th hp
thoi in ny, bn gi hm printDialog ca PrinterJob. Cc la chn ca
ngi dng trong hp thoi c rng buc da trn s v nh dng ca
cc trang trong Printable hoc Pageable c cung cp cho
PrinterJob. Nu ngi dng click OK trong hp thoi in, printDialog tr
v TRUE. Cn click vo Cancel n tr v FALSE v vic in coi nh b
qua.
7.3

Printing with Printables


Cung cp b h tr in c bn:

1. Ci t giao din Printable cung cp mt page painter c th

y mi trang ra in.
2. To mt PrinterJob.
3. Gi setPrintable thng bo cho PrinterJob cch thc in ti liu.

Gi hm print ca i tng PrinterJob bt u cng vic.


Trong v d di y, mt Printabble job c dng in 5 trang,
mi ci hin th mt s trang mu xanh. iu khin cng vic c qun
l trong phng thc chnh, phng thc ly v v iu khin PrinterJob.
Vic y ra (Rendering) c thc hin trong phng thc print ca page
painter.
import

java.awt.*;

public

class

import

java.awt.print.*;

SimplePrint

implements

Printable

http://tailieuhay.com

182

Lp trnh ha trn Java 2D v 3D


{
private

static

Font

fnt

new

Font("Helvetica",Font.PLAiN,24);
public

static

void

main(String[]

args)

{
//

Get

PrinterJob
//

PrinterJob
job

Specify

of

PrinterJob.getPrinterJob();

the

Printable

SimplePrint

is

an

instance

job.setPrintable(new

SimplePrint());
//

Put

up

the

dialog

box

if

(job.printDialog())
{
//

Print

the

job

cancel

printing

try

job.print();

catch

(Exception

handle

/*

if

the

user

didn't

e)

exception

*/

}
System.exit(0);
}
public
int

int

print(Graphics

g,

PageFormat

pf,

pageindex)

throws

PrinterException

http://tailieuhay.com

183

Lp trnh ha trn Java 2D v 3D


//

pageindex

numbers

to

if

(pageindex

to

corresponds

to

page

5.
>=

5)

return

Printable.NO_SUCH_PAGE;
g.setFont(fnt);
g.setColor(Color.green);
g.drawString("Page

"

(pageindex+1),

100,

100);
return

Printable.PAGE_EXiSTS;

}
}

Using Graphics2D for Rendering


Bn c th cn cc hm Graphics2D trong phng thc print ca
page painter bi trc tin chuyn ng cnh Graphics ti mt
Graphics2D
Trong v d di y, cc s trang c y ra dng mt hng redgreen(red-green gradient). lm iu ny, mt GradientPaint c t
trong ng cnh Graphics2D.
import

java.awt.*;

public

class

import

java.awt.print.*;

SimplePrint2D

implements

Printable
{
private

static

Font

fnt

new

Font("Helvetica",Font.PLAiN,24);

http://tailieuhay.com

184

Lp trnh ha trn Java 2D v 3D


private

Paint

pnt

100f,

Color.red,

136f,

100f,

public

new

Color.green,

static

void

GradientPaint(100f,
true);

main(String[]

args)

{
//

Get

PrinterJob
//
of

PrinterJob
job

Specify

the

PrinterJob.getPrinterJob();
Printable

is

an

instance

SimplePrint2D

job.setPrintable(new
up

the

SimplePrint2D());

//

Put

dialog

if

(job.printDialog())

box

{
//

Print

the

job

cancel

printing

try

job.print();

catch
*/

(Exception

e)

if

the

user

didn't

}
{

/*

handle

exception

}
System.exit(0);
}
public
int

int

print(Graphics

g,

PageFormat

pf,

pageindex)

throws

PrinterException

{
//

pageindex

numbers

http://tailieuhay.com

to

to

corresponds

to

page

5.

185

Lp trnh ha trn Java 2D v 3D


if

(pageindex

>=

5)

return

Printable.NO_SUCH_PAGE;
Graphics2D
//

Use

the

g2

=
font

(Graphics2D)
defined

g;

above

g2.setFont(fnt);
//

Use

the

gradient

color

defined

above

g2.setPaint(pnt);
g2.drawString("Page

"

(pageindex+1),

100f,

100f);
return

Printable.PAGE_EXiSTS;

}
}

7.3.2 Printing a File


Khi mt phng thc in ca page painter c yu cu vi ln cho
cng trang, n phi c sinh ra cng u ra mi ln.
C nhiu cch chc chn rng cc yu cu lp li y ra mt
trang thun tin ra cng u ra. V d, chc chn rng cng u ra
c sinh ra mi ln h thng in yu cu cc trang c th ca mt file
vn bn, page painter c th lu tr v s dng li cc con tr file cho
mi trang hoc cha d trang thc t.
Trong v d di y, mt danh sch cc file vn bn c in. Tn
ca file c truyn nh

l i

s cho hm main.

Lp

PrintListingPainter cha con tr file thc t lc bt u ca mi trang


mi n c yu cu y ra(to render). Khi cng trang c y ra ln
na, con tr file c reset ti v tr nh.
import

java.awt.*;

http://tailieuhay.com

186

Lp trnh ha trn Java 2D v 3D


import

java.awt.print.*;

import

java.io.*;

public

class

PrintListing

{
public

static

void

main(String[]

args)

{
//

Get

PrinterJob

PrinterJob

job

//

user

Ask

PrinterJob.getPrinterJob();
for

page

format

(e.g.,

portrait/landscape)
PageFormat

pf

job.pageDialog(job.defaultPage());
//
//

Specify

the

Printable

PrintListingPainter;

is

an

also

instance

provide

of

given

PageFormat
job.setPrintable(new
PrintListingPainter(args[0]),
//

Print

pf);

copy

job.setCopies(1);
//

Put

up

the

dialog

if

(job.printDialog())

box

{
//

Print

the

job

cancel

printing

try

job.print();

catch
*/

(Exception

e)

if

the

user

didn't

}
{

/*

handle

exception

http://tailieuhay.com

187

Lp trnh ha trn Java 2D v 3D


System.exit(0);
}
}
class

PrintListingPainter

implements

Printable

{
private

RandomAccessFile

private

String

private

Font

Font.PLAiN,

fileName;
fnt

new

Font("Helvetica",

10);

private

int

private

long

private

boolean

public

raf;

rememberedPageindex

rememberedFilePointer

-1;

rememberedEOF

PrintListingPainter(String

-1;

false;
file)

{
fileName

file;

try{
//

Open

raf

file
new

RandomAccessFile(file,

"r");

}
catch

(Exception

e)

rememberedEOF

true;

}
}
public
int

int

print(Graphics

g,

PageFormat

pf,

pageindex)

throws

PrinterException

http://tailieuhay.com

188

Lp trnh ha trn Java 2D v 3D


try
{
//

For

catching

if

(pageindex

iOException

!=

rememberedPageindex)

{
//

First

time

we've

rememberedPageindex
//

if

visited

this

page

encountered

pageindex;
EOF

on

previous

page,

done
if

(rememberedEOF)

return

Printable.NO_SUCH_PAGE;
//

Save

current

position

rememberedFilePointer

in

input

file

raf.getFilePointer();

}
else

raf.seek(rememberedFilePointer);

g.setColor(Color.black);
g.setFont(fnt);
int

(int)

pf.getimageableX()

10;

int

(int)

pf.getimageableY()

12;

//

Title

line

g.drawString("File:
"

Generate

imageable
y

fileName

",

page:

(pageindex+1),
//

"

+=

while

x,
as

y);

many

lines

as

will

fit

in

area

36;
(y

12

<

pf.getimageableY()

+pf.getimageableHeight())
{

http://tailieuhay.com

189

Lp trnh ha trn Java 2D v 3D


String
if

line

(line

==

raf.readLine();
null)

{
rememberedEOF

true;

break;
}
g.drawString(line,
y

+=

x,

y);

12;

}
return

Printable.PAGE_EXiSTS;

}
catch

(Exception

e)

return

Printable.NO_SUCH_PAGE;}
}
}
Giao din ca chng trnh:

http://tailieuhay.com

190

Lp trnh ha trn Java 2D v 3D

Printing with Pageables and Books


Cc Pageable c lm ph hp vi cc ng dng da trn biu din li
tng minh d liu, trang bi trang. Lp Book l mt cch thun li
dng cc Pageable, nhng bn cng c th xy dng cu trc Pageable
ca chnh bn nu Book khng ph hp vi ci ca bn cn. Phn ny ch
cho bn cch dng Book.
Cc Pageable job c cp qua cc Printable job bi v h thng in
c kh nng linh hot hn. Mt ci tin chnh ca Pageable l s trang
trong ti liu thng c bit v c th hin th cho ngi dng trong
hp thoi in. iu ny tr gip cho ngi dng chc chn rng cng
vic (job) c thc hin (specified) chnh xc hoc chn mt di cc
trang in.
Mt Book biu din mt tp cc trang. Cc trang trong mt book khng
phi cng c, cng hng, hoc page painter. V d, mt Book c th

http://tailieuhay.com

191

Lp trnh ha trn Java 2D v 3D


cha cc trang vi 2 c ch trong hng portrait v mt trang c ch
trong hng landscape.
Khi mt Book khi to u tin, n trng rng. thm cc trang vo
mt Book, bn dng phng thc append. Phng thc ny nhn 2 i
tng PageFormat xc nh (defines) c trang, vng c th in, hng v
mt page painter ci t giao din Printable.
Nhiu trang trong mt Book c th dng chung cng nh dang v
painter. Phng thc append c np chng cho php bn thm vo
mt dy cc trang mf c cng thc tnh bi vic xc nh tham s th 3,
s lng cc trang.
Nu bn khng bit tng s trang trong mt Book, bn c th chuyn
cho gi tr UNKNOW_NUMBER_OF_PAGES cho phng thc append.
H thng in sau s gi cc page painter ca bn theo th t tng dn
ch s trang khi mt trong chng tr v NO_SUCH_PAGE.
Phng thc setPage c th c dng thay i nh dng trang
hoc painter. Trang thay i c xc nh (identified) bi ch s trang
ci ch ra v tr ca trang trong Book.
Ban gi setPageable v truyn trong Book chun b cho vic in.
Hm setPageablbe v hm setPrintable l loi tr nhau. Do bn gi
mt hoc ci ny hoc ci kia ch khng th c hai khi ang chun b in
PrinterJob.
7.4.1 Using a Pageable Job
V d sau, mt Book c dng to li v duj in n gin u
tin( Do trng hp ny qa n gin, c rt it li ch trong vic dng
mt Pageable job thay cho mt Printable job, nhng n minh ho c bn
cch cng mt Book) Ch rng bn vn phi ci t giao din Printable
v thc hin page rendering trong phng thc print ca page painter.

http://tailieuhay.com

192

Lp trnh ha trn Java 2D v 3D


import

java.awt.*;

import

java.awt.print.*;

public

class

SimplePrintBook

implements

Printable
{
private

static

Font

fnt

new

Font("Helvetica",Font.PLAiN,24);
public

static

void

main(String[]

args)

{
//

Get

PrinterJob

PrinterJob
//

Set

Book

job

book

up

bk

new

PrinterJob.getPrinterJob();
Book();

bk.append(new

SimplePrintBook(),

job.defaultPage(),
//

Pass

the

5);

book

to

the

PrinterJob

job.setPageable(bk);
//

Put

up

the

dialog

if

(job.printDialog())

box

{
//

Print

the

job

cancel

printing

try

job.print();

catch
*/

(Exception

e)

if

the

user

didn't

}
{

/*

handle

exception

}
System.exit(0);
}

http://tailieuhay.com

193

Lp trnh ha trn Java 2D v 3D

public
int

int

print(Graphics

g,

PageFormat

pf,

pageindex)

throws

PrinterException

{
g.setFont(fnt);
g.setColor(Color.green);
g.drawString("Page

"

(pageindex+1),

100,

100);
return

Printable.PAGE_EXiSTS;

}
}
Giao din ca chng trnh:

7.4.2 Using Multiple Page Painters


V d di y, c hai page painter khc nhau c s dng: mt cho
ba v mt cho cc trang bn trong. Trang ba c in trong landscape
mode v ni dung in portrait mode.
http://tailieuhay.com

194

Lp trnh ha trn Java 2D v 3D


import

java.awt.*;

import

java.awt.print.*;

public

class

PrintBook

{
public

static

void

main(String[]

args)

{
//

Get

PrinterJob

PrinterJob

job

//

Create

PageFormat

PrinterJob.getPrinterJob();

landscape

pfl

page

format

job.defaultPage();

pfl.setOrientation(PageFormat.LANDSCAPE);
//

Set

Book

up

bk

book

new

bk.append(new

Book();

PaintCover(),

pfl);

bk.append(new

PaintContent(),

job.defaultPage(),
//

Pass

the

2);

book

to

the

PrinterJob

job.setPageable(bk);
//

Put

up

the

dialog

if

(job.printDialog())

box

{
//

Print

the

job

cancel

printing

try

job.print();

catch
*/

(Exception

e)

if

the

user

didn't

}
{

/*

handle

exception

}
System.exit(0);

http://tailieuhay.com

195

Lp trnh ha trn Java 2D v 3D


}
}
class

PaintCover

implements

Printable

{
Font

fnt

new

Font("Helvetica-Bold",

Font.PLAiN,

72);

public

print(Graphics

int

int

g,

PageFormat

pf,

pageindex)

throws

PrinterException

{
g.setFont(fnt);
g.setColor(Color.black);

int

yc

(int)

(pf.getimageableY()

pf.getimageableHeight()/2);
g.drawString("Widgets,
return

inc.",

72,

yc+36);

Printable.PAGE_EXiSTS;

}
}
class

PaintContent

implements

Printable

{
public
int

int

print(Graphics

g,

PageFormat

pf,

pageindex)

throws

PrinterException

{
Graphics2D

http://tailieuhay.com

g2

(Graphics2D)

g;

196

Lp trnh ha trn Java 2D v 3D


int

useRed

int

xo

(int)

pf.getimageableX();

int

yo

(int)

pf.getimageableY();

//

Fill

page

with

alternating
for

0;

red

circles

green

(int

&

for

0;

pf.getimageableWidth();
(int

pf.getimageableHeight();

or

+=

x+28

<

y+28

<

36)
0;

squares,

+=

36)

{
if

(useRed

else

0)

g.setColor(Color.red);

g.setColor(Color.green);

useRed
if

==

(pageindex

yo+y+4,
else

28,

useRed;
%

==

0)

g.drawRect(xo+x+4,

28);

g.drawOval(xo+x+4,

yo+y+4,

28,

28);

}
return

Printable.PAGE_EXiSTS;

}
Giao din cua chng trnh:

http://tailieuhay.com

197

Lp trnh ha trn Java 2D v 3D

V d in mt mt chng trnh.
import java.awt.geom.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.print.PrinterJob;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.awt.print.*;
public

class

ShapesPrint

extends

JPanel

implements Printable, ActionListener {


final static Color bg = Color.white;
final static Color fg = Color.black;

http://tailieuhay.com

198

Lp trnh ha trn Java 2D v 3D

final static Color red = Color.red;


final static Color white = Color.white;
final

static

BasicStroke

stroke

new

BasicStroke(2.0f);
final

static

BasicStroke

wideStroke

new

BasicStroke(8.0f);
final static float dash1[] = { 10.0f };
final

static

BasicStroke

dashed

new

BasicStroke(1.0f,
BasicStroke.CAP_BUTT,
BasicStroke.JOiN_MiTER, 10.0f, dash1, 0.0f);
final

static

JButton

button

new

JButton("in");
public ShapesPrint() {
setBackground(bg);
button.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof JButton) {

http://tailieuhay.com

199

Lp trnh ha trn Java 2D v 3D


PrinterJob

printJob

PrinterJob.getPrinterJob();
printJob.setPrintable(this);
if (printJob.printDialog()) {
try {
printJob.print();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
drawShapes(g2);
}
public void drawShapes(Graphics2D g2) {
Dimension d = getSize();
int gridWidth = 400 / 6;
int gridHeight = 300 / 2;
int rowspacing = 5;
int columnspacing = 7;
int

rectWidth

gridWidth

rectHeight

gridHeight

columnspacing;
int
rowspacing;

http://tailieuhay.com

200

Lp trnh ha trn Java 2D v 3D


Color fg3D = Color.lightGray;
g2.setPaint(fg3D);
g2.drawRect(80, 80, 400 - 1, 310);
g2.setPaint(fg);
int x = 85;
int y = 87;
g2.draw(new

Line2D.Double(x,

Rectangle2D.Double(x,

y,

rectHeight - 1, x + rectWidth, y));


x += gridWidth;
g2.setStroke(stroke);
g2.draw(new

rectWidth, rectHeight));
x += gridWidth;
g2.setStroke(dashed);
g2
.draw(new
RoundRectangle2D.Double(x,

y,

rectWidth,

rectHeight,
10, 10));
x += gridWidth;
g2.setStroke(wideStroke);
g2.draw(new

Arc2D.Double(x,

y,

rectWidth, rectHeight, 90, 135,


Arc2D.OPEN));
x += gridWidth;
g2.setStroke(stroke);
g2.draw(new

Ellipse2D.Double(x,

y,

rectWidth, rectHeight));
x += gridWidth;

http://tailieuhay.com

201

Lp trnh ha trn Java 2D v 3D


int x1Points[] = { x, x + rectWidth, x,
x + rectWidth };
int y1Points[] = { y, y + rectHeight, y
+ rectHeight, y };
GeneralPath

polygon

new

GeneralPath(GeneralPath.WiND_EVEN_ODD,
x1Points.length);
polygon.moveTo(x1Points[0],
y1Points[0]);
for

(int

index

1;

index

<

x1Points.length; index++) {
polygon.lineTo(x1Points[index],
y1Points[index]);
}
;
polygon.closePath();
g2.draw(polygon);
x = 85;
y += gridHeight;
int x2Points[] = { x, x + rectWidth, x,
x + rectWidth };
int y2Points[] = { y, y + rectHeight, y
+ rectHeight, y };
GeneralPath

polyline

new

GeneralPath(GeneralPath.WiND_EVEN_ODD,
x2Points.length);
polyline.moveTo(x2Points[0],
y2Points[0]);

http://tailieuhay.com

202

Lp trnh ha trn Java 2D v 3D


for

(int

index

1;

index

<

x2Points.length; index++) {
polyline.lineTo(x2Points[index],
y2Points[index]);
}
;
g2.draw(polyline);
x += gridWidth;
g2.setPaint(red);
g2.fill(new

Rectangle2D.Double(x,

y,

rectWidth, rectHeight));
g2.setPaint(fg);
x += gridWidth;
GradientPaint

redtowhite

new

GradientPaint(x, y, red, x + rectWidth,


y, white);
g2.setPaint(redtowhite);
g2
.fill(new
RoundRectangle2D.Double(x,

y,

rectWidth,

rectHeight,
10, 10));
g2.setPaint(fg);
x += gridWidth;
g2.setPaint(red);
g2.fill(new

Arc2D.Double(x,

y,

rectWidth, rectHeight, 90, 135,


Arc2D.OPEN));
g2.setPaint(fg);

http://tailieuhay.com

203

Lp trnh ha trn Java 2D v 3D


x += gridWidth;
redtowhite

new

GradientPaint(x,

y,

red, x + rectWidth, y, white);


g2.setPaint(redtowhite);
g2.fill(new

Ellipse2D.Double(x,

y,

rectWidth, rectHeight));
g2.setPaint(fg);
x += gridWidth;
int x3Points[] = { x, x + rectWidth, x,
x + rectWidth };
int y3Points[] = { y, y + rectHeight, y
+ rectHeight, y };
GeneralPath

filledPolygon

new

GeneralPath(GeneralPath.WiND_EVEN_ODD,
x3Points.length);
filledPolygon.moveTo(x3Points[0],
y3Points[0]);
for

(int

index

1;

index

<

x3Points.length; index++) {
filledPolygon.lineTo(x3Points[index],
y3Points[index]);
}
;
filledPolygon.closePath();
g2.setPaint(red);
g2.fill(filledPolygon);
g2.setPaint(fg);
g2.draw(filledPolygon);

http://tailieuhay.com

204

Lp trnh ha trn Java 2D v 3D


}
public int print(Graphics g, PageFormat pf,
int pi) throws PrinterException {
if (pi >= 1) {
return Printable.NO_SUCH_PAGE;
}
drawShapes((Graphics2D) g);
return Printable.PAGE_EXiSTS;
}
public static void main(String s[]) {
WindowListener l = new WindowAdapter() {
public

void

windowClosing(WindowEvent e) {
System.exit(0);
}
public void windowClosed(WindowEvent
e) {
System.exit(0);
}
};
JFrame f = new JFrame();
f.addWindowListener(l);
JPanel panel = new JPanel();
panel.add(button);

http://tailieuhay.com

205

Lp trnh ha trn Java 2D v 3D


f.getContentPane().add(BorderLayout.SOUTH,
panel);
f.getContentPane().add(BorderLayout.CENTER,
new ShapesPrint());
f.setSize(580, 500);
f.show();
}
}
Giao din ca chng trnh:

http://tailieuhay.com

206

Lp trnh ha trn Java 2D v 3D

Phn 2
Lp trnh ha vi Java 3D

http://tailieuhay.com

207

Lp trnh ha trn Java 2D v 3D

CHNG 1
NHP MN LP TRNH TRN JAVA 3D

1.1 Tng quan v Java 3D API


Java 3D API c tha k t cc lp ca java cho php to cc giao
din phc tp nh h thng m thanh v hnh nh 3 chiu. Ngi lp trnh
c th s dng n xy dng iu khin cc i tng hnh hc 3 chiu.
Nhng i tng ny c tr trn mt mi trng o sau mi c
dng hnh li. Cc hm API c thit k rt linh ng cho php to mt
trng o chnh xc vi rt nhiu dng kch c t ln n b.
D c nhiu chc nng nh vy nhng cc hm API vn c th s
dng r rng. Cc chi tit c dng hnh t ng. S dng li th ca
cc lung trong java, vic dng hnh trong Java 3D cho php lm song
song, ng thi cng cho php ti hu ha vic dng hnh. Chng trnh
Java 3D to cc instances ca cc i tng v a chng vo c s d
liu th khung cnh. th khung cnh l mt sp xp cc i tng
Java 3D trn mt cu trc cy cho php ch ra ni dng ca mt th gii
o v chng c th c dng hnh nh th no.
Chng trnh Java 3D c th c vit chy c lp hay nh l mt
applet trn cc trnh duyt h tr Java 3D hoc c 2.

http://tailieuhay.com

208

Lp trnh ha trn Java 2D v 3D


1.2 Cc vn c bn v Java 3D API
Java 3D API nh ngha hn 100 lp trong gi javax.media.j3d
nhng lp ny c coi nh l nhng lp c bn nht ca Java 3D.
C n hng trm trng v phng thc trong cc lp ca Java 3D
API tuy nhin mt mi trng o n gin ch cn dng mt vi lp.
Chng ny m t tp nh nht cc i tng v tng tc gia chng
dng nn mt mi trng o.
Chng ny cn bao gm v d HelloJava3D hin thi mt khi lp
phng quay. V d ny c pht trin theo tng bc ln lt th hin
cc phn x l trong lp trnh Java 3D.
Ngoi gi nhn Java 3D chng ta cn s dng thm mt gi na l
com.sun.j3d.utils thng gi l cc lp tin dng, chng b sung thm
nhng tnh nng hiu qu v rt mnh cho nhn.
Lp utility gm 4 mc: content loader(np ni dung), h tr xy dng
th khung cnh, cc lp hnh hc, v cc cng c tin ch.
Tt nhin l ngoi gi nhn v gi tin ch th mi chng trnh java
u s dng cc lp t gi java.awt v javax.vecmath. Gi java.awt
nh ngha cc lp AWT cho php to ca s cho vic dng hnh. Gi
javax.vecmath nh ngha cc lp cho im, vector ma trn v nhng i
tng ton hc khc.
Trong phn cn li ca gio trnh ny t visual object(i tng quan st)
c s dng thay cho mt i tng trong th khung cnh.(chng
hn: mt hnh lp phng hay hnh cu). T object c s dng cho mt
instance ca mt lp. Content tng ng vi nhng i tng quan st
trong mt th khung cnh.
1.3 Xy dng th khung cnh
Mi trng o trong Java 3D c to t mt th khung cnh, mt
th khung cnh c to nn bi cc instance ca cc lp Java 3D.
http://tailieuhay.com

209

Lp trnh ha trn Java 2D v 3D


th khung cnh c ghp ni bi cc i tng c nh ngha v
mt hnh hc, m thanh v nh sng, v tr, hng v b ngoi v trc
quan cng nh m thanh ca i tng. Vi mt th bnh thng th
cu trc d liu hay dng l cc nt v cc cung. Mt nt ca th
khung cnh l mt instance ca mt lp Java 3D. Cc cung i din cho 2
dng quan h gia cc instances ca Java 3D.
Quan h hay gp nht l quan h cha con mt nt cha c rt nhiu nt
con. Mt quan h khc l quan h tham chiu. Mt tham chiu lin kt
mt i tng NodeComponent vi mt nt ca th khung cnh.
NodeComponent nh ngha v mt hnh hc v cc thuc tnh b mt
c s dng dng nn i tng quan st.
th khung cnh trong Java 3D c cu thnh t cc nt i tng
trong cc mi lin h cha con nh ra mt cu trc cy. Trong cy ny ch
c mt nt gc. Cc nt cn li c truy cp ti thng qua cc cung i t
nt gc, cc cung trn cy khng to thnh chu trnh. Mt th khung
cnh c nh dng t cc cy m gc ti cc i tng xy ra.
NodeComponent v cc cung tham chiu khng phi l mt phn ca
th khung cnh.
Ch tn ti mt ng duy nht t gc ca cy n mt l, t ch c
mt ng i duy nht t gc ca mt th khung cnh n mi nt l.
ng i gi l ng i ca th khung cnh. T ch c mt
ng i th khung cnh n mi l trong mt th khung cnh.
Mi dng i th khung cnh trong th khung cnh ca Java 3D
ch ra thng tin v trng thi ca l. Thng tin trng thi bao gm a
im, hng, v kch thc ca i tng quan st. Kt qu l cc thuc
tnh trc quan ca mi i tng quan st ph thuc vo mi ng i
trn th khung cnh ca n. B dng hnh Java 3D da trn im ny
dng nn cc l theo th t hiu qu nht. Nhng ngi lp trnh Java
3D thng khng phi iu khin qu trnh ny.
http://tailieuhay.com

210

Lp trnh ha trn Java 2D v 3D


V mt ha th mt th khung cnh c dng nh l mt cng
c thit k hoc ti liu ha cho cc trng trnh Java 3D. th khung
cnh c v trn cc biu tng nh hnh 1.1. Chng trnh Java 3D c
th c nhiu i tng hn so vi nhng i tng trong th ny.
Nh vy thit k mi trng o, th khung cnh c v da
trn nhng biu tng chun. Sau khi vic thit k hon thnh, s
th khung cnh s l tiu ch ca chng trnh. Sau khi chng trnh hon
thnh, mt th khung cnh tng t i din cho chng trnh (gi s
l nhng c im c tun theo). th c v t chng trnh
minh chng cho th m chng trnh to ra.

Mi mt biu tng pha bn tri ca hnh 1.1 i in cho mt i


tng n l khi s dng trong th khung cnh. 2 biu tng u tin
i din cho cc i tng ca 2 lp c bit VirtualUniverse v Locale.
3 biu tng tip theo i din cho cc i tng ca cc lp Group,
Leaf v NodeComponent. 3 biu tng sau thng c dng ch
cc lp con ca nhng i tng trn. Biu tng cui cng bn tri i
din cho bt c lp ca i tng no.
Mi tn lin i din cho mt lin kt cha con gia 2 i tng. Nt t
ch tham chiu n mt i tng khc. i tng c tham chiu c
http://tailieuhay.com

211

Lp trnh ha trn Java 2D v 3D


th chia s gia cc nhnh khc nhau ca mt th khung cnh. Di
y l mt v d (Hnh 1.2)

Rt d xy dng mt th khung cnh sai. Mt v d sai n gin c


th xem hnh 1-3. th ny sai bi v n vi phm nhng c tnh ca
DAG. Vn nm ch ch vi 2 i tng TransformGroup c chung
mt i tng l Shape3D l con. Nh rng mt i tng l ch c th
c 1 cha duy nht. Ni cch khc ch c mt ng i t i tng Locale
n 1 l (hay l ng t mt l n mt Locale).
Bn c th ngh cu trc xy dng trong hnh 1-3 nh ngha 3 i
tng quan st trong mt mi trng o, N xut hin trn biu khung
cnh da trn nh ngha 2 i tng quan st thng qua s dng i
tng quan st Shape3D pha bn phi ca th. M da trn cc khi
nim, mi i tng TransformGroup cha chung ca i tng
Shape3D phi t mt hnh nh ca i tng quan st trn cc v tr
khc nhau. Tuy nhin y l mt th khng hp l v cung cha con

http://tailieuhay.com

212

Lp trnh ha trn Java 2D v 3D


khng nh ra mt cy. Trong v d ny, kt qu l i tng Shape3D c
hn 1 cha.
S tranh ci v cu trc ca cy v DAG l chnh xc. Tuy nhin h
thng runtime ca Java 3D a ra thng bo c li trong mi quan h cha
con. V kt qu ca s gii hn cu trc cy m mi i tng Shape3D
b hn ch ch c mt cha. Vi v d trong hnh 1-3, li thng bo l chnh
l vic c nhiu cha. Trn hnh 1-4 a ra gii php cho vn ny.

Chng trnh Java 3D m c th khung cnh khng hp l c th


dch c nhng khng th dch c. Khi mt chng trnh Java 3D c
th khung cnh khng hp l c chy, h thng Java 3D s pht hin
ra vn . V khi vn c pht hin th h thng Java 3D s thng
bo li. Chng trnh c th vn chy nhng vn cn phi dng li v
chng c hnh nh no dng nn c.
Mi th khung cnh ch c mt mi trng o. i tng mi trng
o c mt danh sch cc i tng Locale. Mt i tng Locale cung
cp mt im tham chiu trong mi trng o . C th coi nh i

http://tailieuhay.com

213

Lp trnh ha trn Java 2D v 3D


tng Locale l ct mc s dng xc nh v tr ca cc i tng
quan st trong mi trng o.
th c nhiu mi trng o trong mt chng trnh Java 3D, v th c
th nh ngha nhiu hn mt mi trng o. Tuy nhin, khng c cch c
nh no cho vic lin lc gia cc mi trng o ny. Xa hn, mt i
tng th khung cnh khng th tn ti trong a mi trng o cng
mt lc. Do ch nn s dng mt v ch mt instance ca mi trng
o trong mi chng trnh Java 3D.
Trong khi mt i tng mi trng o c th tham chiu n nhiu i
tng Locale th hu ht cc chng trnh Java 3D ch c mt i tng
Locale. Mi i tng Locale c th phc v nh l gc ca nhiu th
con ca th khung cnh. Theo v d hnh 1-2 c th thy i tng
Locale c 2 nhnh th con t n.
Cc th con th phn ra lm 2 loi nhnh hnh thc v nhnh ni
dung. Nhnh ni dung ch ra ni dung ca mi trng o hnh hc, b
mt, hnh vi, a im, m thanh, v nh sng. Nhnh hnh thc ch ra cc
tham s cho php xem nh a im xem v hng xem.

http://tailieuhay.com

214

Lp trnh ha trn Java 2D v 3D

1.3.1 Tha k cp cao t Java 3D API


C 3 cp tha k t Java 3D API th hin trong hnh 5-1. Thng qua
cu trc ny chng ta s hnh dung c chng trnh Java 3D nh th
no.
Lp node
Lp node l lp cha ca 2 lp Group v Leaf, nh ngha nhng
phng thc chung v rt quan trng cho cc lp con ca n. Thng tin
v cc phng thc ny s c m t phn sau ca ti liu
Lp Group
Lp group l lp gc s dng ch ra v tr v hng ca i tng
quan st trong mt mi trng o. 2 lp con ca l BranchGroup v
TransformGroup. Trong th khung cnh hnh nh i din ca 2 lp
ny c biu tng l hnh trn v thng c vit tt thnh BG v TG.
Lp Leaf
http://tailieuhay.com

215

Lp trnh ha trn Java 2D v 3D


Lp Leaf l lp gc nh ngha hnh dng, m thanh, v hnh vi
ca i tng quan st trong mi trng o. Mt vi lp con ca lp ny
l Shape3D, Light, Behavior v Sound. Nhng i tng ny c th
khng c lp con nhng phi tham chiu n NodeComponent.
Lp NodeComponent
Lp NodeComponent l lp gc s dng m t v hnh hc, b
mt, texture v nhng thuc tnh ca node Shape3D. NodeComponent
khng phi l mt phn ca th khung cnh nhng li c tham chiu
n. Mt NodeComponent c th c tham chiu bi nhiu i tng
Shape3D.

http://tailieuhay.com

216

Lp trnh ha trn Java 2D v 3D


1.4 Cch thc vit mt chng trnh Java 3D
Vic xy dng mt chng trnh Java 3D gm c 7 bc c gii
thiu trong hnh 1-6. y l cng thc hu ch xy dng cc ng dng
Java 3D.
Cng thc ny cng b qua mt vi chi tit nhng din t phn ln
nhng cng vic cn lm trong vic to cc nhnh th ca th
khung cnh l cng vic quan trng nht ca vic lp trnh. Trong phn
ti chng ta s c bit lm th no to mt th khung cnh m
khng phi lp trnh nhiu.
1.4.1 Cng thc n gin vit mt chng trnh Java 3D
Cc chng trnh ca Java 3D c vit s dng cng thc trn c
nhnh th hnh thc c cu trc ng n, v cu trc ny sn c
trong lp SimpleUniverse. Mi instance ca lp ny thc hin cc bc
2,3,4 trn cng thc c bn trn iu gip cho ngi lp trnh gim
thiu thi gian v cng sc to nhnh hnh thc qua tp trung vo
cng vic chnh l ni dung hn. Cng vic thc s khi vit mt chng
trnh Java 3D l nh vy.
1. Create a Canvas3D object
2. Create a VirtualUniverse object
3. Create a Locale object, attaching it to the VirtualUniverse object
4. Construct a view branch graph
a. Create a View object
b. Create a ViewPlatform object
c. Create a PhysicalBody object
d. Create a PhysicalEnvironment object
e. Attach ViewPlatform, PhysicalBody, PhysicalEnvironment, and
Canvas3D objects to View object
http://tailieuhay.com

217

Lp trnh ha trn Java 2D v 3D


5. Construct content branch graph(s)
6. Compile branch graph(s)
7. Insert subgraphs into the Locale
Vic s dng lp ny cho php ngi lp trnh tm qun i nhnh
th hnh thc. Tuy nhin n khng cho php c nhiu view trong mi
trng o ca n.
SimpleUniverse Class
Hm khi to ca i tng SimpleUniverse to nn th khung
cnh bao gm cc i tng VirtualUniverse v Locale v mt nhnh
th hnh thc hon thin.
Nhnh ny s dng instances ca cc lp ViewingPlatform v Viewer
trong nhn ca lp to thnh nhnh th hnh thc. i tng
SimpleUniverse cung cp tt c cc chc nng c ch ra trong hnh 17.
Gi com.sun.j3d.utils.universe cha cc lp SimpleUniverse,
ViewingPlatform v Viewer.

http://tailieuhay.com

218

Lp trnh ha trn Java 2D v 3D

Vic s dng lp SimpleUniverse l cho cng vic n gin hn rt


nhiu. Hnh 1-8 a ra cng thc n gin hn trong cc bc 2,3,4
c thay bng bc 2 ca cng thc mi.
1. Create a Canvas3D Object
2. Create a SimpleUniverse object which references the earlier
Canvas3D object
a. Customize the SimpleUniverse object
3. Construct content branc h
4. Compile content branch graph
5. Insert content branch graph into the Locale of the SimpleUniverse
SimpleUniverse Constructor gi com.sun.j3d.utils.universe
Lp tin ch ny cho php d dng ci t mi trng ngi dng, to
cc i tng cn thit cho th nhnh hnh thc. Lp ny to nn cc
i tng Locale, VirtualUniverse, ViewingPlatform v Viewer (vi tt
c cc gi tr mc nh ca chng). Cc i tng ny lin h vi nhau
to nn th nhnh hnh thc.
Phng thc khi to quan trng
SimpleUniverse ()
Khi to mt mi trng o
SimpleUniverse (Canvas3D canvas3D)
Khi to mt mi trng o vi tham chiu n i tng c t
tn l Canvas3D
i tng SimpleUniverse to thnh mt th nhnh hnh thc
hon thin cho mt mi trng o. th ny bao gm mt bng hnh
nh. Mt bng hnh nh l mt dng hnh ch nht l ni m ni dung ca
c chiu n nh dng hnh nh cn dng. i tng Canvas3D
cung cp hnh nh trn mt ca s trn mn hnh hin th ca my tnh, c
th coi nh l mt bng hnh nh vy. r hn chng ta quan st hnh
http://tailieuhay.com

219

Lp trnh ha trn Java 2D v 3D


nh di y, hnh 1-9 ch ra mi quan h gia bng hnh nh (image
plate) v v tr ca mt, mi trng o. V tr ca mt l ng sau bng
hnh nh. i tng quan st ng trc bng hnh nh c dng trn
bng hnh nh. Vic dng hnh cng v nh chiu mt i tng quan st
ln bng hnh nh.

Mc nh bng hnh nh t trung tm ca SimpleUniverse ban u,


hng mc nh l nhn theo trc z,. T v tr ny trc x l ng bin
ngang ca bng hnh nh vi hng dng l bn phi. Trc y l cnh
ngang ca bng hnh nh vi gi tr dng hng ln trn. Thng thng
th v tr (0,0,0) l tm ca bng hnh nh.
Chng trnh Java 3D thng thng s chuyn im nhn ra pha sau
(hng dng ca trc z) lm cho i tng v tr hoc gn so vi v
tr ban u gia hng nhn. Lp SimpleUniverse c mt lp thnh vin
l

ViewingPlatform,

lp

ny

phng

thc

setNominalViewingTransform cho php chuyn v tr ca mt nhn ti


trung tm l (0,0, 2.41) nhn t pha m ca trc z so vi v tr ban u.
Lp ViewingPlatform, phng thc setNominalViewingTransform ()
Package: com.sun.j3d.utils.universe
http://tailieuhay.com

220

Lp trnh ha trn Java 2D v 3D


Lp ViewingPlatform c s dng thit lp th nhnh hnh
thc ca th khung cnh Java 3D vi i tng SimpleUniverse.
Phng thc ny thng c s dng kt ni vi phng thc
getViewingPlatform ca lp SimpleUniverse.
void setNominalViewingTransform()
Set tm nhn khong cch khong 2.41 mt t trong bin i tm
nhn ca mt SimpleUniverse. Ti khong cch ny v th i tng vi
chiu cao khong 2 mt so th va vn vi bng hnh nh.
Sau khi to xong cc i tng Canvas3D v SimpleUniverse, bc
tip theo l to th nhnh ni dung. Quy tc ca cu trc c tm thy
trong th nhnh hnh thc (do vic s dng lp SimpleUniverse).
th nhnh ni dung bin i khc nhau t chng trnh ny n chng
trnh khc do c th xy dng chi tit trong cng thc. iu c
ngha l khng c nhng lp ni dung n gin cho bt c mi trng
no m bn mun thit lp.
Sau khi to xong th nhnh ni dung, n c chn vo mi trng s
dng phng thc addBranchGraph ca SimpleUniverse. Phng thc
ny ly mt instance ca BranchGroup nh l tham s duy nht.
BranchGroup ny ch c thm vo nh l mt con ca i tng
Locale c to bi SimpleUniverse.
Cc phng thc SimpleUniverse
Package: com.sun.j3d.utils.universe
void addBranchGraph(BranchGroup bg)
S dng thm nt vo i tng Locale ca th khung cnh
c to bi SimpleUniverse. iu ny s dng thm vo mt th
nhnh ni dung ti mi trng o.
ViewingPlatform getViewingPlatform()

http://tailieuhay.com

221

Lp trnh ha trn Java 2D v 3D


S dng ly thng tin t i tng ViewingPlatform m
SimpleUniverse ch ra. Phng thc ny s dng vi phng thc
setNominalViewingTransform () ca lp ViewingPlatform iu
chnh v tr quan st.
1.5 Mt vi thut ng trong Java 3D
Hai thut ng c ni trong phn ny l live v compiled. Khi
chn mt th nhnh vo Locale lm cho n c th sng (live) v kt
qu l mi i tng ca th nhnh tr thnh sng. Nhng i tng
sng l nhng i tng m chun b c dng hnh, cho nn nhng
tham s ca mt i tng sng khng th thay i tr khi kh nng
tng ng ca n c thit lp trc khi i tng sng (capability c
m t trong phn 1.8.2).
Khi cc i tng BranchGroup c dch (compiled). Vic dch
BrandGroup chuyn i tng BranchGroup v tt c nhng hnh
thc s khai ca n thnh dng ph hp dng hnh. Mc ch ca
cng vic ny l chun b bc cui cng trc khi lm cho i tng
sng.
Phng thc
BranceGroup compile ()
Void compile ()
Dch ngun BranchGroup tng ng vi i tng bng cch to v
m mt th khung cnh c dch.
C s ca vic dch v sng c b sung trong lp
SceneGraphObject. 2 phng thc ca SceneGraphObject c m t
di y.
Danh sch cc phng thc c bn ca SceneGraphObject
SceneGraphObject l lp c bn ca tt c cc lp ln cn dng to
th khung cnh bao gm Group, Leaf, v NodeComponent.
http://tailieuhay.com

222

Lp trnh ha trn Java 2D v 3D


SceneGraphObject cung cp kh nhiu phng thc v thuc tnh cho
cc lp con ca n, 2 phng thc c trnh by di y.
boolean isCompiled()
Tr v mt gi tr c ch ra khi no th node (l mt phn ca th
khung cnh c dch)
boolean isLive ()
Tr v gi tr c ch ra khi no node l mt phn ca th khung
cnh sng
Ch rng khng c bc bt u dng hnhc trong cng thc c
bn ln cng thc n gin ni trn. B dng hnh ca Java 3D bt
u chy trong mt vng lp v hn khi mt th nhnh cha mt
instance ca View bt u sng trong mt mi trng o. Khi bt u,
b dng hnh Java 3D thc hin hot ng nh hnh 1-10
while(true) {
Process input
If (request to exit) break
Perform Behaviors
Traverse the scene graph
and render visual objects
}
Cleanup and exit
Phn trc gii thch cu trc ca mt mi trng o n gin
m khng c th nhnh ni dung. Vic to th nhnh ni dung l ch
ca mt s phn tip theo. Nhng tho lun xung quanh th nhnh
ni dung c xoay quanh cc v d ca chng trnh.

http://tailieuhay.com

223

Lp trnh ha trn Java 2D v 3D


1.6 V d n gin: HelloJava3Da
Chng trnh Java 3D bt u bng vic nh ngha lp mi m rng
t lp Applet. Trong v d HelloJava3Da.java di y ta cng c lp
HelloJava3Da c m rng t lp Applet, v vic s dng n gip n
gin i rt nhiu so vi chng trnh Java 3D c vit nh ng dng c
lp.
Lp chnh ca chng trnh Java 3D thng nh ngha phng thc
thit lp th nhnh n dung. Trong v d ny phng thc nh th
c t tn l creatSceneGraph().
Mi bc theo cng thc pha trn u c th hin trong lp
HelloJava3Da. Bc 1,to i tng Canvas3D (dng 4 n dng 6).
Bc 2 to i tng SimpleUniverse hon thnh dng 17.
Bc 3 to nhnh ni dung, c hon thnh bng li gi n
phng thc creatSceneGraph().
Bc 4 dch th nhnh ni dung c thc hin trong dng 10.
Cui cng bc th 5 chn th nhnh ni dung vo Locale ca
SimpleUniverse thc xong dng 19.
public class HelloJava3Da extends Applet {
public HelloJava3Da() {
setLayout(new BorderLayout());
Canvas3D canvas3D = new Canvas3D(null);
add("Center", canvas3D);
BranchGroup scene = createSceneGraph();
//

SimpleUniverse

is

Convenience

Utility class

http://tailieuhay.com

224

Lp trnh ha trn Java 2D v 3D


SimpleUniverse

simpleU

new

SimpleUniverse(canvas3D);
// This will move the ViewPlatform back
a bit so the
// objects in the scene can be viewed.

simpleU.getViewingPlatform().setNominalViewingTr
ansform();
simpleU.addBranchGraph(scene);
} // end of HelloJava3Da (constructor)
Ta thy bc 3 ca cng thc ny l to th nhnh ni dung. Mt
th nhnh ni dung c to trong on m 1-2. l th nhnh ni
dung n gin nht c th. N cha mt i tng ha tnh l hnh
lp phng mu. Hnh ny c t v tr ban u trong h thng th
gii o. Vi v tr v hng nhn ny, hnh lp phng ny xut hin nh
hnh ch nht khi c dng ln.
public BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
objRoot.addChild(new ColorCube(0.4));
return objRoot;

http://tailieuhay.com

225

Lp trnh ha trn Java 2D v 3D


}

//

end

of

CreateSceneGraph

method

of

HelloJava3Da

Lp HelloJava3Da c tha k t Applet nhng chng trnh c


th chy nh l mt ng dng vi vic s dng lp MainFrame. Lp
Applet c s dng l lp c s d dng cho vic vit mt chng
trnh Java 3D chy trn mt ca s. MainFrame cung cp mt AWT
frame (ca s) cho mt apple iu cho php apple chy nh mt ng
dng. Kch thc ca ca s c ch ra trong phn thit lp ca lp
MainFrame. on m 1-3 bn di s ch ra cch s dng trong
HelloJava3Da.java.
MainFrame ConStructor
package: com.sun.j3d.utils.applet
MainFrame gip cho mt applet c th chy nh mt ng dng. Mt
lp tha k t applet c th c phng thc main() dng gi hm
khi to ca MainFrame. MainFrame m rng t java.awt.Frame v b
sung

thm

java.lang.Runnable,

java.applet.AppletStub,

java.applet.AppletContext.
Hm
MainFrame(java.applet.Applet applet, int width, int height)
To to i tng Mainframe cho php applet chy nh ng dng
c lp.
Tham s: Applet Hm to ca mt lp tha k t applet.
MainFrame cung cp AWT frame
public static void main(String[] args) {
Frame

frame

new

MainFrame(new

HelloJava3Da(), 256, 256);

http://tailieuhay.com

226

Lp trnh ha trn Java 2D v 3D


} // end of main (method of HelloJava3Da)
Ba on m 1-1, 1-2, 1-3 trn nh nn mt chng trnh Java 3D
hon thin khi cc cu lnh import c s dng. Hu ht cc lp s dng
trong chng trnh Java 3D trong cc gi javax.media.j3d, hoc
javax.vecmath. Trong v d ny lp tin ch ColorCube c tm thy
trong gi com.sun.j3d.utils.geometry kt qu l hu ht chng trnh
Java 3D u c nhng cu lnh import cc th vin nh hnh 1-4,
ngoi tr lp tin ch ColorCube.
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import
com.sun.j3d.utils.universe.SimpleUniverse;
Trong v d pha trn mt i tng ha n c t trong mt v
tr n. Ta c th khung cnh nh bn di:

http://tailieuhay.com

227

Lp trnh ha trn Java 2D v 3D

M ngun ca chng trnh l:


package HelloJava3D;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.SimpleUniverse;
// HelloJava3Da renders a single, rotating cube.
public class HelloJava3Da extends Applet {
public HelloJava3Da() {
setLayout(new BorderLayout());
Canvas3D canvas3D = new Canvas3D(null);
add("Center", canvas3D);
BranchGroup scene = createSceneGraph();
// SimpleUniverse is a Convenience Utility class
SimpleUniverse

simpleU

new

SimpleUniverse(canvas3D);
// This will move the ViewPlatform back a bit so the
// objects in the scene can be viewed.

http://tailieuhay.com

228

Lp trnh ha trn Java 2D v 3D

simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(scene);
} // end of HelloJava3Da (constructor)
public BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
objRoot.addChild(new ColorCube(0.4));
return objRoot;
} // end of CreateSceneGraph method of HelloJava3Da
// The following allows this to be run as an application
// as well as an applet
public static void main(String[] args) {
Frame frame = new MainFrame(new HelloJava3Da(), 256,
256);
} // end of main (method of HelloJava3Da)
} // end of class HelloJava3Da
Kt qu ca chng trnh chy l:

http://tailieuhay.com

229

Lp trnh ha trn Java 2D v 3D

1.6.1 Cc lp ca Java 3D Classes c s dng trong


HelloJava3Da
hiu chi tit hn v cc lp Java 3D v v d trn chng ta quan
tm n nhng lp sau:
Lp BranchGroup
i tng kiu ny thng c dng nh dng th khung cnh.
Mi instance ca BranchGroup l gc ca mt th con. i tng
BranchGroup ch c php l con ca i tng Locale.
BranchGroup c th c nhiu con, con ca n c th l Group hoc
Leaf.

BranchGroup constructor
BranchGroup ()
Instance ca BranchGroup c coi l gc ca mt nhnh th,
mi i tng BranchGroup ch l i tng c th chn vo tp cc i
tng ca Locales.

http://tailieuhay.com

230

Lp trnh ha trn Java 2D v 3D


Lp Canvas3D
Lp Canvas3D c tha k t Canvas ca AWT. Ti thiu mt
i tng Canvas3D phi c tham chiu n trong mt th nhnh
hnh thc ca th khung cnh.
Canvas3D constructor
Canvas3D(GraphicsConfiguration graphicsconfiguration)
Khi to v thit lp mt i tng Canvas3D mi cho php Java
3D c th dng nn cu hnh ng n ca i tng
(GraphicsConfiguration). N l phn m rng ca lp AWT Canvas.

Lp Transform3D
i tng Transform3D i in cho vic bin hnh ca hnh hc
3D nh dch v quay. Nhng i tng ny thng ch s dng to
mt i tng TransformGroup. u tin i Transform3D c
khi to, c kh nng lin kt vi cc i tng Transform3D khc.
Sau TransformGroup c khi to s dng Transform3D va
to.
Transform3D Default Constructor
Mi i tng tng quan khi thay i hnh dng thng qua mt ma
trn 4x4 vi cc im thc. i tng Transform3D khng c s
dng trong th khung cnh. N ch c dng ch ra s bin hnh
ca mt i tng TransformGroup.
Transform3D()
To i tng Transform3D m i din cho ma trn ban u
(khng c bin i)
Mt i tng Transform3D c th i din cho tnh tin, quay,
bin hnh theo quy m,hoc l kt hp cc phng php trn li. Khi c
hin tng quay, gc c th hin di dng radians. Mt vng quay

http://tailieuhay.com

231

Lp trnh ha trn Java 2D v 3D


y l 2 PI radians. Mt cch ch ra gc quay l s dng hng
Math.PI, nu khng th c th ch ra gc quay chnh xc.
Cc phng thc ca Transform3D
i tng Transform3D i din cho cc php bin i hnh hc
nh quay,dch phng ln thu nh. Transform3D l mt trong s it cc
lp khng trc tip s dng trong th khung cnh. Vic bin hnh do
Transform3D iu khin u c tc ng ln i tng
TransformGroup m c s dng trn th khung cnh.
void rotX(double angle)
Php quay vi trc X ngc chiu kim ng h, vi gc (angle) l
gi tr radian.
void rotY(double angle)
Php quay vi trc Y ngc chiu kim ng h, vi gc (angle) l
gi tr radian.
void rotZ(double angle)
Php quay vi trc Z ngc chiu kim ng h, vi gc (angle) l
gi tr radian.
void set(Vector3f translate)
To gi tr bin i ca ma trn cho gi tr ca tham s Vertor3f, v
to cc thnh phn khc ca ma trn nu vic bin hnh da trn ma
trn.

Lp TransformGroup
y l lp con ca lp Group, mi instance ca TransformGroup
c s dng to th khung cnh v c mt tp cc i tng nt
con. i tng TransformGroup gi gi tr bin hnh. Vic bin hnh
thng c to trn i tng Transform3D vn khng phi l mt
i tng ca th khung cnh.

http://tailieuhay.com

232

Lp trnh ha trn Java 2D v 3D


TransformGroup Constructors
TransformGroup()
Khi to v thit lp mt i tng TransformGroup s dng php
bin i ng nht
TransformGroup(Transform3D t1)
Khi to v thit lp mt i tng TransformGroup t mt i
tng Transform3D
Tham s: t1 i tng Transform3D
Php bin hnh lu trong i tng Transform3D c copy vo
mt i tng TransformGroup khi i tng TransformGroup c
to hoc bng cch s dng phng thc Transform ().
TransformGroup setTransform()
void setTransform(Transform3D t1)
Lp thnh phn bin hnh ca TransformGroup cho gi tr ca php
bin hnh trc
Tham s: T1 php bin hnh cn sao chp

Lp Vertor3f
L lp ton hc trong gi javax.vecmath nh ra mt vertor s
dng 3 im s thc. Cc i tng vertor thng c s dng ch
ra php bin hnh trong hnh hc. i tng Vertor3f khng c s
dng trc tip trong cu trc ca th khung cnh. Chng thng c
s dng ch ra cc c nh bin i.
Vector3f Constructors
Vector3f()
To v thit lp cc gi tr Vertor3f cho (0,0,0)
Vector3f(float x, float y, float z)
To v thit lp cc gi tr Vertor3f cho (x,y,z)

http://tailieuhay.com

233

Lp trnh ha trn Java 2D v 3D


ColorCube
ColorCube Constructors
Package: com.sun.j3d.utils.geometry
L mt hnh lp phng cc mt c cc mu khc nhau, c m
rng t lp Shape3D, t l mt nt l. ColorCube rt d s dng khi
a vo trng mt mi trng o.
ColorCube ()
To mt hnh lp phng vi kch thc mc nh, v tr 1 mt
cch mi trc ta xyz
ColorCube(double scale)
To nn hnh lp phng c kch thc c nh ra bi cc
gi tr cho trc.
1.7 Quay hnh lp phng
quay hnh lp phng chng ta va to th bc u tin l to
php bin hnh mong mun s dng i tng Transform3D. on m
1-5 a ra mt i tng Transform3D trong th khung cnh quay
hnh lp phng quanh trc x. Do php bin hnh u tin l quay. i
tng Transform3D c to ra dng 6, s dng phng thc rotX()
dng 8. i tng TransformGroup sau c to gi thng tin quay
dng th 10.
tham s ch ra php quay ny:l trc v gc quay. Trong gc quay
c xc nh thng qua tham s u vo. i tng Transform3D c
to xong th c s dng to i tng TransformGroup l
objRotate. i tng Transform3D c s dng trong th khung
cnh i tng objRotate sau ly i tng ColorCube lm con ca
n. n lt objRoot li ly objRotate lm con.

http://tailieuhay.com

234

Lp trnh ha trn Java 2D v 3D


public BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
//

rotate

object

has

composited

transformation matrix
Transform3D rotate = new Transform3D();
Transform3D tempRotate = new Transform3D();
rotate.rotX(Math.PI/4.0d);
tempRotate.rotY(Math.PI/5.0d);
rotate.mul(tempRotate);
TransformGroup

objRotate

new

TransformGroup(rotate);
objRoot.addChild(objRotate);
objRotate.addChild(new ColorCube(0.4));
// Let Java 3D perform optimizations on this
scene graph.
objRoot.compile();
return objRoot;
}
Nh vy bn th nhnh ni dung c cc i tng nh hnh di,
ch l i tng BranchGroup bao gi cng l con ca mt Locale.

http://tailieuhay.com

235

Lp trnh ha trn Java 2D v 3D

1.7.1 S kt hp ca cc php bin hnh: HelloJava3Db


Trong trng hp c nhiu php bin hnh ng thi xy ra, v d
ca chng ta l s c 2 php bin hnh ng thi, s c ch trn mt i
tng quan st duy nht. 2 php bin i c th thng qua mt ma trn
bin i v c gi bi mt i tng TransformGroup.
Trong v d hnh 1-6 chng ta quan st di y thc hin 2 php
quay trn 2 trc x v y. 2 i tng Transform3D vi mi php quay
c to ra dng 6 v 7. Sau 2 php quay ring r ny c ch ra
trn 2 i tng TransformGroup (dng 9 v 10). Sau cc php quay
c ni li vi nhau bng cc nhn i tng
Di y l th khung cnh v kt qu chy chng trnh

Kt qu:
http://tailieuhay.com

236

Lp trnh ha trn Java 2D v 3D

1.8 Kh nng v hot ng


th khung cnh c to bi chng trnh Java 3D c th s dng
trc tip trong vic dng hnh, tuy nhin m t ca n li khng hiu qu.
Vi mt miu t tt hn ca mi trng o s tng cng kh nng dng
hnh rt nhiu.
1.8.1 Dch cc ni dung
i tng BranchGroup c mt phng thc dch. Phng thc ny
chuyn ton b th nhnh di thnh cc m t Java 3D trong ca
th nhnh. Thm vo , nhng m t bn trong ny c th ti u ha theo
cch ny hay cch khc.
Mt trong nhng cch l, kt hp TransformGroups vi ng i
th khung cnh . V d nu mt th khung cnh c 2 i tng
TransformGroup trong mt mi lin h cha con chng c th i din
bng mt i tng TransformGroup. Mt cch khc l lin kt i
tng Shape3D vn c mi lin h vt l tnh.
Hnh 1-16 di y a ra mt m t mi hiu qu hn.

http://tailieuhay.com

237

Lp trnh ha trn Java 2D v 3D

1.8.2 Kh nng
Mt khi th nhnh c lm cho sng v dch, h thng dng hnh
ca Java 3D chuyn th nhnh sang mt m t bn trong hiu qu hn,
qua cng tng cao hiu nng dng hnh.
Vic bin i qua m t bn trong c nhng tc ng khc nhau. Mt
trong s l c nh gi tr bin hnh v cc i tng trong th
khung cnh. Tr phi c ch ra chi tit ca chng trnh, th s khng c
kh nng thay i gi tr ca cc i tng th khung cnh sau khi
chng sng.
C nhng trng hp mt chng trnh vn cn kh nng thayi gi
tr ca chng trong mt i tng th khung cnh sau khi n sng.
V d nh vic thay i gi tr ca mt i tng TransformGroup to
hot ha. Mt danh sch cc tham s c th truy cp c v khi
ngi ta gi l nng lc (capability) ca mt i tng.
Mi i tng SceneGraphObject c mt tp cc bit nng lc. Gi
tr ca cc bit ny xc nh kh nng c th tn ti cho i tng sau khi

http://tailieuhay.com

238

Lp trnh ha trn Java 2D v 3D


n c dch hay sng. Tp cc nng lc ny bin i khc nhau trn cc
lp.
SceneGraphObject Methods
SceneGraphObject l lp gc thng c s dng to mt th
khung cnh bao gm c Group, Leaf v NodeComponent.
void clearCapability(int bit)
Xa cc bit kh nng
boolean getCapability(int bit)
Phc hi.
Nh trong mt v d ni, c th c c gi tr bin hnh i
din cho mt i tng TransformGroup, th cc kh nng ca n phi
c thit lp trc khi hoc n c dch hoc tr nn sng.
Trong phn ti, cc hot ha c th c to ra ty theo cc thi gian
khc nhau ca php bin hnh. Mun c iu ny TransformGroup phi
c tp kh nng ALLOW_TRANSFORM_WRITE trc khi n c
dch hoc sngVic iu khin kh nng truy cp n cc lnh vc khc
ca

tng

TransformGroup

cng

nh

vy.

tng

TransformGroup.
TransformGroup Capabilities
kh nng di y l mt trong nhng kh nng c nh ngha bi
TransformGroup. TransformGroup tha k rt nhiu bit kh nng ca
lp tin bi ca n l Group v Node. Cc kh nng nh set,reset hay
retrieve c ng ngha SceneGraphObject.
ALLOW_TRANSFORM_READ
Ch ra cc nt cho php truy cp ti thng tin bin hnh ca i tng
ca n.
ALLOW_TRANSFORM_WRITE
Cho php ghi ti thng tin bin hnh ca i tng ca n.
http://tailieuhay.com

239

Lp trnh ha trn Java 2D v 3D


Group Capabilities
TransformGroup tha k cc kh nng t cc lp cha ca n.
ALLOW_CHILDREN_EXTEND
Thit lp kh nng cho php con c th thm vo nut Group sau khi n
c dch hoc sng.
ALLOW_CHILDREN_READ
Thit lp kh nng cho php cc tham chiu n con ca nt Group c
th c c sau khi n c dch hoc sng.
ALLOW_CHILDREN_WRITE
Thit lp kh nng cho php them chiu n cc con ca nt Group
ghi hay thay i sau khi n c dch hoc sng.
1.9 Thm vo cc hnh vi animation
Trong Java 3D, Behavior l mt lp quan trng v animation vi cc
tng tc ca cc i tng. Ngi lp trnh c th thay i bt c thuc
tnh no ca mt i tng quan st.
S khc nhau gia animation v interaction l khi no thuc tnh c
kch hot khi phn hi qua thi gian hay phn hi qua cc hnh ng ca
ngi s dng.
Vi mi i tng quan st trong mt mi trng o c th c nhng
hnh vi sn c ca n. Thc t th thng c nhiu hnh vi . ch ra mt
hnh vi cho mt i tng quan st, ngi lp trnh to mt i tng m
ch ra hnh vi , thm vo cc i tng quan st ti th khung cnh
v xy dng nhng tham chiu gia cc i tng th v cc i tng
hnh vi.
Trong mt mi trng o vi rt nhiu hnh vi, th cn mt lng tnh
ton rt ln. Khi c vic dng hnh v cc hnh vi s dng cng chung
nhiu process, th tht kh c th nng cao hiu nng hot ng c.

http://tailieuhay.com

240

Lp trnh ha trn Java 2D v 3D


Java 3D cho php lp trnh vin c thm qun l vn ny bng cch
ch ra v tr ca mt hnh vi. Khu vc ny c gi l scheduling region.
Mt hnh vi khng hot ng tr phi activation volume ca
ViewPlatform phn ct mt vng danh mc . Ni cch khc,khng c
ch trong rng l ri th s khng c l ri. Tnh nng vng danh mc
lm cho Java 3D hiu qua hn trong vic nm bt mt mi trng o vi
rt nhiu hnh vi.
Hnh 1-7 ch ra cc bc bao gm c vic nh ra mt animation vi
mt i tng thm vo.
1. Create a target TransformGroup
Set the ALLOW_TRANSFORM_WRITE capability
2. Create an Alpha5 object
Specify the time parameters for the alpha
3. Create the interpolator object
Have it reference the Alpha and TransformGroup objects
Customize the behavior parameters
4. Specify a scheduling region
Set the scheduling region for the behavior
5. Make the behavior a child of the TransformGroup

1.9.1 nh ngha cc hnh vi animation


Mt hnh vi c th thay i trn a im (PositionInterpolator),
hng

(RotationInterpolator),

kch

c(ScaleInterpolator),

mu

sc(ColorInterpolator) hoc trong sut(TransparencyInterpolator) ca


mt i tng quan st. Nh ni pha trn Interpolator l cc lp
hnh vi c nh ngha trc. Tt c cc hnh vi ni trn u c th s
dng m khng cn nh trc tuy nhin vic nh trc cho php vic
http://tailieuhay.com

241

Lp trnh ha trn Java 2D v 3D


to cc hnh vi tr nn d dng hn rt nhiu. Cc lp nh trc ny
cung cp cc hnh ng khc nhau thm ch kt ni cc hnh ng .
Lp RotationInterpolator
Lp ny s dng ch ra mt hnh vi quay ca mt i tng quan st
hoc mt nhm cc i tng nh vy. Mt i tng
RotationInterpolator thay i mt i tng TransformGroup qua
mt php quay khi phn hi gi tr ca mt i tng Alpha. Khi gi tr
ca i tng Alpha thay i qua thi gian vic thay i php quay
cng d dng. Mt i tng RotationInterpolator rt linh ng trong
vic ch ra trc quay, gc quay ban u gc quay kt thc.

RotationInterpolator Constructor
RotationInterpolator(Alpha alpha, TransformGroup target)
Hm khi to ny s dng cc gi tr mc nh cho mt vi tham s
ca hnh vi mc nh khi to mt php quay y trn trc y,
bng i tng TransformGroup c ch ra bng hnh vi mc nh.
Tham s:
alpha thi gian hm thay i tham chiu
target i tng TransformGroup cn thay i
5 Alpha l mt lp trong Java 3D to ra cc hm bin i thi gian.
1.9.2 Cc hm bin i v thi gian: nh x mt hnh vi vi thi gian
Vic nh x mt i tng vi thi gian thng qua mt i tng Alpha.
Lp Alpha
Lp ny c s dng to hm bin i theo thi gian. Lp ny
cung cp cc gi tr gia 0 v 1,. Gi tr ny ph thuc vo thi im v
thng s ca i tng Alpha. i tng Alpha thng c s dng
vi cc i tng hnh vi sn c thc hin cc thay i hot ha ca
cc i tng quan st.
http://tailieuhay.com

242

Lp trnh ha trn Java 2D v 3D


C 10 tham s cho Alpha, do gip cho ngi lp trnh s dng
linh ng. Mi instance ca i tng Alpha c th d dng kt hp vi
mt hnh vi a ra cc php quay n gin, cnh bay, ca m,hay bn
rocket.
Alpha Constructor
Alpha()
Lin tc lp vi thi gian nh k l 1 giy
Alpha(int loopCount, long increasingAlphaDuration)
Hm khi to ny ly loopCount v increasingAlphaDuration nh l
tham s v ng k gi tr mc nh cho tt c cc tham s cn li. i
tng Alpha to ra cung cp gi tr khi u t 0 ln 1. iu ny lp i
lp li nhiu ln thng qua loopCount. Nu loopCount = -1 i tng
alpha lp i lp li v hn.
Tham s:
loopCount s ln chy i tng alpha ny, gi tr bng -1 lp
v hn
increasingAlphaDuration thi gian tnh bng giy gia bc
nhy t 0 ln 1

1.9.3 Lp danh mc cc vng


Nh ni phn 1-9 mi hnh vi c mt vng danh mc. Vng ny
quanh

cc

hnh

vi

thit

lp

da

trn

phng

thc

setSchedulingBounds ca lp Behavior.
C rt nhiu cch nh ngha vng danh mc ny nhng cch n gin
nht l to i tng BoundSphere . Cc ty chn khc nh bounding
box, hoc bouding polytope.
Behavior setSchedulingBounds method
void setSchedulingBounds(Bounds region)
http://tailieuhay.com

243

Lp trnh ha trn Java 2D v 3D


Xc nh ranh gii cho vng danh mc ca hnh vi
Parameters:
region ranh gii cha Behavior's scheduling region.

Lp BoundingSphere
Vic nh ngha mt vng cu phi i i vi vic ch ra im trung
tm v bn knh ca n. Cch thng lm l tm ca hnh cu v tr
trung tm l (0,0,0). Bn knh sau c la chn sao cho hnh cu
cha i tng quan st, bao gm tt c cc v tr m i tng c th
.
Bounding Sphere Constructors
BoundingSphere()
To mt hnh cu bao m tm v tr (0,0,0) vi bn knh bng 1
BoundingSphere(Point3d center, double radius)
2 tham s ln lt l
center ta ca tm trong khng gian
radius bn knh ca hnh cu
1.9.4 V d v hnh vi: HelloJava3Dc
on m hnh 1-7 a ra mt v d hon thin v vic s dng lp
thm vo to animation. Animation c to trong on m ny l
hnh lp phng quay lin tc trong thi gian 4 giy.
Bc u tin ca cng thc l to i tng TransformGroup
sa i ti thi im chy. i tng TransformGroup ca mt hnh vi
sn c phi c kh nng ghi. i tng TransformGroup tn l objSpin
c to dng 7. Kh nng ca n c thit lp dng th 8.

http://tailieuhay.com

244

Lp trnh ha trn Java 2D v 3D


Bc 2 l to i tng Alpha, rotationAlpha, c s dng xc
nh thi gian quay lin tc. 2 tham s ch ra trong dng 16 ca on m
l s vng lp v thi gian cho mi vng . Gi tr -1 ca s vng lp th
hin vic lp lin tc. Thi gian c tnh theo mili giy gi tr 4000 c
s dng trong chng trnh tng ng vi 4 giy. T hnh vi l
quay mt ln trn 4 giys.
Bc

to

tng

thm

vo.

tng

quay

RotationInterpolator c to ra dong 21 v 22. i tng thm vo


phi tham chiu n i tng bin hnh v alpha. iu ny c m t
trong hm khi to. Trong v d ny hnh vi mc nh
RotationInterpolator l c s dng, thc hin php quay hon ton
quanh trc y.
Bc 4 ch ra vng danh mc. Trong on m, mt i tng
BoundingSphere c s dng vi gi tr mc nh, c to ra dng
25. Vng cu ny l vng bao quanh ca hnh vi trong dng 26.
Cui cng l bc 5 trong cng thc, bin hnh vi thnh mt con ca
TransformGroup trn dng 27.
public BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup

objRoot

new

BranchGroup();
// Create the transform group node and
initialize it to the
// identity. Add it to the root of the
subgraph.
TransformGroup

objSpin

new

TransformGroup();

http://tailieuhay.com

245

Lp trnh ha trn Java 2D v 3D


objSpin.setCapability(TransformGroup.AL
LOW_TRANSFORM_WRITE);
objRoot.addChild(objSpin);
// Create a simple shape leaf node, add
it to the scene graph.
// ColorCube is a Convenience Utility
class
objSpin.addChild(new ColorCube(0.4));
// Create a new Behavior object that
will perform the desired
// operation on the specified transform
object and add it into
// the scene graph.
Alpha rotationAlpha = new Alpha(-1,
4000);
RotationInterpolator rotator =
new
RotationInterpolator(rotationAlpha, objSpin);
// a bounding sphere specifies a region
a behavior is active
// create a sphere centered at the
origin with radius of 100
BoundingSphere

bounds

new

BoundingSphere();
rotator.setSchedulingBounds(bounds);

http://tailieuhay.com

246

Lp trnh ha trn Java 2D v 3D


objSpin.addChild(rotator);
return objRoot;
} // end of CreateSceneGraph method
Code Fragment 1-7 createSceneGraph method with RotationInterpolator
Behavior
th khung cnh ca chng trnh v kt qu chy trn mn hnh.

Kt qu

http://tailieuhay.com

247

Lp trnh ha trn Java 2D v 3D


1.9.5 Php bin hnh v kt hp cc hnh vi .V d: HelloJava3Dd
Tt nhin chng ta c th kt hp cc hnh vi vi cc php bin hnh
quay vi v d di y. Trong th nhnh ni dung c nhng i tng
objRotate v objSpin, phn bit vi nhng php quay tnh v hnh vi ca
i tng hnh lp phng.
th khung cnh
public BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
//

rotate

object

has

composited

transformation matrix
Transform3D rotate = new Transform3D();
Transform3D tempRotate = new Transform3D();
rotate.rotX(Math.PI/4.0d);
tempRotate.rotY(Math.PI/5.0d);
rotate.mul(tempRotate);
TransformGroup

objRotate

new

TransformGroup(rotate);
//

Create

the

transform

group

node

and

initialize it to the
//

identity.

Enable

the

TRANSFORM_WRITE

capability so that
//

our

runtime.

behavior

code

can

modify

it

at

Add it to the

// root of the subgraph.


http://tailieuhay.com

248

Lp trnh ha trn Java 2D v 3D


TransformGroup

objSpin

new

TransformGroup();
objSpin.setCapability(TransformGroup.ALLOW_TRANS
FORM_WRITE);
objRoot.addChild(objRotate);
objRotate.addChild(objSpin);
// Create a simple shape leaf node, add it
to the scene graph.
// ColorCube is a Convenience Utility class
objSpin.addChild(new ColorCube(0.4));
// Create a new Behavior object that will
perform the desired
//

operation

on

the

specified

transform

object and add it into


// the scene graph.
Transform3D yAxis = new Transform3D();
Alpha rotationAlpha = new Alpha(-1, 4000);
RotationInterpolator rotator =
new RotationInterpolator(rotationAlpha,
objSpin, yAxis,
0.0f,

(float)

Math.PI*2.0f);

http://tailieuhay.com

249

Lp trnh ha trn Java 2D v 3D


// a bounding sphere specifies a region a
behavior is active
// create a sphere centered at the origin
with radius of 1
BoundingSphere

bounds

new

BoundingSphere();
rotator.setSchedulingBounds(bounds);
objSpin.addChild(rotator);
return objRoot;
} // end of CreateSceneGraph method of
HelloJava3Dd

Kt qu

http://tailieuhay.com

250

Lp trnh ha trn Java 2D v 3D

http://tailieuhay.com

251

Lp trnh ha trn Java 2D v 3D

CHNG 2
To cc hnh

2.1 H ta th gii o
Trong chng 1 ta bit vi mi instance ca mt lp
VirtualUniverse c chc nng nh mt gc ca th khung cnh trong
tt c chng trnh Java 3D. T kha virtual universe l ch mt khng
gian o 3 chiu trong c cc i tng 3D. Mi i tng Locale trong
mt mi trng o thit lp mt th gii o Cartesian. i tng ny
tng ng vi mt con tr tham chiu cho mt i tng quan st
trong mt mi trng o. Vi mt i tng Locale trong
SimpleUniverse c mt h ta duy nht.
H ta ca mi trng o Java 3D l thun phi tc l trc X
hng dng bn tay phi, trc Y hng dng ch ln trn, trc Z hng
dng ch vo ngi nhn vi n v l mt. Hnh 2-1 di y ch ra
hng nhn trong SimpleUniverse.

http://tailieuhay.com

252

Lp trnh ha trn Java 2D v 3D

2.2 Visual Object Definition Basics


Phn 2.2.1 gii thiu lp Chen code lai cho ro rang ., cn lp Chen
code lai cho ro rang .c gii thiu phn 2.2.2, sau khi i vo nhng
nh ngha c bn v hnh hc trong gi tin ch, phn cn li ca chng
ny s tho lun v gc hnh hc v hnh dng ca cc nt thnh phn.
2.2.1 An Instance of Shape3D Defines a Visual Object
Nt th khung cnh Shape3D nh ngha mt i tng quan st.
Shape3D l mt trong cc lp con ca lp Leaf t i tng Shape3D
ch c th l l trong th khung cnh. i tng Shape3D khng cha
thng tin v hnh dng hay mu sc ca mt i tng quan st. Thng tin
ny c lu trong i tng NodeComponent c chuyn n bi i
tng Shape3D. Mt i tng Shape3D c th quy vo mt nt thnh
phn hnh hc v mt nt thnh phn giao din.
Trong th khung cnh Hellojava3D chng 1, biu tng hnh t
gic dng i din cho i tng ColorCube. th khung cnh trong
hnh 2-2 ch ra i tng quan st c i din bi mt l Shape3D
(hnh tam gic) v 2 NodeComponent ( van) thay cho hnh dng t gic.

http://tailieuhay.com

253

Lp trnh ha trn Java 2D v 3D

Mt i tng quan st c th nh ngha bng cch s dng ch di


tng Shape3D v mt nt thnh phn hnh hc. Vi ty chn ny, i
tng Shape3D quy cho mt nt Appearance. Hm to cho i tng
Shape3D cho php i tng Shape3D c to m khng cn tham
chiu ca nt thnh phn, hoc ch vi tham chiu thnh phn hnh hc,
hoc c 2 dng.
Shape3D Constructors
Shape3D()
Khi to v thit lp i tng Shape3D m khng c nt thnh
phn hnh hc v giao din
Shape3D(Geometry Geometry)
Khi to v thit lp ch vi thnh phn hnh hc
Shape3D(Geometry Geometry, Appearance Appearance)
Khi to v thit lp ch vi c 2 thnh phn.
Cho n khi i tng Shape3D khng sng hoc khng c dch
na th tham chiu nt thnh phn c th thay i vi cc phng thc
di y.
Shape3D Methods

http://tailieuhay.com

254

Lp trnh ha trn Java 2D v 3D


i tng Shape3D tham chiu n i tng nt thnh phn hnh
hc v giao din.
void setGeometry(Geometry Geometry)
void setAppearance(Appearance Appearance)
Shape3D Capabilities
i tng Shape3D tha k cc kh nng t SceneGraphObject, Node
v Leaf.
ALLOW_GEOMETRY_READ | WRITE
ALLOW_APPEARANCE_READ | WRITE
ALLOW_COLLISION_BOUNDS_READ | WRITE
2.2.2 Node Components
i tng NodeComponent cha cc nh ngha chnh xc v cc
thuc tnh ca mt i tng quan st. Vi mi lp con ca
NodeComponent nh ngha ch xc cc thuc tnh quan st. Hnh 2-3
ch ra cc phn tha k ca Java 3D API cha lp NodeComponent v
lp trc n. Phn 2-5 s gii thiu v NodeComponent Germetry. Phn
2-6 gii thiu v Appearance NodeComponent.

http://tailieuhay.com

255

Lp trnh ha trn Java 2D v 3D

2.2.3 Defining Visual Object Classes


Cng mt i tng quan st s thng xut hin nhiu ln trong mt
mi trng o. iu gi cho vic nh ngha mt lp to i
tng quan st thay v thit lp mi i tng quan st ring l. C nhiu
cch thit k mt lp nh ngha mt i tng quan st.
T chc ca lp VisualObject cng ging nh lp ColorCube m
trong n c tha k t i tng VisualObject. Lp VisualObject
l mt im ngh u tin cho vic nh ngha cc lp ni dung s
dng trong xy dng th khung cnh. Mi ngi lp trnh Java 3D s
ty bin lp VisualObject theo ca h. Chng ta c thm xem mt v
d y v lp ColorCube trong gi com.sun.j3d.utils.Geometry .
S dng Shape3D nh l lp c bn cho vic to mt i tng quan
st cho php d dng s dng trong chng trnh Java 3D. Lp i tng
quan st c th c s dng d dng nh lp ColorCube trong v d
HelloJava3D t chng, Hm to c th c gi v nhng i tng

http://tailieuhay.com

256

Lp trnh ha trn Java 2D v 3D


mi nht c thm vo nh l con ca mt vi Group trn mt dng ca
on m. Trong on m di y objRoot l mt instance ca Group.
on m ny to mt VisualObject v thm n vo nh l cong ca
objRoot trong th khung cnh.
objRoot.addChild(new VisualObject());
Hm to ca VisualObject to i tng quan st bng cch tp mt
i tng Shape3D tham chiu n NodeComponent c to bi
phng thc createGeometry()v createAppearance().
Phng thc createGeometry()to mt nt thnh phn hnh hc c
s dng trong i tng quan st. Phng thc createAppearance()c
trch nhim cho vic to NodeComponent nh ngha b ngoi cho
i tng quan st.
Hm to ca VisualObject to i tng quan st bng cch nh
ngha mt lp container khng khng tha k t Java 3D API. Trong thit
k ny lp i tng quan st s cha mt Group Node hoc Shape3D
nh l gc ca mt nhnh th n nh ngha. Lp ny phi nh ngha
phng thc tr v mt tham chiu n gc. Cng ngh ny c th c
nhiu vic hn nhng li d dng hiu. Ngoi ra cn c cc lp khc
trong gi v hnh hc nh Box, Cone, Cylinder v Sphere. Mi lp m
rng t Primitive, vn m rng t Group.

2.3 Cc lp tin ch hnh hc


Phn ny bao gm tt c cc lp tin ch dng to hnh hp, hnh
nn, hnh tr, v hnh cu c bn. Cc hnh c bn ny l cch d th hai
to mt mi trng o. Cn cch d nht ng nhin l dng hnh lp
phng.
Cc lp c bn ny cung cp cho ngi lp trnh tnh linh ng hn
rt nhiu so vi lp hnh lp phng mu a ra. Lp ColorCube nh

http://tailieuhay.com

257

Lp trnh ha trn Java 2D v 3D


ngha v mt hnh hc v mu trn cc nt thnh phn hnh hc. Kt qu
l mi th xung quanh n tr nn c nh tr kch thc ca n. Kch
thc hnh lp phng ch c xc nh khi i tng c to.
Mt lp c bn c gi l linh ng nu n xc nh hnh dng m
khng phi xc nh mu sc i km. Trong cc lp tin ch c bn hnh
hc, ngi lp trnh khng th thay i hnh hc nhng c th thay i b
ngoi. Cc lp ny cung cp cho ngi lp trnh tnh linh ng khi c
nhiu instance trn mt hnh c bn mi phn c mt din mo khc
nhau bng cch tham chiu n cc NodeComponent Appearance khc
nhau.
Cc lp ny c nh ngha trong gi com.sun.j3d.utils.Geometry.
Lp c bn nht ca cc lp ny l lp Primitive, di y l hnh2-4 th
hin cy tha k cc lp ny.

2.3.1 Box
Lp gc Box (hnh hp) to i tng quan st hnh hp 3D. Chiu
di chiu rng chiu cao mc nh l 2 met, vi tm gc. Chiu di
http://tailieuhay.com

258

Lp trnh ha trn Java 2D v 3D


chiu rng chiu cao c xc nh trong thi gian i tng c to.
Tt nhin TransformGroup, dc theo ng th khung cnh ti Box,
c th c s dng thay i v tr v hng ca cc instance ca Box
v cc i tng quan st khc.
Box Constructors
Package: com.sun.j3d.utils.Geometry
Box

rng

Primitive,

mt

lp

khc

trong

gi

com.sun.j3d.utils.Geometry
Box()
Thit lp mt hnh hp vi mc nh chiu cao chiu di chiu rng l 2
met, tm gc.
Box(float xdim, float ydim, float zdim, Appearance Appearance)
Thit lp hnh hp vi hng, b ngoi, v tm gc.

Box, Cone, and Cylinder Methods


Package: com.sun.j3d.utils.Geometry
Cc phng thc ny c nh ngha trong mi lp c bn: Box, Cone,
v Cylinder. Cc lp c bn ny c kt hp t cc i tng
Shape3D trong mt nhm.
Shape3D getShape(int id)
Ly mt trong nhng mt Shape3D t lp c bn cha hnh hc v b
mt.i tng Box, Cone, v Cylinder c tp hp t nhiu i tng
Shape3D, vi nt thnh phn hnh hc ca n. Gi tr a ra xc
nh nt thnh phn no c ly.
void setAppearance(Appearance Appearance)

http://tailieuhay.com

259

Lp trnh ha trn Java 2D v 3D


2.3.2 Cone
Hnh nn nh ngha i tng hnh nn, bt np tm ti gc ta
vi trc song song vi trc Y.
Bn knh l 1 v chiu cao l 2. Tm ca hnh nn c coi nh l
tm ca hnh bao can hn l tm thc.
Cone Constructors
Package: com.sun.j3d.utils.Geometry
Cone()
Hm khi to mc nh vi bn knh l 1, ng knh l 2.
Cone(float radius, float height)
Hm khi to vi 2 tham s bn knh v chiu cao
2.3.3 Cylinder
Lp Cylinder (hnh tr) to mt i tng hnh tr b bt tm gc
vi trc dc theo trc Y. Gi tr mc nh l bn knh l 1, chiu cao l 2.
Cylinder Constructors
Package: com.sun.j3d.utils.Geometry
Cylinder()
Hm khi to mc nh vi bn knh l 1, chiu cao l 2.
Cylinder(float radius, float height)
Khi to vi tham s bn knh v chiu cao.
Cylinder(float radius, float height, Appearance Appearance)
Khi to vi bn knh, chiu cao v b mt.

http://tailieuhay.com

260

Lp trnh ha trn Java 2D v 3D


2.3.4 Sphere
Lp ny to i tng hnh cu tm gc, bn knh mc nh l 1.
Sphere Constructors
Package: com.sun.j3d.utils.Geometry
Sphere()
Hm khi to mc nh, bn knh l 1.
Sphere(float radius)
Hm khi to vi bn knh xc nh
Sphere(float radius, Appearance Appearance)
Hm khi to vi bn knh, b mt cho trc.

Sphere Methods
Package: com.sun.j3d.utils.Geometry
Shape3D getShape()
Ly i tng Shape3D cha dng hnh hc v b mt.
Shape3D getShape(int id)
Phng thc ny cng c s dng vi cc lp c bn pha trn. Tuy
nhin 1 Sphere ch c mt i tng Shape3D nn id =1.
void setAppearance(Appearance Appearance)
Lp b mt cho hnh cu.

http://tailieuhay.com

261

Lp trnh ha trn Java 2D v 3D


2.3.5 More About Geometric Primitives
Cc c bn cha c nh ngha v mu sc. Cc hnh khng nh
ngha mu m tha k mu t nt thnh phn b mt ca n. Nu khng
c tham chiu n nt thnh phn b mt, i tng quan st s c mu
mc nh l trng.

2.3.6 ColorCube
Lp ColorCube c trnh by y th hin s tng phn vi cc
lp hnh c bn nh Box, Cone, Cylinder v Sphere. Lp ny m rng
theo hng tha k khc, n l lp con ca Shape3D. Cy tha k c
ch ra trong hnh 2-5.

Lp ny cng l lp duy nht cung cp vi Java 3D API cho php


ngi lp trnh b qua cc phn nh mu sc v nh sng. V l do ny
nn n thng c dng nhanh chng to ra mt th khung cnh
kim th hnh nguyn mu.

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


Phn ny gii thiu v d n gin qua vic s dng lp Cone, mc
tiu ca chng trnh l dng nn mt con yo-yo. Chng ta phi dng 2
http://tailieuhay.com

262

Lp trnh ha trn Java 2D v 3D


hnh nn to nn c Yo-Yo. Cc hnh ca Java 3D API cho php
yo-yo c th di chuyn ln xung nhng trong phn ny s khng trnh
by n.
Hnh 2-5 di y hin th th khung cnh ca chng trnh thit
k lp ConeYoyo v ConeYoyoApp. V tr mc nh ca mt i tng
Cone thng qua hnh bao ca n tm gc. Hng ca hnh nn l hng
dng, nh nm trn trc Y. Yo-yo nh ra 2 hnh nn m c quay
quanh Z v dch theo tr X nh ca chng trng nhau gc. Nhng
kt hp ca php quay v dch cho php ghp cc i tng hnh nn vi
nhau.

Nhnh t ny bt u bng i tng BranchGroup c to bi


ConeYoyo, ng ca th khung cnh ti mi i tng Cone bt u
bng i tng TransformGroup ch ra php dch, theo l
TransformGroup xc nh php quay v hy i tng Cone.
http://tailieuhay.com

263

Lp trnh ha trn Java 2D v 3D


Mt vi th khung cnh c th i din cho cng mt mi trng
o. Trong v d hnh 2-6 c mt vi thay i, thay i u tin l i
tng BranchGroup c con l ConeYoyo v c chn vo i tng
ConeYoyo trc tip trn Locale. BranchGroup ny sau l thm vo
cc i tng quan st trong tng lai ti th gii quan st. Mt thay i
khc l kt ni 2 i tng TransformGroup trong i tng
ConeYoyo. Php bin i c m t n gin nh di y.
Nt Shape3D ca i tng Cone tham chiu n nt thnh phn
hnh hc. i tng Shape3D ca Cone l con ca Group trong Cone.
Khi i tng Cone tha k t Group, th Cone cn li khng th s dng
thm ln no na trong th khung cnh. Hnh 2- a ra mt v d v
thng bo li khi c gng s dng cng mt i tng Cone trong th
khung cnh. Li ny khng tn ti trong v d chng trnh a ra.

Hnh 2-8 ch ra mt hnh nh c dch vi v d va qua. Lp


ConeYoyo c sa li nh trong on m 2-2.

http://tailieuhay.com

264

Lp trnh ha trn Java 2D v 3D


Dng 14 n 21 to cc i tngca th yo-yo . Dng 23 n
25 to mi quan h gia cc i tng. Tin trnh ny c lp li trn
mt na th cn li t dng 27 n dng 38.
Dng 12 to yoyoApear, mt nt thnh phn b mt vi gi tr mc
nh c s dng bi i tng Cone. Dng 21 n 34 thit lp b mt
cho 2 hnh nn.
// /////////////////////////////////////
/////
//
//

create

Shape3D

with

geometry

and

appearance
//

the

geometry

is

created

in

method

yoyoGeometry
// the appearance is created in method
yoyoAppearance
//
public ConeYoyo() {
yoyoBG = new BranchGroup();
Appearance app = new Appearance();
//

rotate

object

has

composited

transformation matrix
Transform3D

rotate

new

Transform3D();
Transform3D

translate

new

Transform3D();

http://tailieuhay.com

265

Lp trnh ha trn Java 2D v 3D

translate.set(new

Vector3f(0.1f,

0.0f, 0.0f));
TransformGroup

yoyoTGT1

new

new

TransformGroup(translate);
yoyoBG.addChild(yoyoTGT1);
rotate.rotZ(Math.PI / 2.0d);
TransformGroup

yoyoTGR1

TransformGroup(rotate);
Cone cone1 = new Cone(0.6f, 0.2f);
cone1.setAppearance(app);
yoyoTGR1.addChild(cone1);
yoyoTGT1.addChild(yoyoTGR1);
translate.set(new

Vector3f(-0.1f,

0.0f, 0.0f));
TransformGroup

yoyoTGT2

new

TransformGroup(translate);
yoyoBG.addChild(yoyoTGT2);
rotate.rotZ(-Math.PI / 2.0d);
TransformGroup

yoyoTGR2

new

TransformGroup(rotate);
Cone cone2 = new Cone(0.6f, 0.2f);
cone2.setAppearance(app);
yoyoTGR2.addChild(cone2);
yoyoTGT2.addChild(yoyoTGR2);

http://tailieuhay.com

266

Lp trnh ha trn Java 2D v 3D


yoyoBG.compile();
} // end of ConeYoyo constructor

Code Fragment 2-2 Class ConeYoyo From ConeYoyoApp.java


Example Program
Advanced Topic: Geometric Primitive Cc dng hnh hc c bn
Cy tha k trong hnh 2-4 ch ra Primitive l lp cha ca tt c cc
lp Cone, Box, Cylinder, v Spheres. N nh ngha mt lng ln cc
trng v phng thc cng nh gi tr mc nh ca cc trng. Mi
lp con ca Primitive c mt hm khi to cho php thit lp cc c khi
i tng c xy dng. V d nh lp Sphere c hm khi to Sphere
(int). Danh sch cc c di y:
GEOMETRY_NOT_SHARED Normals are generated along with the
positions.
GENERATE_NORMALS_INWARD Normals are flipped along the
surface.
GENERATE_TEXTURE_COORDS Texture coordinates are generated.
GEOMETRY_NOT_SHARED The Geometry created will not be
shared by another
node.
Lp ny cng cho php chia s nt thnh phn hnh hc gia cc
instance ca mt primitive vi cng mt kch c. Mc nh tt cc cc
primitives l cng mt kch thc, chia s mt nt thnh phn hnh hc.
Mt v d ca mt trng c nh ngha trong lp Primitive l gi tr
integer GEOMETRY_NOT_SHARED. Trng ny ch ra dng hnh
hc c s khng c chia s vi nhng instance khc. Thit lp c
http://tailieuhay.com

267

Lp trnh ha trn Java 2D v 3D


ny trnh vic chia s gia cc primitive ca cng mt tham s
(chng hn vi hnh cu bn knh 1).
Cone myCone = new Cone(Primitive.GEOMETRY_NOT_SHARED);
Primitive Methods
Package: com.sun.j3d.utils.Geometry
Primitive m rng t Group v l lp cha ca ca cc lp Box, Cone,
Cylinder v Sphere.
public void setNumVertices(int num)
Thit lp tng s nh trong primitive ny.
void setAppearance(int partid, Appearance Appearance)
Thit lp b mt ca cc phn con. Cc i tng Box, Cone, Cylinder
c gom li vi hn mt i tng Shape3D, mi th c tim nng s
dng nt thnh phn b mt ca n. Gi tr cho mi phn ny c xc
nh khi mi nt thnh phn b mt c thit lp.
void setAppearance()
Thit lp b mt chnh ca primitive (tt c cc phn con) ti b mt
trng mc nh.

2.4 Cc lp ton hc
to i tng quan st, cn c lp hnh hc v cc lp con ca n.
Rt nhiu lp con ca lp hnh hcmo t da trn cc hnh c bn vc t,
nh im ng thng v a gic. Cc lp con ca lp hnh hc s c
m t trong phn 2-5 nhng trc chng ta quan tm n cc lp ton

http://tailieuhay.com

268

Lp trnh ha trn Java 2D v 3D


hc nh im, mu, vertor v textcord dng nh ngha cc d liu lin
nh.
Ch rng vi mi k hiu c * ng sau i din cho mt lp tn.
V d Tuple* tng ng vi Tuple2f, Tuple2d Tuple3i.
Trong cc ch s ng sau ch ra s thnh phn trong tuple, cn
cc ch ci nh cui cng i din cho kiu. f ch float, d ch double,
b i din cho byte, i l integer. V th lp Tuple3f l mt lp m qun
l 3 gi tr im thc.
Tt c cc lp ton hc ny u nm trong gi javax.vecmath.* Gi
ny nh ngha mt s lp Tuple nh l cc lp tru tng. Rt nhu cc
lp hu ch tha k t cc lp ny. Di y l hnh 2-9 cy tha k.

http://tailieuhay.com

269

Lp trnh ha trn Java 2D v 3D


Mi nh ca mt i tng quan st c th ch ra ti 4 i tng
trong javax.vecmath i din cho ta , mu b mt bnh thng v b
mt ta . Cc lp thng c s dng:
Point* (for coordinates)
Color* (for colors)

Vector* (for surface normals)


TexCoord* (for texture coordinates, see Chapter 7)
Tuple2f Constructors
Ch rng ta (Point* object) l cn thit a ch mi nh. Cc
d liu khc l ty chn ,ty thuc vo cc hnh c bn c dng hnh
nh th no. V d nh mt mu c th c nh ngha ti mi nh v
cc mu ca cc hnh c bn l c thm vo giu cc mu ti cc nh.
Nu nh nh sng c thit lp, b mt bnh thng (Vertor* object) l
cn thit. Nu b mt nh x c thit lp th ta b mt cng cn
thit vy.
Tt c cc lp cn thit c trnh by bn di y.
Tuple2f Constructors
Package: javax.vecmath
Cc lp Tuple* thng khng c s dng trc tip trong chng trnh
Java 3D nhng cung cp nn tng cho Point*, Color*, Vector*,
TexCoord*. V d nh Tuple2f cung cp c s cho Point2f, Color2f, v
TexCoord2f. Cc hm khi to di y u ng vi cc lp con
tng t nh Tuple3f v Tuple4f.
Tuple2f()
Khi to v thit lp i tng Tuple vi ta (0,0).
Tuple2f(float x, float y)
Khi to v thit lp i tng Tuple vi ta (x,y).
http://tailieuhay.com

270

Lp trnh ha trn Java 2D v 3D


Tuple2f(float t[])
Khi to v thit lp i tng Tuple t mt mng c bit.
Tuple2f(Tuple2f t)
Khi to v thit lp i tng Tuple t d liu ca mt Tuple khc
Tuple2f(Tuple2d t)
Khi to v thit lp i tng Tuple t d liu ca mt Tuple khc

Tuple2f Methods (partial list)


Package: javax.vecmath
Cc lp Tuple* thng khng c s dng trc tip trong chng trnh
Java 3D nhng cung cp nn tng cho Point*, Color*, Vector*,
TexCoord*. V d nh Tuple2f cung cp c s cho Point2f, Color2f, v
TexCoord2f. Cc hm khi to di y u ng vi cc lp con
tng t nh Tuple3f v Tuple4f. Cc phng thc ca chng cng
tng t nh vy.
void set(float x, float y)
void set(float t[])
Lp gi tr ca tuple ny t mt gi tr nh trc.
boolean equals(Tuple2f t1)
Tr v gi tr true nu trong Tuple t1 bng vi gi tr sn c ca tuple.
final void add(Tuple2f t1)
Lp gi tr ca tuple ny ti vertor tng ca n v Tuple t1.
void add(Tuple2f t1, Tuple2f t2)
Lp gi tr ca tuple ny ti vertor tng ca n v Tuple t1 v t2.
void sub(Tuple2f t1, Tuple2f t2)
Lp gi tr ca tuple ny ti vertor khc ca t1 v t2 (this = t1 - t2).

http://tailieuhay.com

271

Lp trnh ha trn Java 2D v 3D


void sub(Tuple2f t1)
Lp gi tr ca tuple ny ti vertor khc ca n v t1 (this = this - t1).
void negate()
Loi b gi tr ca mt vertor.
void negate(Tuple2f t1)
Lp gi tr cho tuple sau khi loi b gi tr ca n
void absolute()
i tt c thnh phn ca tuple ny thnh gi tr tuyt i.
void absolute(Tuple2f t)
Lp gi tr ca cc thnh phn thnh gi tr tuyt i v ghi vo tuple.

2.4.1 Point Classes


i tng Point* thng c i din cho ta ca mt nh,
chng hn nh mt vch qut nh, mt im ngun sng, ngun m thanh
v cc d liu im khc. Hm to cho lp Point* ging nh hm to ca
Tuple* ngoi tr chng tr v i tng Point*.
Point3f Methods (partial list)
Package: javax.vecmath
Lp Point* c tha k t lp Tuple*. Mi instance ca lp Tuple*
i din cho mt im n trong 2, 3 hoc 4 khng gian. Thm vo cc
phng thc ca Tuple*, lp Point* c thm cc phng thc ring ca
n, c ch ra di y.
float distance(Point3f p1)
Tr v khong cch gia im ny v im p1.
float distanceSquared(Point3f p1)
http://tailieuhay.com

272

Lp trnh ha trn Java 2D v 3D


Tr v khong cch bnh phng giu 2 im p v p1.
float distanceL1(Point3f p1)
Tr v khong cch L1 (Manhattan) gia im ny v im p1. Khong
cch L1 l:
abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2)

2.4.2 Color Classes


i tng lp mu i din cho mt mu, c th l mt nh, thuc
tnh ca cht liu, sng m hoc cc i tng quan st khc. Cc mu
c ch ra hoc l Color3* hoc Color4* kiu d liu thng l kiu
thc. Color3* xc nh mu thng qua 3 mu , xanh da tri v xanh
nc bin.Gi tr ca mu l t 0 n 255, i vi gi tr alpha l t 0.0
n 1.0. i vi i tng Color4* c thm gi tr v su. Khi gi tr
alpha bng 1 th mu hin nguyn vn. Gi tr ca mu l kiu byte c gi
tr [-128,127] tuy nhin Java vn x l gi tr mu [0,255].
V d v mt lp mu:
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);
public static final Color3f yellow

http://tailieuhay.com

= new
273

Lp trnh ha trn Java 2D v 3D


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 thy hm to ca lp Color* ging nh lp Tuple*, ngoi


tr l n tr v i tng Color*. Lp ny ch c mt hm khi to v 2
phng thc thm vo so vi lp cha ca n Tuple*.
Color* Constructors (partial list)
Package: javax.vecmath
Mi instance trong lp Color* i din cho mt mu n trong 3 thnh
phn , xanh l cy v xanh nc bin (RGB), hoc mt trong bn
thnh phn 3 mu v thm alpha (RGBA). Gi tr alpha bng 0 l
trong sut cn bng 1 l hin nguyn bn.
Color*(Color color) <new in 1.2>
To i tng Java 3D Color*() (Color3b, Color3f, Color4b,
Color4f) s dng mt i tng AWT Color. Khi khi to i tng
Color4* s dng i tng AWT Color gi tr alpha c thit lp bng
1.

http://tailieuhay.com

274

Lp trnh ha trn Java 2D v 3D


Color* Methods
Package: javax.vecmath
Lp Color* (Color3b, Color3f, Color4b, Color4f) tha k t lp Tuple*.
Mi instance ca lp ny i in cho mt mu trong 3 (RGB) hoc 4
(RGBA) thnh phn. Di y l mt vi phng thc trong Color3* v
Color4*.
void set(Color color) <new in 1.2>
Lp mu s dng mu t i tng AWT Color
Color get() <new in 1.2>
Ly mt mu coi l mt mu ca i tng 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 tng Vertor* i din cho b mt bnh thng ti cc nh d
chng cng c th i din cho hng ca mt ngun sng hoc ngun
m thanh. Mt ln na ta c th thy cc hm to ca Vertor* cng tng
t nh Tuple*.
Vector3f Methods (partial list)
Package: javax.vecmath

http://tailieuhay.com

275

Lp trnh ha trn Java 2D v 3D


Lp Vector* tha k t Tuple*. Mi instances ca lp Vector* i din
cho mt nh vertor trong khng gian 1,2,3,4 chiu. Ngoi ra n cn c
thm nhng phng thc nh di y.
float length()
Tr v di ca mt vertor
float lengthSquared()
Tr v gi tr bnh phng di ca mt vertor.
void cross(Vector3f v1, Vector3f v2)
Lp mt vertor tr thnh vertor php tuyn ca 2 vertor v1 v v2.
float dot(Vector3f v1)
Tnh ton v tr v tch s im ca product hin ti v vertor v1.
void normalize()
Bnh thng ha vertor hin ti
void normalize(Vector3f v1)
Lp gi tr ca vertor ny vi gi tr ca vertor v1 c bnh thng
ha.
float angle(Vector3f v1)
Tr v gc radians gia vertor hin ti vi vertor tham s, gi tr ny
c rng buc trong khong [0,PI].

2.4.4 TexCoord Classes


Ch c 2 lp TexCoord* c s dng nh l mt tp cc kt cu b
mt ta ti mt nh, l TexCoord2f v TexCoord3f. Vi TexCoord2f
c mt cp ta l (s, t), vi TexCoord3f th c 3 ta l (s, t, r). Hm
to ca lp ny cng tng t nh lp Tuple* v khng c thm phng
thc no so vi lp cha ca n.

http://tailieuhay.com

276

Lp trnh ha trn Java 2D v 3D


2.5 Cc lp hnh hc
Trong ha 3D, mi th t hnh tam gic n gin n hnh phc
tp nh mt chic my bay u c m hnh ha v dng di dng d
liu theo nh. Trong Java 3D mi i tng Shape3D c th gi phng
thc setGeometry() ca n tham chiu n mt hoc ch mt i tng
Geometry. Chnh xc hn Geometry l lp tru tng, cho nn mt i
tng tham chiu l mt instance ca lp con ca Geometry.
Cc lp con ca Geometry c nhng dng sau:
1. Non-indexed vertex-based Geometry (mi khi i tng quan st

c dng cc nh ca n ch c s dng mt ln)


2. Indexed vertex-based Geometry (mi khi i tng quan st c

dng cc nh ca n c s dng nhiu ln)


Cc i tng quan st khc (Cc lp Geometry, Text3D, v
CompressedGeometry)
Phn ny ch ni v 2 dng trn. Cy tha k c hin th di hnh 2-10

http://tailieuhay.com

277

Lp trnh ha trn Java 2D v 3D


2.5.1 GeometryArray Class
Nh ci tn ca lp ny cho bn hnh dung lp con ny ca Geometry
c s dng nh ngha im ng v hnh a gic in y. Nhng
thnh phn nguyn t da trn im ny l lp con ca ca lp tru tng
GeometryArray, ch ra mt mng cha cc d liu v nh. V d nh
mt i tng dng ch mt tam gic, 3 thnh phn c nh ngha,
mi thnh phn cho mi nh. Vi mi thnh phn ca mng ny duy tr
mt v tr ta cho nh ca n (c th nh ngha bng Point* vi d
liu tng t) . Ngoi nh ra ta th cc gi tr ny c th nh ngha
mu, b mt bnh thng hoc texture. V vy nhng mng ny cha ta
, mu, b mt thng, v texture, di dng d liu mng.
C 3 bc trong vng i ca mt i tng GeometryArray
1. To mt i tng rng
2. in y i tng vi d liu
3. ng ha (tham chiu) i tng t (1 hoc nhiu) i tng
Shape3D.
Bc 1: To mt i tng GeometryArray rng
Khi mt i tng GeometryArray va c khi to th cn thit
phi nh ngha 2 th
S nh, hay s thnh phn cn thit
nh dng ca d liu (ta , mu, b mt thng, v texture) c
lu ti mi nh. Cn c gi l vertex format (nh dng nh).
GeometryArray Constructor
GeometryArray(int vertexCount, int vertexFormat)
Hm to ny to i tng GeometryArray rng vi nhng s nh v
nh dng nh cho trc. Mt trong nhng c ring l cc bitwise

http://tailieuhay.com

278

Lp trnh ha trn Java 2D v 3D


OR hp vi nhau m t d liu mi nh. Nhng gi tr c nh
dng cc nh l:
COORDINATES: Ch ra mng cc nh cha ta . Bit ny buc phi
lp.
NORMALS: Ch ra mng nh cha b mt thng.
COLOR_3: Ch ra mng nh cha mu (khng c thnh phn trong
sut)
COLOR_4: Ch ra mng nh cha mu (c thnh phn trong sut)
TEXTURE_COORDINATE_2: Ch ra mng nh cha 2D texture
coordinates.
TEXTURE_COORDINATE_3: Ch ra mng nh cha 3D texture
coordinates.
Vi mi c nh dng c thit lp s c mt mng tng ng to
trong i tng GeometryArray. Mi mng ny l s nh
(vertexCount) v kch c.
V lp GeometryArray l lp tru tng nn ta ch gi phng thc
thit lp cho lp con ca n nh LineArray.
Ch lp Axis trong AxisApp.java l khc vi lp Axis chng ta t
nh ngha trong v d ny
Bc 2: in y d liu vo i tng GeometryArray rng
Sau khi khi to i tng GeometryArray, ng k d liu cho
mng tng ng vi to nh dng ca cc nh. C th lm vic ny trn
mi nh hoc s dng mng ng k d liu cho nhiu nh ch vi
mt li gi phng thc . Cc phng thc sn c sau:

http://tailieuhay.com

279

Lp trnh ha trn Java 2D v 3D


GeometryArray Methods (partial list)
GeometryArray l lp tru tng 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)
Lp ta tng ng vi nh vi mi nh c nh ngha l mt ch
mc cho i tng ny. void setCoordinates(int index, float
coordinates[])
void setCoordinates(int index, double coordinates[])
void setCoordinates(int index, Point* coordinates[])
Lp cc ta tng ng vi nh vi cc nh c nh ngha l ch
mc cho i tng ny.
void setColor(int index, float color[])
void setColor(int index, byte color[])
void setColor(int index, Color* color)
Lp mu tng ng vi nh vi mi nh c nh ngha l mt ch
mc cho i tng ny. void setColors(int index, float colors[])
void setColors(int index, byte colors[])
void setColors(int index, Color* colors[])
Lp cc mu tng ng vi cc nh ,vi mi nh c nh ngha l
mt ch mc cho i tng ny.
void setNormal(int index, float normal[])
void setNormal(int index, Vector* normal)
Lp trc giao tng ng vi mi nh ti v tr ch mc c ch ra cho
i tng ny.
void setNormals(int index, float normals[])
void setNormals(int index, Vector* normals[])
http://tailieuhay.com

280

Lp trnh ha trn Java 2D v 3D


Lp cc trc giao tng ng vi cc nh ti v tr ch mc c ch ra
cho i tng ny.
void setTextureCoordinate(int texCoordSet, int index, float texCoord[])
void setTextureCoordinate(int texCoordSet, int index, TexCoord*
coordinate)
Lp texture coordinate ng vi mi nh ti v tr ch mc cho trc cho
mt tp texture coordinate ca i tng.
GeometryArray Methods (partial list, continued)
void setTextureCoordinates(int texCoordSet, int index, <new in 1.2>
float texCoords[])
void setTextureCoordinates(int texCoordSet, int index, <new in 1.2>
TexCoord* texCoords[])
Lp cc texture coordinate ng vi cc nh ti v tr ch mc cho trc
cho mt tp texture coordinate ca i tng.
void setInitialVertexIndex(int initialVertexIndex) <new in 1.2>
Lp ch mc cho nh ban u vi i tng GeometryArray. Cho
php mt vi nh c th b qua trong vic dng hnh, v cc hot ng
khc.
void setValidVertexCount(int validVertexCount) <new in 1.2>
Lp cc gi tr tnh ton nh ng cho i tng GeometryArray.
Cho php mt vi d liu nh c th b qua khi dng hnh, chn lc v
cc hot ng khc.
on m 2-5 ch ra trng hp s dng phng thc ca
GeometryArray lu gi to v gi tr mu trong mng LineArray.
i tng trc X ch gi phng thc setCoordinate() lu tr d liu
ta . i tng trc Y gi c 2 phng thc setColor() v
setCoordinate() np gi tr mu RGB v gi tr ta . i tng trc

http://tailieuhay.com

281

Lp trnh ha trn Java 2D v 3D


Z th gi 10 ln phng thc setCoordinate() cho mi nh v gi
setColors() mt ln np cho c 10 nh vi 1 phng thc.
//

/////////////////////////////////////

/////
//
// 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

Color3f

green

Color3f

blue

new

Color3f(1.0f,

new

Color3f(0.0f,

new

Color3f(0.0f,

0.0f, 0.0f);
1.0f, 0.0f);
0.0f, 1.0f);

http://tailieuhay.com

282

Lp trnh ha trn Java 2D v 3D

// create line for Y axis


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);

http://tailieuhay.com

283

Lp trnh ha trn Java 2D v 3D


axisZLines.setCoordinate(1, z2);
axisZLines.setCoordinate(2, z2);
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
Mu mc nh cho cc nh ca mt i tng mng
GeometryArray l trng, nu c COLOR_3 v COLOR_4 khng c
nh ngha. Khi cc ng hoc a gic y c dng vi cc mu khc

http://tailieuhay.com

284

Lp trnh ha trn Java 2D v 3D


nhau ti mi nh th cc mu s mn dn gia cc nh s dng php
nh bng Gouraud.
Bc 3: To i tng Shape3D tham chiu n i tng
GeometryArray
on m di y ch ra cch lm th no i tng Shape3D
tham chiu n i tng GeometryArray. i tng Shape3D c
thm vo mt BranchGroup s c thm vo ni no trn th
khung cnh. (Shape3D l lp con ca Node, v th Shape3D c th thm
vo thnh con ca mt th khung cnh )
th khung cnh c ch ra di y:

2.5.2 Subclasses of GeometryArray


Nh ni phn trn do GeometryArray l lp tru tng l lp
cha ca rt nhiu lp con hu dng, chng hn nh LineArray. Hnh 1-2
cho thy cy tha k i vi lp GeometryArray v cc lp con ca n.
L do tn ti ca cc lp con ny l lm sao trnh dng hnh ca Java
3D c th quyt nh dng i vi cc nh ca cc lp .

http://tailieuhay.com

285

Lp trnh ha trn Java 2D v 3D

Hnh 2-13 ch ra mt v du v cc lp con ca GeometryArray gm:


PointArray, LineArray, TriangleArray, v QuadArray (cc lp ny
khng phi l lp con ca GeometryStripArray). Trong hnh ny, cc
tp bn tri nht ca cc nh ch ra 3 im nh dng thnh 6 im, 3
ng, hoc 2 tam gic. Hnh th 4 ch ra 4 nh nh ngha mt t gic.
Ch rng cc nh ny khng dng chung: mi ng hoc mt a gic
y c dng c lp vi nhau.

GeometryArray Subclass Constructors


To mt i tng rng vi s nh v nh dng nh cho trc.
PointArray(int vertexCount, int vertexFormat)
LineArray(int vertexCount, int vertexFormat)
TriangleArray(int vertexCount, int vertexFormat)
QuadArray(int vertexCount, int vertexFormat)

http://tailieuhay.com

286

Lp trnh ha trn Java 2D v 3D


tm hiu cch s dng hm to v phng thc xem li on m 24 v 2-5,2-6 s dng i tng LineArray. Nu bn ang dng mt hnh
t gic cn thn vi cc nh c th to thnh hnh lm, t ct nhau hoc
khng phng. Nu xy ra, chng khng th dng ng c.

2.5.3 Subclasses of GeometryStripArray


Phn trc m t 4 lp con ca GeometryArray, khng cho php s
dng li cc nh, tuy nhin c mt vi trng hp ta cn s dng li cc
nh, cho kt qu dng hnh tt hn.
Lp GeometryStripArray l lp tru tng t mi thc th hnh
hc

bn

ghp

GeometryStripArray

to

ng

lp

cha

mt

ca

tha

k.

LineStripArray,

TriangleStripArray v TriangleFanArray. Ta c hnh 2-14 ch ra mt


instance ca mt dng cc nh c s dng li.

Lp GeometryStripArray c hm to khc vi lp GeometryArray.


Hm to ca n c 3 tham s, mt mng cch nh tnh trn mi mnh
cho

php

mt

tng

th

duy

tr

nhiu

mnh.

GeometryStripArray c 2 phng thc thng s dng n l


getNumStrips() v getStripVertexCounts().
GeometryStripArray Subclass Constructors

http://tailieuhay.com

287

Lp trnh ha trn Java 2D v 3D


To mt i tng rng vi gi tr cc nh v nh dng cc nh v
mt mng tnh ton cc nh qua cc mnh. nh dng l mt hay nhiu
cc bit c OR m t cho mi d liu nh. nh dng cc c l
ging nhau nh nh ngha trong lp GeometryArray. Nhiu mnh
cng mt lc cng c h tr. Tng cc tnh ton nh cho tt c cc
mnh phi bng vi tng s cc nh
LineStripArray(int vtxCount, int vertexFormat, int stripVertexCounts[])
TriangleStripArray(int

vtxCount,

int

vertexFormat,

int

int

vertexFormat,

int

stripVertexCounts[])
TriangleFanArray(int

vtxCount,

stripVertexCounts[])
Ch rng Java 3D khng h tr cc hnh c bn y vi nhiu hn 4
mt. Ngi lp trnh phi c trch nhim trong vic s dng k thut tch
tch hnh phc tp ra thnh nhiu cc i tng ca Java 3D nh mng
tam gic hoc hnh qut.

Triangulator Class
Package: com.sun.j3d.utils.Geometry
S dng chuyn cc a gic hnh hc khng c dng tam gic v cc
tam gic c th dng hnh bng Java 3D. Cc a gic phi l li,
cng nm trn mt mt phng cc cnh khng giao nhau.
Triangulator Constructor Summary
Triangulator()
To mt i tng tam gic.
Triangulator Method Summary
void triangulate(GeometryInfo ginfo)

http://tailieuhay.com

288

Lp trnh ha trn Java 2D v 3D


Chng trnh con ny chuyn i tng GeometryInfo t dng c bn
POLYGON_ARRAY thnh dng TRIANGLE_ARRAY s dng k
thut tch a gic
Tham s:
ginfo - com.sun.j3d.utils.Geometry.GeometryInfo to be triangulated.
V d v cch s dng: 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 tng Yoyo trong chng trnh YoyoApp.java sch ra cch s dng
i tng TriangleFanArray m hnh ha con yo-yo
Hnh 2-15 ch 3 hnh dng ca TriangleFanArray.

Trong on m 2-7, phng thc yoyoGeometry()to v tr v i tng


TriangleFanArray mong mun.

http://tailieuhay.com

289

Lp trnh ha trn Java 2D v 3D


Dng 15-18 tnh ton tm im cho 4 hnh nn. Mi hnh nn c 18 nh
c tnh ton dng 20-28. Dng 30-32 to mt i tng
TriangleFanArray v dng 34 l ni tnh ton d liu ta (t dng
15-28) lu i tng
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) * ++n){
21. x = (float) (r * Math.cos(a));
22. y = (float) (r * Math.sin(a));
23.
24. coords[0*(N+1)+N-n] = new Point3f(x, y, w);
25. coords[1*(N+1)+n+1] = new Point3f(x, y, w);
http://tailieuhay.com

290

Lp trnh ha trn Java 2D v 3D


26. coords[2*(N+1)+N-n] = new Point3f(x, y, -w);
27. coords[3*(N+1)+n+1] = new Point3f(x, y, -w);
28. }
29.
30. tfa = new TriangleFanArray (totalN,
31. TriangleFanArray.COORDINATES,
32. stripCounts);
33.
34. tfa.setCoordinates(0, coords);
35.
36. return tfa;
37.} // end of method yoyoGeometry in class Yoyo
Code Fragment 2-7 yoyoGeometry() Method Creates TriangleFanArray
Object
Hnh yo-yo trng mi ch l im khi u. Hnh 2-16 ch ra mt i
tng tng t nhng mu c thay i mi nh. Phng thc
c yoyoGeometry()thay i. Dng 23 qua 26, 36 ti 39, v dng 46
ch nh mu cho mi nh.
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. Color3f colors[] = new Color3f[totalN];
8. Color3f red = new Color3f(1.0f, 0.0f, 0.0f);

http://tailieuhay.com

291

Lp trnh ha trn Java 2D v 3D


9. Color3f yellow = new Color3f(0.7f, 0.5f, 0.0f);
10. int stripCounts[] = {N+1, N+1, N+1, N+1};
11. float r = 0.6f;
12. float w = 0.4f;
13. int n;
14. double a;
15. float x, y;
16.
17. // set the central points for four triangle fan strips
18. coords[0*(N+1)] = new Point3f(0.0f, 0.0f, w);
19. coords[1*(N+1)] = new Point3f(0.0f, 0.0f, 0.0f);
20. coords[2*(N+1)] = new Point3f(0.0f, 0.0f, 0.0f);
21. coords[3*(N+1)] = new Point3f(0.0f, 0.0f, -w);
22.
23. colors[0*(N+1)] = red;
24. colors[1*(N+1)] = yellow;
25. colors[2*(N+1)] = yellow;
26. colors[3*(N+1)] = red;
27.
28. for(a = 0,n = 0; n < N; a = 2.0*Math.PI/(N-1) * ++n){
29. x = (float) (r * Math.cos(a));
30. y = (float) (r * Math.sin(a));
31. coords[0*(N+1)+n+1] = new Point3f(x, y, w);
32. coords[1*(N+1)+N-n] = new Point3f(x, y, w);
33. coords[2*(N+1)+n+1] = new Point3f(x, y, -w);
34. coords[3*(N+1)+N-n] = new Point3f(x, y, -w);
35.
36. colors[0*(N+1)+N-n] = red;
37. colors[1*(N+1)+n+1] = yellow;
http://tailieuhay.com

292

Lp trnh ha trn Java 2D v 3D


38. colors[2*(N+1)+N-n] = yellow;
39. colors[3*(N+1)+n+1] = red;
40. }
41. tfa = new TriangleFanArray (totalN,
42. TriangleFanArray.COORDINATES|TriangleFanArray.COLOR_3,
43. stripCounts);
44.
45. tfa.setCoordinates(0, coords);
46. tfa.setColors(0,colors);
47.
48. return tfa;
49. } // end of method yoyoGeometry in class Yoyo
Code Fragment 2-8 Modified yoyoGeometry() Method with Added
Colors

http://tailieuhay.com

293

Lp trnh ha trn Java 2D v 3D


2.5.4 Subclasses of IndexedGeometryArray
Cc phn trc m t cc lp con ca GeometryArray, cho thy ch
lp GeometryStripArray c thm quyn hn s dng li cc nh. V d
nh ngha mt hnh lp phng mi nh trong 8 nh ca n phi
c s dng bi 3 hnh vung. Trong trng hp xu nht chng ta phi
nh ngha 24 nh mc d ch 8 nh l .
i tng IndexedGeometryArray cung cp mt cp bc khc sao
cho c th trnh vic s dng tha. Vi nhng mng ny cng cha to
, mu sc, b mt thng v to b mt.
Tuy nhin i tng IndexedGeometryArray cng cn thm cc
mng ph gi l mng ch s cha cc ch mc n mng d liu. Mng
ch mc ny c nhiu tham chiu n cc nh tng t trong cng mt
mng d liu, t cho php s dng li hiu qu r rng. Chng ta c
th xen v d di y.

Cc lp con ca IndexedGeometryArray song song vi cc lp con


ca lp GeometryArray. Cy tha k c v di hnh 2-18

http://tailieuhay.com

294

Lp trnh ha trn Java 2D v 3D

Hm

to

cho

IndexedGeometryArray,

IndexedGeometryStripArray cng cc lp con ca chng di y.


IndexedGeometryArray and Subclasses Constructors
To mt i tng rng vi s nh v nh dng nh cho trc v s
cc ch mc trong mng ny.
IndexedGeometryArray(int

vertexCount,

int

vertexFormat,

int

indexCount)
IndexedPointArray(int vertexCount, int vertexFormat, int indexCount)
IndexedLineArray(int vertexCount, int vertexFormat, int indexCount)
IndexedTriangleArray(int

vertexCount,

int

vertexFormat,

int

indexCount)
IndexedQuadArray(int vertexCount, int vertexFormat, int indexCount)

IndexedGeometryStripArray and Subclasses Constructors


To mt i tng rng vi s nh v nh dng nh cho trc v s
cc ch mc trong mng ny v mt mng cc tng s cc nh mi
mnh.

http://tailieuhay.com

295

Lp trnh ha trn Java 2D v 3D


IndexedGeometryStripArray(int

vc,

int

vf,

int

ic,

int

stripVertexCounts[])
IndexedLineStripArray(int vc, int vf, int ic, int stripVertexCounts[])
IndexedTriangleStripArray(int vc, int vf, int ic, int stripVertexCounts[])
IndexedTriangleFanArray(int vc, int vf, int ic, int stripVertexCounts[])
Cc phng thc ca chng cho i dy:
IndexedGeometryArray Methods (partial list)
void setCoordinateIndex(int index, int coordinateIndex)
To cc ch mc ta tng ng vi cc nh ti v tr ch mc cho i
tng
void setCoordinateIndices(int index, int coordinateIndices[])
To cc ch mc cc ta tng ng vi cc nh ti v tr ch mc cho
i tng
void setColorIndex(int index, int colorIndex)
Lp ch mc mu tng ng vi nh ti v tr ch mc cho vi i
tng.
void setColorIndices(int index, int colorIndices[])
Lp cc ch mc mu tng ng vi cc nh ti v tr ch mc cho
vi i tng.
void setNormalIndex(int index, int normalIndex)
Lp ch mc bnh thng tng ng vi nh ti ch mc nh trc cho
i tng.
void setNormalIndices(int index, int normalIndices[])
Lp cc ch mc bnh thng tng ng vi cc nh ti ch mc nh
trc cho i tng.

http://tailieuhay.com

296

Lp trnh ha trn Java 2D v 3D


void setTextureCoordinateIndex(int texCoordSet, int index, <new in
1.2>
int texCoordIndex)
Lp ch mc to tng ng vi nh ti ch mc nh trc cho i
tng.
void setTextureCoordinateIndices(int texCoordSet, int index,
int texCoordIndices[])
Lp cc ch mc to tng ng vi cc nh ti ch mc nh trc
cho i tng.

2.5.5 Axis.java is an Example of IndexedGeometryArray


V d Axis v IndexedGeometryArray ta c nh ngha 18 nh v
30 ch mc cho 15 ng. Nh vy c 5 ng cho mi trc.

2.6 Appearance and Attributes


i tng Shape3D c th tham chiu n c i tng Geometry v
Apperance. Nh tho ni pha trn trong phn 2.5, i tng
Geometry ch ra thng tin ca mi nh vi mt t tng quan st.
Thng tin mi nh ny c th ch nh ra mu ca i tng. D liu
trong i tng Geometry thng khng m t b ngoi ca mt
bi tng. Trong trng hp rt cn thit i tng Apperance.
Mt i tng Appearance khng cha d liu m t i tng quan st
m n bit ni no c d liu , do cch lm ca n l tham chiu n
mt vi i tng khc nh lp con ca NodeComponent .

http://tailieuhay.com

297

Lp trnh ha trn Java 2D v 3D

Mt i tng Appearance c th tham chiu n thuc tnh mt vi i


tng lp khc nh:
PointAttributes
LineAttributes
PolygonAttributes
ColoringAttributes
TransparencyAttributes
RenderingAttributes
Material
TextureAttributes
Texture
TexCoordGeneration
Su thuc tnh c cp n trong ti liu ny cn li dnh cho
chng 6 v chng 7.
Mt i tng Appearance vi cc thuc tnh ca i tng khc m
n tham chiu n gi l mt gi giao din. tham chiu n n da
trn phng thc vi mt ci tn chnh xc. V d nh tham chiu n i
tng

ColoringAttributes

dng

phng

thc

Appearance.setColoringAttributes().

Trn th khung cnh

http://tailieuhay.com

298

Lp trnh ha trn Java 2D v 3D

2.6.1 Appearance NodeComponent


Appearance Constructor
Hm to ny to i tng Appearance vi mi thnh phn chiu nhn
gi tr null. Cc gi tr mc nh c th on c: im v on thng
c v vi kch thc v di 1 pixel v khng c c kh rng ca,
mu mc nh l mu trng, kh nng xuyn qua v hiu ha.
Appearance()

2.6.2 Sharing NodeComponent Objects


Vic tham chiu n mt vi i tng l hp l v cng cn thit v
th nn chia s cng cc i tng NodeComponent. V d trong hnh 221 2 i tng Shape3D chia s cng thnh phn LineAttributes.

http://tailieuhay.com

299

Lp trnh ha trn Java 2D v 3D

Vic chia s ny gip cho vic dng hnh nhanh hn, hiu qu cng
cao.
Tuy nhin cn ch rng mt node khng c c nhiu hn mt cha t
NodeComponent c th chia s hay tham chiu n bi nhiu i
tng khc.

2.6.3 Attribute Classes


PointAttributes
i tng PointAttributes qun l vic mi im c bn c dng
hnh nh th no. Mc nh mt nh c dng nh mt im, bn c
th dng setPointSize() lm cho im to ra tuy nhin mc nh mt
im to s trng nh mt hnh vung, tr phi bn dng
setPointAntialiasingEnable(). Lc im vung c lm trn i.
PointAttributes Constructors
PointAttributes()
To mt i tng thnh phn v m t kch thc 1 pixel khng dng
kh rng ca
PointAttributes(float pointSize, boolean state)
To mt i tng thnh phn v m t kch thc 1 pixel dng kh
rng ca

http://tailieuhay.com

300

Lp trnh ha trn Java 2D v 3D

PointAttributes Methods
void setPointSize(float pointSize)
M t kch thc pixel ca cc im
void setPointAntialiasingEnable(boolean state)
Thit lp hoc b thit lp chng rng ca. Thng lm nu pointSize
>= 1 pixel.
LineAttributes
i tng ny thay i cch dng cc ng c bn theo 3 cch. Mc
nh ng c v l nt lin, vi rng 1pixle khng chng rng ca.
Bn c th thay i iu ny bng cch s dng cc phng thc
setLinePattern(), setLineWidth(), v setLineAntialiasingEnable().
Mu ng thng do ngi dng t nh ngha
Mt mu thng dc nh ngha bng mt mt n mu v mt thnh
phn quy m.
Mt gi tr 16 bit nh ngha mt mt n mu. Mi bit trong 16 bit gi
tr nh ngha khi no 1 pixel trong mu c bt hay tt (1/0). Sau khi c
16 mu u c s dng, th mu c lp li. Bit 0 tng ng vi pixel
u tin trong mu.
V d mt mt n ca 0x00ff (0b0000000011111111) nh ngha 8 pixel
m sau l 8 pixel ng.
Nh rng,bit phng i b nht c s dng u tin khi v, nn
mu bit c c t phi sang tri. Mt n mu gi tr 0x0101 nh ngha
mt mu lp ca mt pixel m v 7pixel tt. Mu ny c lp li nhiu
ln ty theo yu cu, mu khi ng li trc mi ng mi ca mt
mnh.
Cc mu c th m rng n 240 pixel s dng nhn t quy m. V d
nh quy m ca 3 x vi mt mt n mu 0x001f tng ng vi sn
http://tailieuhay.com

301

Lp trnh ha trn Java 2D v 3D


sinh ra mu vi 15 pixel m theo bi 33 pixel ng. Khong cch ng l
[1,15],gi tr bn ngoi khong ny l khng chp nhn c.
LineAttributes Constructors
LineAttributes()
To mt i tng thnh phn m t rng 1 pixel, mt ng thng
lin nt khng kh rng ca.
LineAttributes(float pointSize, int linePattern, boolean state)
To mt i tng thnh phn m t rng 1 pixel cho mt ng
thng, mu dng v, c kh rng ca.

LineAttributes Methods
void setLineWidth(float lineWidth)
M t rng pixel cho ng thng
void setLinePattern(int linePattern)
linePattern l mt trong s cc hng sau:
PATTERN_SOLID (the default),
PATTERN_DASH, PATTERN_DOT, PATTERN_DASH_DOT, or
PATTERN_USER_DEFINED.
M t lm sao mt pixel ca mt ng c in vo.
void setLineAntialiasingEnable(boolean state)
B hay c chng rng ca vi ng thng
void setPatternMask(int mask) <new in 1.2>
Lp mt mt n mu vi mt gi tr c bit
void setPatternScaleFactor(int scaleFactor) <new in 1.2>
Sets the line pattern scale factor to the specified value.

http://tailieuhay.com

302

Lp trnh ha trn Java 2D v 3D


Line Attributes Line Patterns
PATTERN_SOLID solid lines (no pattern). This is the default.
PATTERN_DASH dashed lines; ideally, a repeating pattern of 8 pixels
on and 8 pixels off.
PATTERN_DOT dotted lines; ideally, a repeating pattern of 1 pixel on
and 7 pixels off.
PATTERN_DASH_DOT dashed-dotted lines; ideally, a repeating
pattern of 7 pixels on, 4 pixels
off, 1 pixel on, and 4 pixels off.
PATTERN_USER_DEFINED lines with a user-defined line pattern.
See "User-defined Line Patterns,"above.
PolygonAttributes
PolygonAttributes chi phi vic dng hnh ca cc thnh phn c
bn a gic theo 3 cch: a gic b phn tch nh th no, nu n c
chn lc v khi no th su b c chp nhn. Mc nh cc a gic
u l a gic li tuy nhin khi a gic b tch th a gic c v li
thnh cc khung (ng) hoc ch cc im ti cc nh. Phng thc
setCullFace() dng loi b cc a gic c dng. Nu phng
thc ny thit lp hoc CULL_FRONT hoc CULL_BACK th mt na
s a gic khng c dng.
Ty theo s hiu qu ca h thng dng hnh m cc nh c dng
c l cc dy khung v cc a gic li lun c phn tch vi gi tr
su chnh xc. Kt qu l cc a gic v cc dy khung c th c dng
su khc nhau, gy ra hin tng ng khu. Hin tng stitching
ny l do su khc nhau nn cc dy khung xut hin lc n lc hin
trn a gic. Vi 2 thuc tnh PolygonOffset v PolygonOffsetFactor v
gi tr su cho php a gic li c th hng khu tay v pha khung

http://tailieuhay.com

303

Lp trnh ha trn Java 2D v 3D


hnh nh. setBackFaceNormalFlip()c s dng dng mt a gic li
sng vi c 2 mt ca a gic u m i.
PolygonAttributes Constructors
PolygonAttributes()
To i tng thnh phn vi gi tr mc nh ca a gic li khng c
ct b mt khng c ra a gic.
PolygonAttributes(int

polygonMode,

int

cullFace,

float

polygonOffset)
To i tng thnh phn vi gi tr cho trc ca gic li
PolygonAttributes(int

polygonMode,

int

cullFace,

float

polygonOffset,
boolean backFaceNormalFlip)
To i tng thnh phn ging nh cc hm to pha trc nhng cng
cho php ch ra mt pha trc v pha sau ca a gic nh th no
PolygonAttributes(int
polygonOffset,

polygonMode,

boolean

int

cullFace,

backFaceNormalFlip,

float
float

polygonOffsetFactor) <new in 1.2>


To i tng PolygonAttributes vi gi tr cho trc.

PolygonAttributes Methods
void setCullFace(int cullFace)
cullFace l CULL_FRONT, CULL_BACK, or CULL_NONE. Cull
(khng dng) trc mt v mt sau ca cc a gic hoc khng tch a
gic no.
void setPolygonMode(int polygonMode)
polygonMode l: POLYGON_POINT, POLYGON_LINE, or

http://tailieuhay.com

304

Lp trnh ha trn Java 2D v 3D


POLYGON_FILL. Dng polygons trn points, lines, or filled polygons
(mc nh).
void setPolygonOffset(float polygonOffset)
polygonOffset l screen-space offset thm vo hiu chnh gi tr
su ca polygon primitives.
void setPolygonOffsetFactor(float polygonOffsetFactor) <new in
1.2>
Lp polygon offset factor vi gi tr cho trc.
void setBackFaceNormalFlip(boolean backFaceNormalFlip)
trong backFaceNormalFlip xc nh khi no nh bnh thng hoc
mt sau ca a gic cn khut sng. Khi c ny c lp gi tr true mt
sau b la chn mt sau.
ColoringAttributes
Thuc tnh ColoringAttributes iu khin chuyn t mu. Phng
thc setColor() lp mt mu bn trong trong ty trng hp m
mu vo. Thm vao setShadeModel() xc nh khi no c khi cn
thm ngang mt mu vo.
ColoringAttributes Constructors
ColoringAttributes()
To i tng thnh phn s sng mu trng cho mu bn trong v
SHADE_GOURAUD l m hnh nh bng.
ColoringAttributes(Color3f color, int shadeModel)
ColoringAttributes(float

red,

float

green,

float

blue,

int

shadeModel)
shadeModel l mt trong SHADE_GOURAUD, SHADE_FLAT,
FASTEST, or NICEST.

http://tailieuhay.com

305

Lp trnh ha trn Java 2D v 3D


(trong hu ht trng hp, FASTEST l SHADE_FLAT, v NICEST l
SHADE_GOURAUD.)
ColoringAttributes Methods
void setColor(Color3f color)
void setColor(float red, float green, float blue)
c 2 phng thc u nh ngha mu bn trong
void setShadeModel(int shadeModel)
shadeModel

mt

trong

cc

hng:

SHADE_GOURAUD,

SHADE_FLAT, FASTEST,
or NICEST.

TransparencyAttributes
Thuc tnh ny qun l trong sut ca bt c hnh c bn no.
setTransparency() nh ngha gi tr trong sut (bng 1 l trong sut hon
ton, bng 0.0 l khng trong sut)
TransparencyAttributes Constructors
TransparencyAttributes()
To i tng thnh phn vi trong sut lp ch NONE.
TransparencyAttributes(int tMode, float tVal)
Trong tMode l mt trong nhng BLENDED, SCREEN_DOOR,
FASTEST, NICEST, hoc NONE, v tVal nh ngha tnh m ca i
tng (0.0 khng trong sut v 1.0, trong sut hon ton).
TransparencyAttributes(int

tMode,

float

tVal,

int

srcBlendFunction,
int dstBlendFunction) <new in 1.2>

http://tailieuhay.com

306

Lp trnh ha trn Java 2D v 3D


To mt i tng TransparencyAttributes vi gi tr nh trc

TransparencyAttributes Methods
void setTransparency(float tVal)
tVal nh ngha tnh m ca i tng (0.0 khng trong sut v 1.0,
trong sut hon ton).
void setTransparencyMode(int tMode)
tMode (one of BLENDED, SCREEN_DOOR, FASTEST, NICEST, or
NONE) ch ra nu
c hot ng lm trong sut
void setDstBlendFunction(int blendFunction) <new in 1.2>
Lp a ch chc nng pha trn c s dng trn trong sut v
chng rng ca.
void setSrcBlendFunction(int blendFunction) <new in 1.2>
Lp ti nguyen hm trng s dng trn trong sut v chng rng
ca.
RenderingAttributes
RenderingAttributes iu khin 2 hot ng dng hnh trn tng
pixel: kim nh su m, v kim tra alpha.
Hot ng qut (Geometry) xc nh xem vic dng hnh pixel nh
hng n mn nh th no. Mc nh l b chn Geometry thng c
s dng trong hu ht cc trng hp
su m l tp hp cc gi tr su ca nhng pixel c dng. N
c dng xc nh pixel c nhn thy hay b khut chng c th
c dng. su m s dng khc khi dng i m v trong sut. Kt
qu l i tng trong sut khng cp nhp gi tr su m khng bnh
thng. C th v hiu ha hoc dng tnh nng ny i vi mt i

http://tailieuhay.com

307

Lp trnh ha trn Java 2D v 3D


tng thnh phn RenderingAttributes. Vic v hiu ha m bo i
tng lun lun nhn thy, tuy nhin mc nh l n enable.
RenderingAttributes Constructors
RenderingAttributes()
To mt i tng thnh phn nh ngha vic dng trn pixel vi vic
kch hot kim tra su m v v hiu ha tnh nng kim tra alpha.
RenderingAttributes(boolean
depthBufferWriteEnable,

depthBufferEnable,
float

alphaTestValue,

boolean
int

alphaTestFunction)
Trong depthBufferEnable bt tt so snh su m (kim tra
su),
depthBufferWriteEnable bt v tt ghi vo depth buffer,
alphaTestValue c s dng kim tra. i vi cc ngun alpha i
vo , and alphaTestFunction l mt trong nhng ALWAYS, NEVER,
EQUAL, NOT_EQUAL, LESS, LESS_OR_EQUAL, GREATER, hoc
GREATER_OR_EQUAL, ch r loi alpha test no c kch hot. To
mt i tng thnh phn nh ngha vic dng trn pixel cho so sanh
su m v kim tra alpha.
RenderingAttributes(boolean
depthBufferWriteEnable,

depthBufferEnable,
float

alphaTestValue,

boolean
int

alphaTestFunction,
boolean visible, boolean ignoreVertexColors,
boolean GeometryOpEnable, int GeometryOp) <new in 1.2>
To mt i tng RenderingAttributes vi gi tr cho trc.

RenderingAttributes Methods
void setDepthBufferEnable(boolean state)

http://tailieuhay.com

308

Lp trnh ha trn Java 2D v 3D


turns on and off the depth buffer testing.
void setDepthBufferWriteEnable(boolean state)
turns on and off writing to the depth buffer.
void setAlphaTestValue(float value)
specifies the value to be used for testing against incoming source alpha
values.
void setAlphaTestFunction(int function)
where function is one of ALWAYS, NEVER, EQUAL, NOT_EQUAL,
LESS, LESS_OR_EQUAL,
GREATER, or GREATER_OR_EQUAL, which denotes what type of
alpha test is active. If function is
ALWAYS (the default), then the alpha test is effectively disabled.
void setDepthBufferEnable(boolean state) <new in 1.2>
Enables or disables depth buffer mode for this RenderingAttributes
component object.
void setDepthBufferWriteEnable(boolean state) <new in 1.2>
Enables or disables writing the depth buffer for this object.
void setIgnoreVertexColors(boolean ignoreVertexColors) <new in
1.2>
Sets a flag that indicates whether vertex colors are ignored for this
RenderingAttributes object.
void setGeometryOp(int GeometryOp) <new in 1.2>
Sets the Geometry operation function for this RenderingAttributes
component object.
void setGeometryOpEnable(boolean GeometryOpEnable) <new in
1.2>
Sets the GeometryOp enable flag for this RenderingAttributes
component object.
void setVisible(boolean visible) <new in 1.2>
http://tailieuhay.com

309

Lp trnh ha trn Java 2D v 3D


Sets the visibility flag for this RenderingAttributes component object.
Appearance Attribute Defaults
Hm to Appearance khi to i tng Appearance vi cc thuc
tnh tham chiu n cc gi tr null. Bng 2-1 l danh sch cc gi tr mc
nh cho nhng thuc tnh tham chiu n gi tr null.
Attributes Class

Parameter

Default Value

ColoringAttributes

color

white (1, 1, 1)

shade model

SHADE_GOURAUD

line width

1.0

line pattern

PATTERN_SOLID

line antialiasing enable

false

point size

1.0

point antialiasing enable

false

cull face

CULL_BACK

backFaceNormalFlip

false

polygon mode

POLYGON_FILL

polygonOffset

0.0

polygonOffsetFactor

0.0

depthBufferEnable

true

depthBufferWriteEnable

true

alphaTestFunction

ALWAYS

alphaTestValue

0.0

visible

true

ignoreVertexColors

false

LineAttributes

PointAttributes

PolygonAttributes

RenderingAttributes

http://tailieuhay.com

310

Lp trnh ha trn Java 2D v 3D

TextureAttributes

GeometryOpEnable

false

GeometryOp

ROP_COPY

textureMode

REPLACE

textureBlendColor

black (0, 0, 0, 0)

transform

identity

perspectiveCorrectionMode NICEST
textureColorTable
TransparencyAttributes transparencyMode

null
NONE

transparencyValue

0.0

srcBlendFunction

SRC_BLEND_ALPHA

dstBlendFunction

BLEND_ONE_MINUS_ALPHA

2.6.4 Example: Back Face Culling


a gic c 2 mt. Vi nhiu i tng quan st khng ch mt mt
ca a gic cn c dng. gim cng vic tnh ton cn thit phi
dng b mt ca a din, h thng dng hnh c th chn lc nhng mt
khng cn thit. B mt trc ca mt i tng c th l mt cho cc
nh c nh ngha theo th t ngc chiu kim ng h.
TwistStripApp.java to mt i tng di xon v quay n quanh trc
y.
Khi di xon quay cc phn ca n xem nh bin mt tuy nhin
nhng mu bin mt c th d dng thy hnh 2-22. Thc t chng
trnh nh ngha 2 i tng quan st vi cng mt hnh. Mt i tng
c dng di dng khung dy cn i tng cn li dng vi b mt
lin. Qua khi quay chng ta c th quan st c nh vy.

http://tailieuhay.com

311

Lp trnh ha trn Java 2D v 3D

L do c mt cc a gic l ch chn lc khng ch ra, v th n


mc nh l CULL_BACK. Cc tam gic ca b mt bin mt khi phn
lng ca n (phn sau) i mt vi mn nh. Tnh nng ny cho php h
thng dng hnh trnh khng phi dng phn b mt tam gic vn khng
cn thit.
T

uy nhin trong mt s trng hp vic chn lc li gy vn , nh

trong v d TwistStripApp. Vn c mt cch gii quyt n gin l


tt b ch chn lc. Nh on m trong hnh 2-10:
public class TwistStripApp extends Applet {
// //////////////////////////////////////////
/////
//
// create Twist visual object
//
public class Twist extends Shape3D {

http://tailieuhay.com

312

Lp trnh ha trn Java 2D v 3D


//

/////////////////////////////////////

/////
//
// create twist subgraph
//
public Twist() {
this.setGeometry(createGeometry());
this.setAppearance(createAppearance());
} // end of twist constructor
Geometry createGeometry() {
TriangleStripArray twistStrip;
Color3f

blue

new

Color3f(0.0f,

0.0f, 1.0f);
// create triangle strip for twist
int N = 80;
int stripCounts[] = { N };
twistStrip = new TriangleStripArray(
N,
TriangleStripArray.COORDINATES

TriangleStripArray.COLOR_3,
stripCounts);
double a;

http://tailieuhay.com

313

Lp trnh ha trn Java 2D v 3D


int v;
for (v = 0, a = 0.0; v < N; v += 2,
a = v * 2.0 * Math.PI / (N - 2)) {
twistStrip.setCoordinate(v,

new

Point3d(0.7 * Math.sin(a) + 0.2


*

Math.cos(a),

0.3

Math.sin(a), 0.7 * Math.cos(a)


+ 0.2 * Math.cos(a)));
twistStrip.setCoordinate(v + 1,
new Point3d(0.7 * Math.sin(a)
-

0.2

Math.cos(a),

-0.3 * Math.sin(a), 0.7


*

Math.cos(a)

0.2

Math.cos(a)));
twistStrip.setColor(v, blue);
twistStrip.setColor(v

1,

blue);
}
return twistStrip;
}
// create Appearance for Twist Strip
//
//

this

method

creates

the

default

Appearance for the


// twist strip. The commented line of
code containting

http://tailieuhay.com

314

Lp trnh ha trn Java 2D v 3D


// the setCullFace will fix the problem
of half of the
// Twisted Strip disappearing.
Appearance createAppearance() {
Appearance

twistAppear

new

Appearance();
PolygonAttributes

polyAttrib

new

PolygonAttributes();
//
polyAttrib.setCullFace(PolygonAttributes.CULL_NON
E);
twistAppear.setPolygonAttributes(polyAttrib);
return twistAppear;
}
} // end of class Twist
// //////////////////////////////////////////
/////
//
// create scene graph branch group
//
public BranchGroup createSceneGraph() {

http://tailieuhay.com

315

Lp trnh ha trn Java 2D v 3D


BranchGroup

contentRoot

new

BranchGroup();
// Create the transform group node and
initialize it to the
// identity. Add it to the root of the
subgraph.
TransformGroup

objSpin

new

TransformGroup();

objSpin.setCapability(TransformGroup.ALLOW_TRANSF
ORM_WRITE);
contentRoot.addChild(objSpin);
Shape3D twist = new Twist();
objSpin.addChild(twist);
//

Duplicate

the

twist

strip

geometry

and set the


// appearance of the new Shape3D object
to line mode
// without culling.
//

Add

the

POLYGON_FILLED

and

POLYGON_LINE strips
// in the scene graph at the same point.
// This will show the triangles of the
original Mobius strip that
// are clipped. The PolygonOffset is set
to prevent stitching.
http://tailieuhay.com

316

Lp trnh ha trn Java 2D v 3D


PolygonAttributes

polyAttrib

new

PolygonAttributes();

polyAttrib.setCullFace(PolygonAttributes.CULL_NON
E);

polyAttrib.setPolygonMode(PolygonAttributes.POLYG
ON_LINE);
polyAttrib.setPolygonOffset(0.001f);
Appearance

polyAppear

new

Appearance();
polyAppear.setPolygonAttributes(polyAttrib);
objSpin.addChild(new
Shape3D(twist.getGeometry(), polyAppear));
Alpha

rotationAlpha

new

Alpha(-1,

16000);
RotationInterpolator

rotator

new

RotationInterpolator(rotationAlpha,
objSpin);
// a bounding sphere specifies a region
a behavior is active
//

create

sphere

centered

at

the

origin with radius of 1

http://tailieuhay.com

317

Lp trnh ha trn Java 2D v 3D


BoundingSphere

bounds

new

BoundingSphere();
rotator.setSchedulingBounds(bounds);
objSpin.addChild(rotator);
// make background white
Background

background

new

Background(1.0f, 1.0f, 1.0f);


background.setApplicationBounds(bounds);
contentRoot.addChild(background);
// Let Java 3D perform optimizations on
this scene graph.
contentRoot.compile();
return contentRoot;
}

//

end

of

CreateSceneGraph

method

of

TwistStripApp
// Create a simple scene and attach it to the
virtual universe
public TwistStripApp() {
setLayout(new BorderLayout());
Canvas3D canvas3D = new Canvas3D(null);
add("Center", canvas3D);
BranchGroup scene = createSceneGraph();

http://tailieuhay.com

318

Lp trnh ha trn Java 2D v 3D


//

SimpleUniverse

is

Convenience

Utility class
SimpleUniverse

simpleU

new

SimpleUniverse(canvas3D);
// This will move the ViewPlatform back
a bit so the
// objects in the scene can be viewed.

simpleU.getViewingPlatform().setNominalViewingTra
nsform();
simpleU.addBranchGraph(scene);
} // end of TwistStripApp constructor
// The following method allows this to be run
as an application
public static void main(String[] args) {
System.out.println("TwistStripApp - Java
3D API version 1.1");
System.out.print("See

\"Getting

Started

with the Java 3D API\"");


System.out.println(" (section 2.6)");
System.out.println("This

program

demonstrates back face culling.");

http://tailieuhay.com

319

Lp trnh ha trn Java 2D v 3D


System.out.print("In

this

program

two

visual objects rotate, ");


System.out.println("one

wireframe

and

one solid surface.");


System.out.print("The

wire

frame

is

visible only when components");


System.out.println(" of the surface are
culled.");
Frame

frame

new

MainFrame(new

TwistStripApp(), 256, 256);


} // end of main method of TwistStripApp
} // end of class TwistStripApp
Trong hnh 2-23 vic v hiu ha chn lc b mt r rng in y
vng b v. By gi th tt c cc a gic u c dng d hng quay
ca n l g chng na.

http://tailieuhay.com

320

Lp trnh ha trn Java 2D v 3D

Phn mt pha trc ca mt a gic l mt dng cc nh xut


hin theo chiu quay ngc kim ng h. iu ny thng lin quan n
lut tay phi. Lut ny dng xc nh phn mt trc ca mt di
hnh hc (chng hn di tam gic hoc di hnh vung thay th cho mi
thnh phn trong di. Hnh 2-24 ch ra mt v d s dng lut tay phi)

2.7 Bounds and Scope


Bound nh ngha mt khng gian, mt vng cho mi nt. Bounds
c nh ngha cc i tng nh BoundingSphere, BoundingBox,
BoundingPolytope. tip tc vi v d nh sng , mi ngun sng nh
ngha mt vng nh hng gi l vng bin gii qut . Nu bt k thnh
phn no ca mt i tng quan st giao vi lung sng th i tng s
b nh hng bi lung sng
Phn v Bounds c t phn 1.9 m t mi i tng hnh vi c
mt vng ring. Mt hnh vi ch c kch hot khi bin gii ca n giao
vi phn nhn.
Scope ch ra mt nhm cc i tng th khung cnh bng v tr ca
chng trong th khung cnh. c bit mt Scope l mt tp cc i
tng Group (chng hn BranchGroup). Mt node c th ch ra cc i

http://tailieuhay.com

321

Lp trnh ha trn Java 2D v 3D


tng th khung cnh khc nhau khi chng nh hng bi mt tm
quan st.
Trong khi Bounds v scope cung cp cc tnh nng khc nhau nhng
chng lai hot ng theo nhng cch khc nhau. Mt vng bin gii c
lp vi v tr ca mt i tng trong th khung cnh. Trong khi
mt phm vi c lp vi i tng quan st trong mi trng o.Chng
c s dng trong nhiu ng dng, thm vo nh sng v cc hnh vi
c s dng, nh sng m, m thanh s c ni phn sau ca chng
ny, i vi cc nt AlternativeAppearance.
2.7.1 Bounds Node Components
Mt i tng bin gii Bound c tham chiu n bi cc i
tng cn nh ngha bin gii bin gii cho php ngi lp trnh a dng
ha cc hnh ng v b mt hoc m thanh trong mt vung t o.
Bound cng cho php h thng dng hnh ca Java 3D hot ng hiu
qu hn.
Cc vng bin gii c nh ngha bng mt s lp. Bound l lp
tru tng l lp c s cho cc lp bin gii. i tng Bound nh
ngha cc vng li kn, c s dng trong rt nhiu tng tc v chn
lc, 3 lp m rng ca n l BoundingBox, BoundingPolytope, v
BoundingSphere
Khi la chn mt i tng Bound khng ph thuc vo chi tit ca
ng dng, nh rng nhng hot ng nh l khc nhau trong mt bin
gii s c tnh ton trong vng giao nhau. BoundingSphere l d nht
trong khi BoundingPolytope l kh nht. Nu bn c rt nhiu i
tng Bound ang s dng, nhng hot ng nh cng c th thm vo
v gy ra khc bit r rng n ton b hiu nng ca ng dng.
Cui cng phi nh rng vi cc vng bin gii nh th hnh ng cng
t, v nn lm nh vy khi to cc vng bin gii.

http://tailieuhay.com

322

Lp trnh ha trn Java 2D v 3D

Bounds Method Summary (partial list)


Bounds l lp tru tng, do cc phng thc lit k di y l tt
c cc phng thc tru tng v c th ca BoundingBox,
BoundingPolytope, v BoundingSphere
Bounds closestIntersection(Bounds[] boundsObjects)
Tm i tng trong bin gii gn nht m giao vi vng bin gii ny.
void combine(Bounds boundsObject)
Kt ni i tng b bao ny vi i tng bao. Ta c 2 phng thc
sau.
boolean equals(java.lang.Object Bounds)
Ch ra khi no i tng bao ny tng ng vi i tng bao khc.
boolean intersect(Bounds boundsObject)
Kim tra s giao nhau gia cc i tng bao.
boolean isEmpty()
Tests whether the Bounds is empty.
Kim tra khi no cc bin gii bao b rng.
void set(Bounds boundsObject)
Lp gi tr cho i tng bao.
void transform(Transform3D trans)
Bin i i tng c bao da trn ma trn a ra.
BoundingSphere
BoundingSphere Constructor Summary (partial list)
BoundingSphere()
To v nh gi tr cho mt BoundingSphere vi bn knh bng 1 ti 0 0
0
BoundingSphere(Point3d center, double radius)

http://tailieuhay.com

323

Lp trnh ha trn Java 2D v 3D


To v nh gi tr cho mt BoundingSphere vi bn knh v tm cho
trc
BoundingSphere(Bounds boundsObject)
To v nh gi tr cho mt BoundingSphere t i tng cho trc.
BoundingSphere(Bounds[] boundsObjects)
To v nh gi tr cho mt BoundingSphere t mt mng cc i tng
bao

BoundingSphere Method Summary (partial list)


void setCenter(Point3d center)
Lp v tr ca vng bao cu t mt im
void setRadius(double r)
Lp bn knh ca hnh cu bao.
BoundingBox
BoundingBox Constructor Summary
Lp ny nh ngha mt hnh hp bao thng trc c s dung cho vng
bao.
BoundingBox()
Thit lp v khi to mt hnh hp bao kch thc 2 tm gc.
BoundingBox(Point3d lower, Point3d upper)
Thit lp v khi to mt hnh hp bao bit trc im thp im cao
trn x,y, z.
BoundingBox(Bounds boundsObject)
Thit lp mt hnh hp bao t mt hnh sn c.
BoundingBox(Bounds[] Bounds)

http://tailieuhay.com

324

Lp trnh ha trn Java 2D v 3D


Lp mt hnh hp bao vi mt mng cc i tng bao.

BoundingBox Method Summary (partial list)


void setLower(double xmin, double ymin, double zmin)
Sets the lower corner of this bounding Box.
Lp gc di ca hnh hp bao.
void setLower(Point3d p1)
Lp gc di ca hnh hp bao.
void setUpper(double xmax, double ymax, double zmax)
Lp gc trn ca hnh hp bao.
void setUpper(Point3d p1)
Lp gc trn ca hnh hp bao.
BoundingPolytope
Mt i tng BoundingPolytope nh ngha mt vng a din s
dng php giao gia 4 hoc hn mt na khng gian. Mt na khng gian
l mt vng khng gian bao quanh mt mt qua mt mt phng. Kt qu
l ng ngha BoundingPolytope da vo danh sch cc mt phng m
to nn mt vng ng.
BoundingPolytope Constructor Summary
BoundingPolytope()
To mt BoundingPolytope nh ngha n da trn tp 6 mt phng
ging nh hnh lp phng
-1 <= x, y, z <= 1.
BoundingPolytope(Vector4d[] planes)
To mt BoundingPolytope s dng cc mt cho trc.
BoundingPolytope(Bounds boundsObject)

http://tailieuhay.com

325

Lp trnh ha trn Java 2D v 3D


To mt BoundingPolytope ngoi tip mt mt bao cho trc.
BoundingPolytope(Bounds[] boundsObjects)
To mt BoundingPolytope vy quanh mt mng cc bao.

BoundingPolytope Method Summary (partial list)


int getNumPlanes()
Tr v s mt phng ca i tng BoundingPolytope.
void getPlanes(Vector4d[] planes)
Tr v gii hn ca cc mt phng cho bao a din ny.
void setPlanes(Vector4d[] planes)
Lp cc mt phng cho bao ny.

2.7.2 BoundingLeafa Node


Cc bin gii bnh thng s dng mt i tng bao ch ra mt
vng c bao quanh. Kt qu trong th khung cnh l i tng
Bound di chuyn vi i tng tham chiu n n. iu ny l t cho
nhiu ng dng tuy nhin c mt vi trng hp li cn vng bao di
chuyn c lp vi i tng s dng vng bao
V d nh nu mt th giibao gm ngun sng c nh chiu sng
vo i tng ang di chuyn th vng bin gii ca nh sng phi bao
gm c i tng di chuyn. Mt cch nm bt iu ny l lm cho
vng bao rng cha tt c nhng ni m i tng di chuyn n.
y khng phi l cu tr li tt nht cho mi trng hp. Mt cch gii
quyt tt hn l s dng BoundingLeafa. t trn th khung cnh vi
i tng quan st i tng BoundingLeafa di chuyn vi i tng
quan st v c lp vi ngun sng. Hnh 2-25 ch ra mt th khung
cnh vi mt ngun sng s dng BoundingLeafa.
http://tailieuhay.com

326

Lp trnh ha trn Java 2D v 3D

Khi cc ng dng cho BoundingLeafa bao gm ApplicationBounds


ca i tng Background, SchedulingBounds ca Behaviors, v
InfluencingBounds ca Lights, khng gy cm gic lp li thng tin trn
c vng.
Mt trong nhng ng dng kh hay ca i tng BoundingLeafa l
t mt BoundingLeafa trn viewPlatform. BoundingLeafa ny c th
s dng lin tc trn mt vng bao cho cc hnh vi hoc lun lun chp
nhn cc ng dng bao nh nn hoc sng m.V d trong on m 2-11
s dng nguyn tc .
Dng 2,3,4 to i tng BoundingLeafa, v PlatformGeometry,
ng thi lm cho i tng BoundingLeafa tr thnh con ca
PlatformGeometry. i tng PlatformGeometry c thm vo
nhnh hnh thc ca th khung cnh dng 6.

http://tailieuhay.com

327

Lp trnh ha trn Java 2D v 3D

BoundingLeafa Class
Cc phi tham s ca hm to cho BoundingLeafa to mt n v
hnh cu bao.
BoundingLeafa Constructor Summary
The BoundingLeafa node defines a bounding region object that can be
referenced by other nodes to define a region of influence, an activation
region, or a scheduling region.
Nt BoundingLeafa dng nh ngha mt i tng vng bao c th
c tham chiu n bng cc nt khc nahu nh ngha mt vng
nh hng, mt vng kch hot hoc mt vng danh mc.
BoundingLeafa()
To mt nt BoundingLeafa vi mt i tng n v hnh cu
BoundingLeafa(Bounds region)
To mt nt BoundingLeafa vi vng nh trc.
BoundingLeafa Method Summary
Bounds getRegion()
Nht vng BoundingLeafa.
void setRegion(Bounds region)
Sets this BoundingLeafa node's bounding region.
Lp vng bao ca nt BoundingLeafa.

2.7.3 Scope
Nh gii thiu pha trn, nh ngha mt scope (tm quan st) l
mt cch gii hn ng dng hay nh hng ca mt nt. Nt nh
ngha mt phm vi quan st c th nh hng ti i tng ca ca th
con c gc ti i tng Group. Khi khng c mt phm vi quan st cho
http://tailieuhay.com

328

Lp trnh ha trn Java 2D v 3D


mt nt ta gi nt c phm vi quan st ton cu. iu c ngha l
nt c th quan st hon ton trong mi trng o v ch b gii hn
bi mi trng o.
Mt vi nt cho php ch ra c vng bin gii v phm vi quan st
nhng vic ch nh mt phm vi quan st khng th thay th cho mt
vng bin gii. i vi mt nt c mt hiu ng trn mt i tng i
tng cn phi c c bin gii ln phm vi quan st. Mt nt khng c
phm v s khng nh hng c cc i tng khc.
Mt phm vi quan st dng gii hn ng dng ca mt nt khi s
dng mnh vng bao s rt kh khn hoc khng th lm. Vic gi li mt
vng bao khi mt th g ng dng trn th gii o. C th hiu rng
khi s dng mt vng bao phn bit gia cc i tng m nm gn
nhau l rt kh khn. Thc t, cng c nhng trng hp s dng c .
Nu 2 i tng quan st chm hoc chng ln nhau v mt i tng c
th bao gm vng bao hoc l i tng kia. Hin tng ny khng
thng xy ra nh v d di y.
Mt khung cnh cha mt ngn n v mt vi i tng quan st
trn bn. Ngn n c mt bng, v th khng phi tt c cc i tng s
c chiu sng bi chic n ny. Nu ch s dng vng bao s rt kh
ch ra ng dng nh sng ng n khi n tt v bt gia cc i
tng gn nhau.
nh ngha phm vi gii hn cho ngun sng d dng hn iu khin nh
sng trong khung cnh. th khung cnh trong hnh 2-26 l mt gii
php. th ny chia ra cc i tng c chiu sng v khng c
chiu sng thnh 2 nhnh ca th khung cnh. Ch nh cc nhm c
chiu sng bao gm c i tng c ri sn. Thng th khng cn
thit phi t chc mt th khung cnh xung quanh vng quan st.

http://tailieuhay.com

329

Lp trnh ha trn Java 2D v 3D

2.8 Hnh hc nng cao


Java 3D API phin bn 1.2 a ra 2 m rng ln i vi cc lp s
dng cc hnh hc. Th nht cho nhiu hnh hc tr thnh cc nt thnh
phn ca mt nt Shape3D. Tnh nng ny cho php dng hnh hiu qu
hn.
Mt tnh nng khc l cho php d liu hnh hc c th tham chiu
bng i tng hnh hc thay v phi sao chp. Vic sao chp d liu ch
thc hin trong cc phin bn trc ca 1.2 . Vic sao chp d liu lm
mt thi gian v cng sc, s dng vic tham chiu trc tip tng hiu
qu nhiu chng trnh.

2.8.1 Multiple Geometries in a Single Shape3D


Chng 1 gii thiu v lp Shape3D phn 2.2.1 gii thiu Shape3D
vi nh ngha ca i tng quan st v ch ra cch s dng c bn ca
i tng Shape3D. Phin bn 1.2 thm rt nhiu phng thc ti lp
http://tailieuhay.com

330

Lp trnh ha trn Java 2D v 3D


Shape3D cho php i tng Shape3D c th tham chiu n nhiu i
tng thnh phn hnh hc. Tnh nng mi ny gim thiu s lng i
tng trong th khung cnh.
Trong AxisApp.java gii thiu trong phn 2.5.1 s dng 3 i tng
LineArraty v cc ng i din cho 3 trc ta trong khng gian,
ngoi ra trong chng trnh c 3 i tng Shape3D tng ng vi 3
i tng hnh hc. Tuy nhin trong v d AxisApp2.java c s dng 1
i tng Shape3D, n tham chiu n nhiu i tng thnh phn hnh
hc khc.Xem hnh 2-27

Nh trong on m 2-12 c th thy ta ch to mt i tng


Shape3D nhng c th tham chiu n 3 i tng thnh phn hnh hc.
Shape3D Geometry Equivalence Classes
Nt l Shape3D cha mt danh sch 1 hoc nhiu i tng thnh phn
hnh hc v mt i tng thnh phn giao din. Danh sch i tng
hnh hc c th tng ng vi cc lp v c cng kiu vi cc lp
hnh hc c bn. S cn bng th hin i y:
Point GeometryArray: [Indexed]PointArray
Line GeometryArray: [Indexed]{LineArray, LineStripArray}
Polygon

GeometryArray:

[Indexed]{TriangleArray,

TriangleStripArray, TriangleFanArray,
QuadArray}

http://tailieuhay.com

331

Lp trnh ha trn Java 2D v 3D


CompressedGeometry
Geometry
Text3D
Vi s hn ch ca danh sch i tng Shape3D ti mt lp hnh hc
tng ng cho thy s ci tin ny c v khng c g l ci tin. Mt
ln na 3 i tng lineArray nh ngha hnh cho hoc AxisApp c th
thay th bng mt i tng v mt i tng Shape3D.
Shape3D Method Summary (partial list, see Section 2.2.1)
void addGeometry(Geometry Geometry) <new in 1.2>
Gn i tng hnh hc ti danh sch ca nt Shape3D gm cc thnh
phn hnh hc
java.util.Enumeration getAllGeometries() <new in 1.2>
Tr v lit k danh sch cc thnh phn hnh hc.
Geometry getGeometry(int index) <new in 1.2>
Ly cc thnh phn hnh hc ti v tr index trong danh sch.
void insertGeometry(Geometry Geometry, int index) <new in 1.2>
Chn thm mt thnh phn hnh hc vo danh sch ti v ch ch mc
cho trc.
int numGeometries() <new in 1.2>
Tr v s thnh phn hnh hc trong danh sch.
void removeGeometry(int index) <new in 1.2>
Loi b thnh phn hnh hc ti v tr ch mc cho trc trong danh
sch.
void setGeometry(Geometry Geometry, int index) <new in 1.2>
Thay th thnh phn hnh hc ti v tr ch mc cho trc trong danh
sch vi mt thnh phn khc.

http://tailieuhay.com

332

Lp trnh ha trn Java 2D v 3D

2.8.2 GeometryArray
Trong vic xy dng hnh cc bc l to mt i tng hnh hc, ri
ng k gi tr cho n nh ngha d liu hnh hc (to , mu ...) .
Vi phin bn 1.2 cho php li gi BY_REFERENCE thay th cho vic
sao chp d liu hnh hc. Vic ny khi phin bn c l i tng sao
chp GeometryArray c khi to c mt mng private lu gi ton b
d liu ny bn trong i tng GeometryArray. Sau khi d liu hnh
hc c ng k vi GeometryArray n c sao chp vo mng ny.
Khi i tng GeometryArray BY_REFERENCE c to ngi dng
to mt mng hnh hc v qun l mng ny vi d liu hnh hc. V v
th khng c mng bn trong i tng hnh hc.
Vy khi no cn s dng BY_REFERENCE, c 2 l do s dng n l:
1. Nu d liu hnh hc l ng
2. Nu d liu hnh hc cn s dng nhiu b nh
L do ln nht chn phng php ny l d liu c th thay i
thm ch i tng ang sng hoc c dch. Cch thay i hnh chnh
l thay i d liu ca n, cch khc l phn chia mng s dng bi i
tng hnh hc.
Nhng gi v cnh bo khi s dng BY_REFERENCE
Nu s dng BY_REFERENCE, s dng phng thc set*RefFloat l tt
hn c. V d, s dng setCoordRefFloat()thay v setCoordRef3f()s
dng mng s thc cho php truy cp trc tip hn l s dng mt mng
cc i tng. Mt mng cc i tng trong Java 3D lun lun lu tr
cc tham chiu hn l gi tr thc v ch cc mng c kiu d liu nh
thc mi lu d liu.

http://tailieuhay.com

333

Lp trnh ha trn Java 2D v 3D


Nh rng khi s dng BY_REFERENCE phng thc s dng khc vi
khi khng s dng n. Ngi lp trnh phi c trch nhim m bo cho
kiu d liu ng ns.
V d GeometryArray BY_REFERENCE
S dng BY_REFERENCE Geometry vi GeometryArray cho i
tng hnh hc tnh khng kh hn sao chp Geometry. Trong on ma
2-13 c ly t chng trnh TwistByRefApp.java, s dng tham chiu
n d liu hnh hc thay v cch c, trong trng hp ny to v mu
c ngi dng to thnh 2 mng coord v color.
Vic dng c thc hin theo cc bc sauL
Khai bo mng gi cc d liu hnh hc

To i tng GeometryArray mong mun bng ty chn nh


dng nh BY_REFERENCE. Trong trng hp ny i tng
GeometryArray l mt mng TriangleStripArray.

in y gi tr cho mng TriangleStripArray


Tham chiu n dliu ngi dng vi i tng GeometryArray.
Th t ca cc bc c th thay i khi mng s dng c khai bo
trc khi chng c tham chiu hoc in gi tr v i tng
GeometryArray c to trc khi mng c tham chiu.
// //////////////////////////////////////////
/////
//
// create scene graph branch group
//
public BranchGroup createSceneGraph() {

http://tailieuhay.com

334

Lp trnh ha trn Java 2D v 3D


BranchGroup

contentRoot

new

BranchGroup();
// Create the transform group node and
initialize it to the
// identity. Add it to the root of the
subgraph.
TransformGroup

objSpin

new

TransformGroup();

objSpin.setCapability(TransformGroup.ALLOW_TRANSF
ORM_WRITE);
contentRoot.addChild(objSpin);
Shape3D twist = new Twist();
objSpin.addChild(twist);
//

Duplicate

the

twist

strip

geometry

and set the


// appearance of the new Shape3D object
to line mode
// without culling.
//

Add

the

POLYGON_FILLED

and

POLYGON_LINE strips
// in the scene graph at the same point.
// This will show the triangles of the
original Mobius strip that
// are clipped. The PolygonOffset is set
to prevent stitching.
http://tailieuhay.com

335

Lp trnh ha trn Java 2D v 3D


PolygonAttributes

polyAttrib

new

PolygonAttributes();

polyAttrib.setCullFace(PolygonAttributes.CULL_NON
E);

polyAttrib.setPolygonMode(PolygonAttributes.POLYG
ON_LINE);
polyAttrib.setPolygonOffset(0.001f);
Appearance

polyAppear

new

Appearance();
polyAppear.setPolygonAttributes(polyAttrib);
objSpin.addChild(new
Shape3D(twist.getGeometry(), polyAppear));
Alpha

rotationAlpha

new

Alpha(-1,

16000);
RotationInterpolator

rotator

new

RotationInterpolator(rotationAlpha,
objSpin);
// a bounding sphere specifies a region
a behavior is active
//

create

sphere

centered

at

the

origin with radius of 1

http://tailieuhay.com

336

Lp trnh ha trn Java 2D v 3D


BoundingSphere

bounds

new

BoundingSphere();
rotator.setSchedulingBounds(bounds);
objSpin.addChild(rotator);
// make background white
Background

background

new

Background(1.0f, 1.0f, 1.0f);


background.setApplicationBounds(bounds);
contentRoot.addChild(background);
// Let Java 3D perform optimizations on
this scene graph.
contentRoot.compile();
return contentRoot;
}

//

end

of

CreateSceneGraph

method

of

TwistStripApp
GeometryArray
Lp GeometryArray l lp c s ca nhiu lp hnh hc khc. V th
n nh ngha rt nhiu phng thc cho vic qun l d liu. s dng
tham chiu hnh hc,lp bit BY_REFERENCE trong trng nh dng
nh trong hm to ca i tng GeometryArray.
GeometryArray Methods for Referencing Geometry Data (partial
list)
This collection of methods set the references to Geometry data in user
arrays. In each case, the method will throw an exception if the data
http://tailieuhay.com

337

Lp trnh ha trn Java 2D v 3D


mode for this Geometry array object is not BY_REFERENCE. In some
cases the data mode must also be INTERLEAVED, in other cases the
data mode must not be INTERLEAVED.
y l cc phng thc dng tham chiu n d liu hnh hc trn
mng s dng. Trong mi trng hp phng thc s a ra ngoi l
nu ch d liu khng chn l BY_REFERENCE, trong mt s
trng hp ch d liu c th l INTERLEAVED, trong mt s
trng hp khng c php l INTERLEAVED.
void setColorRef*(Color*[] colors) <new in 1.2>
Sets the color array reference to the specified Color* (Color3b, Color3f,
Color4b, or Color4f) array.
void setColorRefByte(byte[] colors) <new in 1.2>
Sets the byte color array reference to the specified array.
void setColorRefFloat(float[] colors) <new in 1.2>
Sets the float color array reference to the specified array.
void setCoordRef*(Point*[] coords) <new in 1.2>
Sets the coordinate array reference to the specified Point* (Point3d,
Point3f) array.
void setCoordRefDouble(double[] coords) <new in 1.2>
Sets the double coordinate array reference to the specified array.
void setCoordRefFloat(float[] coords) <new in 1.2>
Sets the float coordinate array reference to the specified array.
void setInterleavedVertices(float[] vertexData) <new in 1.2>
Sets the interleaved vertices array reference to the specified array.
void setNormalRef3f(Vector3f[] normals) <new in 1.2>
Sets the Vector3f normal array reference to the specified array.
void setNormalRefFloat(float[] normals) <new in 1.2>
Sets the float normal array reference to the specified array.

http://tailieuhay.com

338

Lp trnh ha trn Java 2D v 3D


void setTexCoordRef*(int texCoordSet, TexCoord*[] texCoords)
<new in 1.2>
Sets the texture coordinate array reference for the specified texture
coordinate set to the specified
TexCoord* (TexCoord2f, TexCoord3f) array.
void setTexCoordRefFloat(int texCoordSet, float[] texCoords) <new
in 1.2>
Sets the float texture coordinate array reference for the specified texture
coordinate set to the specified array.
Mt cch n gin thay i hnh hc s dng BY_REFERENCE l
thay i s gi tr s dng trong mt mng. Di y l cc phng thc
thay i gi tr d liu hnh hc. Tt nhin n ch c tc dng nu ch
BY_REFERENCE. Cc phng thc ny ch c cho php hot
ng trn cc i tng ang sng hoc ang dch khi kh nng
ALLOW_REF_DATA_WRITE c lp.
GeometryArray Methods for Setting Initial Location of Referenced
Geometry Data (partial list)
void setInitialColorIndex(int initialColorIndex) <new in 1.2>
Sets the initial color index for this GeometryArray object. This method
is easily confused with the
setInitialVetrexIndex method which is used when the Geometry is not
BY_REFERENCE.
void setInitialCoordIndex(int initialCoordIndex) <new in 1.2>
Sets the initial coordinate index for this GeometryArray object.
void setInitialNormalIndex(int initialNormalIndex) <new in 1.2>

http://tailieuhay.com

339

Lp trnh ha trn Java 2D v 3D


Sets the initial normal index for this GeometryArray object.
void setInitialTexCoordIndex(int texCoordSet, <new in 1.2>
int initialTexCoordIndex)
Sets the initial texture coordinate index for the specified texture
coordinate set for this GeometryArray object.

GeometryArray Capabilites
BY_REFERENCE <new in 1.2>
Specifies the position, color, normal, and texture coordinate data for this
object are accessed by reference
INTERLEAVED <new in 1.2>
Specifies that the position, color, normal, and texture coordinate data for
this GeometryArray are
accessed via a single interleaved, floating-point array reference. This is
only used in by-reference
Geometry mode.
ALLOW_COUNT_READ | WRITE <new in 1.2>
allow write access to the count or initial index information for this
object
ALLOW_REF_DATA_READ <new in 1.2>
allow read access to the Geometry data reference information; only
used in by-reference Geometry mode
ALLOW_REF_DATA_WRITE <new in 1.2>
allow write access to the Geometry data reference information for this
object. It also enables writing the referenced data itself, via the
GeometryUpdater interface. This is only used in by-reference
Geometry mode.

http://tailieuhay.com

340

Lp trnh ha trn Java 2D v 3D

D liu hnh hc trong bt c mng no c tham chiu n bi mt


i tng GeometryArray sng hoc ang c dch c th thay i
thng qua phng thc updateData ca n. Cc ng dng u phi quan
tm trnh vi phm lut ny.
updateData method of GeometryArray
public void updateData(GeometryUpdater updater) <new in 1.2>
Cp nht mng d liu c truy cp thng qua tham chiu. Phng
thc gi updateData ca i tng GeometryUpdater ng b cp
nht vi d liu nh c tham chiu bi i tng GeometryArray.
2.8.4 AlternateAppearance <new in 1.2>
Nh thy trong phn 2.6.1 i tng Shape3D c th c mt tham
chiu n nt thnh phnh Appearance. Gi giao din ny nh ngha cc
thuc tnh quan st ca i tng Shape3D. Xem hnh 2-20 v 2-37.
Phn 2.6.2 m t lm th no c th chia s mt gi giao din gia cc i
tng Shape3D.
Mt AlternateAppearance cho php ngi pht trin ng dng c
th pht trin cc phng thc thay th cho vic chia s mt gi giao din
gia cc i tng Shape3D. N l mt cch thay th cho vic chia s gi
giao din a ra cch d dng hn tm thi thay i giao din. C 3
cch. Th nht i tng phi nm trn trn vng bao ca
AlternateAppearance. Th 2 phi c mt gii hn quan st trn ng
dng ca n. Th 3 ch nhng i tng quan st cho php giao din ca
n c ghi a ra cho AlternateAppearance
S dng AlternativeAppearance Node

http://tailieuhay.com

341

Lp trnh ha trn Java 2D v 3D


s dng AlternateAppearance u tin phi to gi giao din
s dng php thay th v tham chiu n gi giao din bng i tng
AlternativeAppearance. Sau so lp vng nh hng thng qua i tng
Bounds hoc BoundingLeafa. To mt phm vi quan st cho
AlternateAppearance

theo

AlternateAppearance

vo

mnh.
th

ng

khung

qun

cnh,

lp

thm
c

appearanceOverrideEnable trn i tng Shape3D.


Shape3D setAppearanceOverrideEnable() Method
void setAppearanceOverrideEnable(boolean flag) <new in 1.2>
Lp c ch ra khi no mt giao din ca mt nt c ghi bng mt
nt AlternativeAppearance. Phng thc ny c th gi khi i tng
ang sng hoc dch ty theo kh nng n c lp th no.

Shape3D Capabilities (partial list, see Section 2.2.1)


ALLOW_APPEARANCE_OVERRIDE_READ | WRITE <new in
1.2>
cho php truy cp c/ghi ti c appearanceOverrideEnable
AlternativeAppearance Class <new in 1.2>
Cc phn di l danh sch hm tao cho lp AlternateAppearance
AlternateAppearance Constructor Summary
AlternateAppearance() <new in 1.2>
Khi to mt nt AlternateAppearance vi cc tham s mc nh:
Appearance, scope,
influencingBounds, v influencingBoundingLeaf = null
AlternateAppearance(Appearance Appearance) <new in 1.2>

http://tailieuhay.com

342

Lp trnh ha trn Java 2D v 3D


To mt nt AlternateAppearance vi giao din cho trc.

AlternateAppearance Method Summary (partial list)


void addScope(Group scope) <new in 1.2>
Gn mt nt Group cho trc ti danh sch nt AlternateAppearance
ca phm vi quan st.
java.util.Enumeration getAllScopes() <new in 1.2>
Tr v bng lit k danh sch nt AlternateAppearance ca phm vi
quan st.
void insertScope(Group scope, int index) <new in 1.2>
Chn vo mt nt Group cho trc vo danh sch ti ch s cho trc.
int numScopes() <new in 1.2>
Tr v s nt trong danh sch.
void removeScope(int index) <new in 1.2>
Loi b nt ti v tr cho trc trong danh sch.
void setAppearance(Appearance Appearance) <new in 1.2>
Lp giao din cho nt AlternateAppearance
void setInfluencingBoundingLeaf(BoundingLeafa region) <new in
1.2>
Sets the AlternateAppearance's influencing region to the specified
bounding leaf.
Lp vng nh hng ca AlternateAppearance ti l bao cho trc.
void setInfluencingBounds(Bounds region) <new in 1.2>
Lp vng nh hng ca AlternateAppearance ti vng bao cho trc.
void setScope(Group scope, int index) <new in 1.2>
Thay th v tr ca nt ti v tr ch mc trong danh sch vi mt nt
Group cho trc.

http://tailieuhay.com

343

Lp trnh ha trn Java 2D v 3D


Nhng kh nng ca lp AlternateAppearance
AlternativeAppearance Capabilities
ALLOW_APPEARANCE_READ | WRITE allow read (write) access
to its Appearance information
ALLOW_INFLUENCING_BOUNDS_READ | WRITE allow read
(write) access to its influencing Bounds and bounding leaf information
ALLOW_SCOPE_READ | WRITE allow read (write) access to its
scope information at runtime

2.9 Clipping Ct xn
Ch ca Clipping khng thc s l vic to hnh nhng mt trong
nhng nhn t nh hng n hnh nh trong nh th no. V d khi mt
hnh m rng n vng bin nn n b ct i v th mt s hnh khng
xem c. Ct xn l mt ch phc tp, phn ny a ra cc vn c
bn nht trong vic ct hnh .

2.9.1 View Defines a Frustum


Trong chng 1 gii thiu v h ta o v m t v tr ca mt lin
quan n n. Trong mt s trng hp bn s bt gp hon cnh m mt
i tng quan st khng c dng hnh. L do th c rt nhiu, ngoi
i tng c th nm ngoi vng frustum (hnh ct). Vng ny l ni
i tng quan st v cc phn ca i tng quan st khc c hin th.
Hnh 2-29 s a ra cho bn nh ngha r hn v vng frustum.
Ch rng mt phng ct pha trc(front clipping plane) nm ng
sau mn nh(image plate). iu ny l khng hp l nhng n cng
khng c khuyn khch.

http://tailieuhay.com

344

Lp trnh ha trn Java 2D v 3D

Phn chp ct ny c nh ngha thng v tr mt nhn v 2 mt


phng ct trc v sau. Gi tr mt nh tng i hp l tuy nhin ngi
lp trnh c th thay i khong cch ny.
Nn
(back clip distance) / (front clip distance) < 3000.
Tuy nhin thc th t l ny thng l t 100 n 1000 l hp l nht.
View Methods for Adjusting the Frustum (partial list)
i tng View trong phn th hnh thc ca th khung cnh Java
3D nh ngha rt nhiu tham s v hnh nh. Di y l mt trong s
.
void setBackClipDistance(double distance)
Lp khong cch mt ct sau vi m hnh quan st, khong cch ny
phi ln hn vi khong cch ca mt trc.
void setFrontClipDistance(double distance)
Lp khong cch mt ct trc vi m hnh quan st, khong cch ny
phi ln hn 0.0 v nh hn khong cch sau.
void setFieldOfView(double fieldOfView)
http://tailieuhay.com

345

Lp trnh ha trn Java 2D v 3D


Lp trng ngang m hnh quan st dng radians.

2.9.2 Clip Node


Nh ni pha trn khong cch ca hnh chp ct c th thay i.
Nt ct l mt i tng thc hin iu ny. Mi Clip nh ngha mt
vng ng dng ch ra mt i tng vng bao hoc l bao. Khi vng bao
ny giao vi khu vc quan st .khong cch mt sau ca i tng Clip
c s dng dng. mt trc nh ngha bi i tng View khng
nh hng.
Vic s dng Clip lm tng tc x l c bit trong nhng khung
cnh phc tp.
Di y l danh sch cc hm to v phng thc:
Clip Constructor Summary
Clip()
To mt Clip Node vi tham s mc nh : backDistance = 100,
ApplicationBounds v applicationBoundingLeaf = null
Clip(double backDistance)
To mt Clip node vi tham s backDistance

Clip Method Summary


void setApplicationBoundingLeaf(BoundingLeafa region)
Lp vng ng dng ct ti i tng bao l.
void setApplicationBounds(Bounds region)
Lp vng ng dng ct ti i tng bao.
void setBackDistance(double backDistance)
Lp khong cch sau vi gi tr cho trc.

http://tailieuhay.com

346

Lp trnh ha trn Java 2D v 3D

Clip Field Summary


ALLOW_APPLICATION_BOUNDS_READ | WRITE allow read
(write) access to its application Bounds and bounding leaf at runtime.
ALLOW_BACK_DISTANCE_READ | WRITE allow read (write)
access to its back distance at runtime.
Nt ModelClip c th ct i tng quan st ra theo nhiu cch. Mt
i tng ModelClip nh ngha mt tp 6 mt ct vi hng ty trong
h ta c bn. Mt ct nh ngha mt na khng gian cho nhng nh
c la chn dng. Khi gia cc na mt ct c giao nhau chng
nh ngha mt vng m cc im trong khng c dng, d chng
trong hnh chp ct nhn thy. nh hng ny ca nt ModelClip c
iu khin thng qua cc vng c m t trc da trn nh hng v
tm quan st.

2.9.4 ModelClip Example


Cc bc s dng ModelClip
Thit lp vng nh hng cho i tng ModelClip
Chn hoc b chn cc mt ct ty theo mnh
Lp hng v v tr cho mt phng s dng.
Thm i tng ModelClip vo th khung cnh
Mc d khng thc hin trong v d ny nhng ModelClip c th nh
ngha mt phm vi quan st.

http://tailieuhay.com

347

Lp trnh ha trn Java 2D v 3D

Nh rng lun lun c 6 mt phng trong i tng ModelClip. Kt


qu l mng Vertor4d c s dng trong hm to phi c kich thc 6.
ModelClip Constructor Summary
ModelClip() <new in 1.2>
To mt nt ModelClip vi tham s mc nh.
ModelClip(Vector4d[] planes) <new in 1.2>
To mt nt ModelClip vi mt cho trc.
ModelClip(Vector4d[] planes, boolean[] enables) <new in 1.2>
To mt nt ModelClip vi mt cho trc v c thit lp cc c.

ModelClip Method Summary (partial list)


void addScope(Group scope) <new in 1.2>
Appends the specified Group node to this ModelClip node's list of
scopes.
void insertScope(Group scope, int index) <new in 1.2>
Inserts the specified Group node into this ModelClip node's list of
scopes at the specified index.
int numScopes() <new in 1.2>
Returns the number of nodes in this ModelClip node's list of scopes.
void removeScope(int index) <new in 1.2>

http://tailieuhay.com

348

Lp trnh ha trn Java 2D v 3D


Removes the node at the specified index from this ModelClip node's list
of scopes.
void setEnable(int planeNum, boolean enable) <new in 1.2>
Sets the specified enable flag of this ModelClip node.
void setEnables(boolean[] enables) <new in 1.2>
Sets the per-plane enable flags of this ModelClip node to the specified
values.
void setInfluencingBoundingLeaf(BoundingLeafa region) <new in
1.2>
Set the ModelClip node's influencing region to the specified bounding
leaf.
void setInfluencingBounds(Bounds region) <new in 1.2>
Set the ModelClip node's influencing region to the specified Bounds.
void setPlane(int planeNum, Vector4d plane) <new in 1.2>
Sets the specified clipping plane of this ModelClip node.
void setPlanes(Vector4d[] planes) <new in 1.2>
Sets the clipping planes of this ModelClip node to the specified planes.
void setScope(Group scope, int index) <new in 1.2>
Replaces the node at the specified index in this ModelClip node's list of
scopes with the specified Group
node.

ModelClip Field Summary


ALLOW_ENABLE_READ | WRITE allow read (write) access to its
enable flags at runtime
ALLOW_INFLUENCING_BOUNDS_READ | WRITE allow read
(write) access to its influencing Bounds and bounding leaf at runtime

http://tailieuhay.com

349

Lp trnh ha trn Java 2D v 3D


ALLOW_PLANE_READ | WRITE allow read (write) access to its
planes at runtime
ALLOW_SCOPE_READ | WRITE allow read (write) access to its
scope information at
runtime

http://tailieuhay.com

350

Lp trnh ha trn Java 2D v 3D

CHNG 3
TO NI DUNG

3.1 Ni dung chnh


Trong cc chng trc chng ta tm hiu cch to ra nhng i
tng trc quan bng cc phng php n gin. Bng cc phng
php ny cng vic lp trnh tr nn bun t. Trong chng ny chng
ta s xem xt mt phong php khc to ra cc i tng trc quan.
Trong mc 3.2 s gii thiu lp GeometryInfo, lp tin ch ny cung
cp kh nng t ng ha trong vic to ra cc i tng trc quan.
Lp GeometryInfo cng vi cc lp Triangulator, Stripifier, v
NormalGeneration cho phep ta to ra c i tng trc quan nh l
cc a gic hnh hc. Cc lp ny chuyn i a gic thnh tam gic,
v tinh chnh cc a gic ny.
Mc 3.3 gii thiu lp Loader. Lp ny c kh nng to ra cc di
tng trc quan Java3D t cc tp c to bi cc phn mm 3D. C
th lp Loader c th c cc file VRML, Lightwave, AutoCad v cc
nh dng file 3D khcMt c im quan trng l ta c th vit cc
lp Loader ring phc v cho nhu cu s dng.

http://tailieuhay.com

351

Lp trnh ha trn Java 2D v 3D


Cc mc tip theo chng ta s xem xt cc k thut khi to ni dung.

3.1.1 GeometryInfo
Thng thng v mt hnh mt i tng hnh hc bt k, chng ta
phi t lm hon ton v vic code s rt vt v v nhm chn. S
dng lp GeometryInfo cng vic s tr nen d dng v thun tin
hn. Khi bt u v mt i tng hnh hc, chng ta s xc nh mt
a gic bt k ph hp vi di tng . a gic ny c th l a gic
lm, khng phng i tng GeometryInfo v cc lp khc s
chuyn cc a gic ny thnh cc tam gic nh hn, t Java3D c
th render (t_cht) .

nng cao hiu nng ca h thng chng ta c th s dng i tng


Stripifier chai cc tam gic thnh cc tam gic ri nhau. Nu chng
ta mun to bng cho i tng hnh hc, ta s dng NormalGenerator
tnh ton cc vector b mt ca i tng hnh hc.

3.2.1 Mt v d n gin v GeometryInfo


Trong phn ny chng ta s xem xt cc khi to v s dng i
tng GeometryInfo. khi to mt i tng GeometryInfo,
chg ta cn ch r loi geometry cn dng: POLYGON_ARRAY,
QUAD_ARRAY,
http://tailieuhay.com

TRIANGLE_ARRAY,
352

Lp trnh ha trn Java 2D v 3D


TRIANGLE_FAN_ARRAY v TRAINGLE_STRIP_ARRAY. Khi
khi ta chng ta phi ch ra coordinate v strip counts.
Chng ta xt on code di y.
GeometryInfo

gi

new

GeometryInfo(GeometryInfo.POLYGON_ARRAY);
gi.setCoordinates(coordinateData);
gi.setStripCounts(stripCounts);
Triangulator tr = new Triangulator();
tr.triangulate(gi);
NormalGenerator ng = new NormalGenerator();
ng.generateNormals(gi);
Stripifier st = new Stripifier();
st.stripify(gi);
Shape3D part = new Shape3D();
part.setAppearance(appearance);
part.setGeometry(gi.getGeometryArray());

Khi to i tng GeometryInfo v thit lp cc thng s cn


thit (coordinate, stripcounts).

Sau khi to ra i tng GeometryInfo, chng ta c th s


dng cc lp tin ch khc nh NormalGenerator, Triangulator
bng cch truyn tham s l i tng GeometryInfo.

3.2.2 S dng GeometryInfo


Mt s ch khi s dng i tng GeometryInfo. Nu s dng
c NormalGenerator v Stripifier th ta phi s dng NormalGenerator
trc. Normalgenerator v Stripifier u ch s dng vi cc tam gic ch

http://tailieuhay.com

353

Lp trnh ha trn Java 2D v 3D


mc. Khi s dng nhng lp tin ch ny, chng ta khng cn quan tm
n kiu ca GeometryInfo(POLYGON_ARRAY, QUAD_ARRAY,
STRIP_ARRAY ), khi cc d liu ny c chuyn i thnh cc
tam gic ch mc. Sau khi thc hin cc tam gic ch mc ny c gn
lin li vi nhau. Tuy nhin cc thnh phn khc ca di tng
GeometryInfo s b thay i.

3.2.3 Mt s lp thng dng c lin quan n GeometryInfo


Trong phn ny chng ta s xem xt k hn mt s lp thng dng
nm trong gi

com.sun.j3d.util.geometry.

http://tailieuhay.com

354

Lp trnh ha trn Java 2D v 3D

Lp GeometryInfo c mt hm to duy nht, khi khi to mt i


tng cn ch r kiu ca i tng Gemetry v h trc ta tng
ng.

Hm to GeometryInfo
Gi: com.sun.j3d.utils.geometry
Lp cha: java..lang.Object
S dng: Chng ta mun chuyn cc i tng hnh hc cho i tng
GeometryInfo c th dng cc lp tin ch khc. Khi chng ta
chuyn i tng hnh hc cn th hin cho i tng GeometryInfo,
cc lp tin ch s s dng cc d liu trong i tng GeometryInfo
thc hin cc yu cu ca chng ta.
GeometryInfo(int primitive)
Gi tr ca primitive:
POLYGON_ARRAY

: a gic, cc a gic 2 chiu,3

chiu(a din)
QUAD_ARRAY

: T din

TRIANGLE_ARRAY

: Tam gic

TRIANGLE_FAN_ARRAY

: Mng StripCounts cho bit s nh

tng vi mi tam gic ri

http://tailieuhay.com

355

Lp trnh ha trn Java 2D v 3D


TRIANGLE_STRIP_ARRAY : Mng StripCounts cho bit s nh
tng vi mi tam gic ri
Lp GeometryInfo ch nhiu phng thc, trong c cc phng
thc theet lp hay ly thng tin v h trc to , mu sc, ch mc,
cc d liu b mt.

Cc phong thc ca lp GeometryInfo


void recomputeIndices()
Thc hin li vic so xo m bo cc thng tin kt ni l chnh xc.
Gi hm ny khi cc thng tin v h trc ta d khng chnh xc
void reverse()
o ngc th t ca tt c cc danh sch
void setColorIndices(int[] colorIndices)
void setColors(Color3f[] colors)
t mng mu sc
void setColors(Color4f[] colors)
t mng mu sc.
void setContourCounts(int[] contourCounts)
t danh sch mu vin
void setCoordinateIndices(int[] coordinateIndices)
Thit lp mng t l ca h trc ta .
void setCoordinates(Point3f[] coordinates)
Thit lp mng ca h trc ta .
void setCoordinates(Point3d[] coordinates)
Thit lp mng ca h trc ta .
void setNormalIndices(int[] normalIndices)

http://tailieuhay.com

356

Lp trnh ha trn Java 2D v 3D


Thit lp mng cc ch dn.
void setNormals(Vector3f[] normals)
void setNormals(float[] normals)
void setStripCounts(int[] stripCounts)
void setTextureCoordinateIndices(int[] texCoordIndices)
void setTextureCoordinates(Point2f[] texCoords)
Cch s dng cc lp tin ch khc cng nh s dng vi lp
GeometryInfo. Sau y chg ta s ln lt xem xt hm tov phng
thc ca cc lp Triangulator, Stripifier v NormalGenerator. y
cng chnh l th t khi chng ta lm vic vi POLYGON_ARRAY.
Trong lp Triangulator ch lm vic vi i tng hnh hc kiu
POLYGON_ARRAY.

http://tailieuhay.com

357

Lp trnh ha trn Java 2D v 3D


Hm to lp Triangulator nhm to ra i tng tam gic.
Triangulator Constructor Summary
Gi: com.sun.j3d.utils.geometry
Lp cha: java.lang.Object
Triangulator()
Hm to lp Triangulator
Triangulator Method Summary
void triangulate(GeometryInfo gi)
Phn thc chuyn i mt i tng GeometryInfo te kiu nguyn
thu

POLYGON_ARRAY

sang

kiu

nguyn

thu

kiu

TRIANGLE_ARRY.
Hm to lp Stripifier nhm to ra mt i tng stripification
Stripifier Constructor Summary
Gi: com.sun.j3d.utils.geometry
Lp cha: java.lang.Object
Lp Stripfier c tin ch i kiu d liu nguyn thu ca mt i tng
GeometryInfo sang kiu Triangle Strips. cho kt qu tt Normal
Generation phi c thc hintrc khi qu trnh tch nh i tng
hnh hc.
Stripifier()
Hm to
Png thc ca lp Stripifier
void stripify(GeometryInfo gi)

http://tailieuhay.com

358

Lp trnh ha trn Java 2D v 3D


Chuyn GeometryInfo c cha i tng GeometryInfo vo mng
Triangle Strips.
Lp NormalGenerator c hai hm to. Hm to th nht to ra i
tng NormalGenerator vi gc gp c gi tr mc nh. Hm to th
hai cho php thit lp gi tr cho crease angle.
NormalGenerator Constructor Summary
Gi: com.sun.j3d.utils.geometry
Lp cha: java.lang.Object
NormalGenerator()
Khi to mt NormalGenerator vi gc gp mc nh (0.76794 radians,
or 44).
NormalGenerator(double radians)
Khi to mt NormalGenerator vi gc gp c gi tr l tham s u
vo.
Cc Phng thc NormalGenerator
void generateNormals(GeometryInfo geom)
double getCreaseAngle()
Ly gi tr gc gp
void setCreaseAngle(double radians)
Thit lp gc gp

Cc phng thc ca lp NormalGenerator : mt phng thc thit


lp, mt phng thc ly gi tr crease angle

http://tailieuhay.com

359

Lp trnh ha trn Java 2D v 3D


Loaders
Mt lp Leader c cc file 3D v to ra ccm i tng ca Java3D
vi ni dung cu file c a vo. Sau i tng 3D ny c th
c s dng nh cc i tuwng khc ca Java3D. Gi
com.sun.j3d.leaders cung cp cc phng thc load cc file 3D t cc
chuwong trnh ng dng khc vo trong chuwong trnh Java3D.
Trn thc t ngy cng c nhiu cc nh dng file 3D t cc ng dng
khc nhau, cng vic load cc file ny khng phi l cng vic ca
Java3D hay ca gi loaders, ma ch c phn giao din dng cho k
thut loading c a vo.

Mt v d n gin s dng leader.


load vo ni dung mt file, chng ta khng nht thit phi s dng
mt lp tin ch load file . Ta s dng lp loader vi cc bc
nh sau:
Tm mt loader
Import lp loader ng vi dnh dng fie tng ng
Import nhng lp cn thit
nh ngha mt bin khung cnh
To mt i tng loader
Load ni dung ca file trong khi catch, v gn kt qu c c
cho bin khung cnh
Chn i tuwng khung cnh vo trong min khung cnh
Ta c th xem xt mt ng dng mu ca lp ObjectFile trong
jdk1.2/demo/java3d/ObjLoad.
Class ObjectFile

http://tailieuhay.com

360

Lp trnh ha trn Java 2D v 3D


Gi: com.sun.j3d.loaders
Thc thi: Loader
Lp ObjectFile thc thi giao din Loader vi file c nh dng
WaveFront.obj, mt nh dng chun ca file 3D uwc to ra bng
phn mm WaveFront Advanced Vualizer.
Chng ta xem xt mt v d c thc hin theo cc bc ni
trn.
Chng ta c th thy cc bc 1,2..6 trong v d trn u c hin
theo trnh t cc bc ta phn tch.

Cc loader ph bin
Trong Java3D chng ta c th tm thy rt nhiu lp Loader. Ta c
bng danh sach c th di y.
File

M t

3DS
COB
DEM

3D-Studio
Caligari trueSpace
Digital Elevation Map
AutoCAD Drawing Interchange

DXF
IOB

File
Imagine

LWS

Lightwave Scene Format

NFF

WorldToolKit NFF Format

OBJ

Wavefront

PDB

Protein Data Bank

PLAY

PLAY

SLD

Solid World

VRT

Superscape VRT

http://tailieuhay.com

361

Lp trnh ha trn Java 2D v 3D


VTK
WRL

3.3.3

Visual Toolkit
Virtual

Reality

Modeling

language

Giao din ca gi Loader v lp c s

load c cc file 3D trong mt ng dng Java, chuwong trnh


ca chng ta phi s dng n i tng loader v i tng scene.
i tng loader c, phn tch, v to ra phn th hin ca Java 3D
cho ni dung file 3D . i tng scene lu li scene graph c
to ra t loader. Chng ta c th load c nhiu scene t nhiu file
3D, bng cc s dng cng mt i tng loader to ra nhiu i
tng scene. Trong mt chng trnh Java3D chng ta c th load
c nhiu file nh dng khc nhau bng cc s dng cc loader
thch hp.
Sau y chng ta s xem xt c th cc interface c trong gi
com.sun.j3d.loaders. Mt lp loader thc thi loader interface v s
dng mt lp thch hp thc thi scene interface.

com.sun.j3d.loaders Interface Summary


Loader The Loader interface is used to specify the location and
elements of a file format to load.
Scene The Scene interface is a set of methods used to extract Java 3D
scene graph information from a file
loader utility.
Trong gi com.sun.j3d.loaders cn cung cp cc lp c s thc
thi nhng interface ny.

http://tailieuhay.com

362

Lp trnh ha trn Java 2D v 3D

com.sun.j3d.loaders Class Summary


LoaderBase Lp ny thc thi giao din Load v thm vo cc hm
to. Lp uc thit k chng ta c th th k nu mun xy dng cc
loader.
SceneBase Lp SceneBase thc thi giao din Scene v vic tha k lp
SceneBase gip cho chng ta d dng s dng c cc phng thc
xy dng
Cc phng thc c nh ngha trong interface, cn phn thc thi
nm trong cc lp loader m ngi lp trnh s dng.

Interface Loader Method Summary


Gi: com.sun.j3d.loaders
Giao din Loader c s dng ch r ra v tr v cc thnh phn ca
mt nh dng file cn load. Phn giao din ny cung cp cho lp
Loader cc nh dng file khc nhau. Giao din Scene s c thc thi
cung cp cho ngi dng nhng giao din ph hp lp d liu t
cc file.
Scene load(java.io.Reader reader)
Phng thc ly ra thnh phn Reader v tr v mt i tng scenec
cha khung cnh.
Scene load(java.lang.String fileName)
Phng thc ly ra ni dung ca mt file t tn file, v tr v mt i
tng scene c cha khung cnh
Scene load(java.net.URL url)
Phng thc ly ra ni dung ca mt file t URL, v tr v mt i
tng scene c cha khung cnh
void setBasePath(java.lang.String pathName)

http://tailieuhay.com

363

Lp trnh ha trn Java 2D v 3D


Phng thc ny thiit lp ng dn c s cho cc file c dng
trong phng thc load(String)
void setBaseUrl(java.net.URL url)
Phng thc ny thiit lp ng dn c s cho cc file c dng
trong phng thc load(URL)
void setFlags(int flags)
Phng thc thit lp c load
LOAD_ALL Cho php load ton b cc i tng vo khung cnh.
LOAD_BACKGROUND_NODES C cho php load cc i tng
backgrround vo khung cnh.
LOAD_BEHAVIOR_NODES C cho php load cc hnh vi vo trong
khung cnh.
LOAD_FOG_NODES C cho php load sng m vo trong khung
cnh.
LOAD_LIGHT_NODES C cho php load i tng nh sng vo
trong khung cnh.
LOAD_SOUND_NODES C cho php load i tng m thanh vo
trong khung cnh..
LOAD_VIEW_GROUPS C cho php load i tng view (camera)
vo trong khung cnh...
Lp loader c s cung cp phn thc thi vi mi phng thc load
(gm 3 phng thc) c nh ngha trong cc loader interface.
Lp Loader thc hin phn thc thi 2 hm to.
LoaderBase Constructor Summary
Gi: com.sun.j3d.loaders
Thc thi: Loader
Lp Loader thc thi giao din loader.

http://tailieuhay.com

364

Lp trnh ha trn Java 2D v 3D


LoaderBase()
Khi to i tng Loader vi c gii tr mc nh
LoaderBase(int flags)
Khi to i tng Loader vi cc c ch nh
Khi chng ta vit mt lp loader mi, chng ta c th tha k li lp
loader c s trong gi com.sun.j3d.loaders v s dng lp SceneBase
trong cng gi ny.
Trong qu trnh vit mt loader mi chng ta cn xem xt vic tha
k lp SceneBase hoc thc thi interface Scene mt cch trc tip.
Lp ScaneBase c chc nng lu tr v nhn d liu c to ra bi
lp Loader trong qu trnh c file. Cc phng thc thc hin vic
lu tr (c cung cp bi nhng ngi vit ra Loader) c tn dng
add* . Cc phng thc thu nhn d liu (c ngi s dng lp
loader gi ra) c tn dng get*.
Khi tha k lp loader c s, cng vic ch yu ca chng ta l vit
cc phng thc nhn ra format ca file. Mi phng thc ny
to ra cc thnh phn scene graph tng ng v lu cc d liu ny
trong i tng scene.
SceneBase Constructor Summary
Gi: com.sun.j3d.loaders
Thc thi giao din Scene
Lp SceneBase thc thi giao din Scene.
SceneBase()
Khi to mt i tng SceneBasse

SceneBase Method Summary (partial list: loader users' methods)


Background[] getBackgroundNodes()

http://tailieuhay.com

365

Lp trnh ha trn Java 2D v 3D


Behavior[] getBehaviorNodes()
java.lang.String getDescription()
Fog[] getFogNodes()
float[] getHorizontalFOVs()
Light[] getLightNodes()
java.util.Hashtable getNamedObjects()
BranchGroup getSceneGroup()
Sound[] getSoundNodes()
TransformGroup[] getViewGroups()
Qua nhng im trn ta c th xy dng c loader cho nhu cu cu
mnh. Phn tip theo ta s i vo chi tit vic vit mt loader.

Vit mt loader

Cng vic vit mt loader l mt cng vic phc tp v khng phi


ngi lp trnh Java 3D no cng phi vit. Tuy nhin vic nghin cu
cch vit, lm vic cu mt Loader s gip chng ta hiu r hn khi
no th s dng loader, hiu cch s dng GeometryInfo, hiu c
vic thc thi ca ObjectLoader.
Cng vic ca mt loader
Ngoi nhim v chnh l c ni dung mt file ho, to ra mt i
tung scene graph th hin cho ni dung ca file c load, lp loader
cn c cc chc nng khc.
Tnh ton b mt thng thng ca cc a gic.
Th hin i tng ha ti nguyn gc
Chnh t l ca i tng hnh hc mt cch thch hp, tng ng
1-1 trn mi trc

http://tailieuhay.com

366

Lp trnh ha trn Java 2D v 3D


Lm mn i tng hnh hc
Th hin i tng hnh hc mt cch hiu qu bng vic phn
nh thnh nhiu phn, hoc s dng LOD.
Tuy nhin khng phi bt c loader no cng phi thc hin y
cc chc nng trn. Nhim v ch yu ca n l to ra i tng
hnh hc tng ng vi ni dung file c load vo.
Hm to lp Loader
Trong phn ny chng ta s xem xt vic tao ra mt i tuwng
loader t hm to ca lp loader xaay dng. Nhn chung vic
xy dng mt lp loader i hi nhng kin thc lin quan n
nh dng ca file cn load v phn lung stream trong Java.
C nhiu cch tip can trong vic xy dng mt loader. Tuy nhin
c th tn dng c s h tr ca Java3D, chng ta c th dng
cc lp SceneBase v LoaderBase ( trnh by cc chng
trc). Mt loader c xy dng trn cc lp ny c kh nng
chn c phn d liu ca file c s dng trong ng dng.
l cch tip cn chun cho vic xy dng mt loader.
Mt kha cnh kh khn na l khi xy dng mt loader chng ta
phi quan tm n format ca file, c loi file n gin, c loi file
phc tp, c nhng file cn c s lin quan n cc file cu hnh
khc nh file quy ng scene graph description.
S dng khi nim Layer, vic xy dng lp loader tr nn d dng
hn. S lng cc layer li ph thuc nhiu vo format ca file cn
load. Sau y chng ta xem xt tp cc layer n gin.
Layer/level Chc nng
Tokenizer Chuyn cc k t thnh cc

http://tailieuhay.com

367

Lp trnh ha trn Java 2D v 3D


token
i tng

Chuyn cc token hnh nh


ca file thnh cc i tng
ho (geometry, lights,

Scene

textures )
Chuyn danh sch cc i
tong scene graph vo tong

File

khung cnh ho
Lin quan n cc file hay
cc URL cn m

Tokenizer
y l tng thp nht ca loader trong vic x l cc file ho.
Tn ny c nhim v chia nh ni dung cu file thnh phn nh
hn, gi l cc token. Ly v d mt token c th l mt s, mt
t, hay mt k t n.
i tng
Tng object c nhim v to ra cc i tng ha t cc
token c to ra theo ni dung ca file. Mt vi i tng c
th l i tng nh, a gic, nh sng, kt cu hay bt c i
tng khung cnh no trong Java3D. Nhng object ny l cc
thnh phn ca mt khung cnh
Scene
L tp hp cc i tng hnh hc.Thng thng tng scene
trong Java3D n gin. Tr trung hp ngoi l khi n lp
loader c nhim v load mt tp i din cho mt khung cnh
ha. V d nh file theo nh dng Open Inventor v OOGL
List.
File

http://tailieuhay.com

368

Lp trnh ha trn Java 2D v 3D


File c cha ni dung cn c load.
Vit mt File Loader n gin
Trong phn ny chng ta s xem xt c th hn vic xy dng mt
loader n gin. Vic du tin l chng ta cn xc nh nh dng
file m loader ca chng ta s load. Thng thng chng ta s chn
l mt h cc file co nh dng tng ng, v d nh h OOGL
(Object Oriented Graphics Library)
nh dng QUAD
Bc u tin vit mt Loader l bit c nh dng ca file.
Trong phn ny chng ta s xem xt qua v cu trc file QUAD,
cc chi tit c th s trnh by phn 4. Trong phn 4 chng ta s
xem xt nhng vn :
a s cc file OOGL u c nh dng ASCII t do- c cc
khong trng, trng, tab, dng mi gia cc phn t (s, k
t). Cc phn comment c bt u sau du # .
nh dng QUAD thuc loi nh dng OOGL. nh dng QUAD
m t mt tp hp cc b quad. Mt file dng QUAD l mt tp
hp 4*n nh, trong n l s cc b quad.
V d dui y cho thy noi dung mt file QUAD. File ny cha
thng tin v mt hnh vung trn h khng gian 3 chiu, vi thnh
phn z ca hnh vung bng 0, hnh vung ny nm trn mt phng
Oxy.

http://tailieuhay.com

369

Lp trnh ha trn Java 2D v 3D


Cu trc ca mt ile QUAD ni chung l phuc tp hn nhiu so
vi v d trn, tuy nhin mc ch ca chng ta l tm hiu cch
vit mt loader n gin nn ta da trn file QUAD n gin. Cu
trc chung ca file QUAD c m t k hn trong phn 4.
Trong bng di u a ra danh sch cc lp v mi quan h gia
chng ta c th xy dng mt lp loader.
Tng/Lp

Thc thi

tokenizer

QuadFileParser

Object

SimpleQuadObject

scene

QuadFileParser
SimpleQuadScene tha k

file

lp SimpleQuadObject
SimpleQuadFileLoader
tha

cha

lp

SimpleQuadScene thc thi


application

lp Loader
SimpleQuadLoad cha lp

SimpleQuadFileLoader
Trong cc phn tip theo chng ta s xem xt k hn cc lp ny,
thnh phn v hot ng ca n tng mt ng dn loader.
Tng Tokenizer(Qun l cc phn t)
Bc u tin xy dng mt loader l xy dng tokenizer. iu
ny c thc hin bng cch chng ta tha k lp tin ch
StreamTokenizer. Lp ny c vo lung cc k t v chuyn i
n thnh tp cc phn t. Trong v d ny, chng ta xy dng lp
QuadFileParser th k lp StreamTokenizer.
Cc phng thc trong lp QuadFileParser

http://tailieuhay.com

370

Lp trnh ha trn Java 2D v 3D


Phng thc

Nhim v/hot ng

Void setup()

Ch ra cc tham s cho tokenizer,

boolean getToken()

hm ny c gi trong hm to
Phng thc ly ra token tip theo,
phng

thc

dng

nextToken()ca
Void printToken()

StreamTokenizer
In gi tr ca

hm
lp

cc

token

ra

System.out, dng trng qu trnh g


QuadFileParser(Reade

li
Hm to gi phng thc setup v

r r)

lin kt cc token vi i tng


reader.

Nhng s thay i m rng ch yu nm trong phng thc setup.


Nhng s thay i ny bao gm:
nh ngha nhng k t c bit, du xung dng, du
comment.
class QuadFileParser extends StreamTokenizer {
// setup
// Sets up StreamTokenizer for reading OOGL file formats.
void setup()
{
resetSyntax();
// EOL chars are insignificant in QUAD file
eolIsSignificant(false);
wordChars('A','z');
// have StreamTokenizer parse numbers (makes double-precision)

http://tailieuhay.com

371

Lp trnh ha trn Java 2D v 3D


parseNumbers();
// Comments begin with # to end of line
commentChar('#');
// Whitespace characters delineate words and numbers
// blanks, tabs, and newlines are whitespace in OOGL
whitespaceChars('\t', '\r'); // ht, lf, ff, vt, cr
whitespaceChars(' ', ' '); // space
} // End of setup
/* getToken
* Gets the next token from the stream. Puts one of the four
* constants (TT_WORD, TT_NUMBER, TT_EOL, or TT_EOF) and
the token
* value into ttype token object.
* The value of this method is in the catching of exceptions in this
* central location.
*/
boolean getToken()
{
int t;
boolean done = false;
try {
t = nextToken();
}
catch (IOException e) {
System.err.println(
"IO error on line " + lineno() + ": " + e.getMessage());
return false;
}
return true;
http://tailieuhay.com

372

Lp trnh ha trn Java 2D v 3D


} // End of getToken
// QuadFileParser constructor
QuadFileParser(Reader r)
{
super(r);
setup();
} // end of QuadFileParser
} // End of file QuadFileParser.java
Ta c th thy nhng thay i trong cc phng thc getToekn(),
printToken() .. l khng ng k. Nh vy ta hon thnh vic
vit lp QuadFileLoader, tip theo chung sta chuyn ln tng trn,
tng object.
Thc hin tng Object
Nhim v ca tng Object l chuyn nhng token c cung cp
bi tng tokenizer sang cc i tng hnh hc.Tng v d ca
chng ta th iu ny l n gin bi v chng ta ch c mt i
tng hnh hc duy nht l t din. Tuy nhin chng ta gp phi
mt kh khn trong vic xc nh s lng i tng hnh hc
c cung cp.
Cc phng thc trong lp SimpleQuadObject
Phng thc

Nhim v

Boolean

c nh, mi nh bao gm

readVertex(QuadFileParser st)

ta x,y,z hay cc thng


tin khc v mu sc, b

Boolean

mt
c cc t din bng cch

readQuad(QuadFileParser st)

c cc nh t file QUAD

http://tailieuhay.com

373

Lp trnh ha trn Java 2D v 3D


Void

c file QUAD xc nhn

readQuadFile(QuadFileParserst)

cc th trong file, xc nh
tp cc nh v c ra c t
din(t gic)

Nhim v ca tng ny l c ra cc i tng hnh hc t tp hp


cc token. Trong trng hp ny cc i tng hnh hc l cc
nh. Tp cc nh ny c lu tr trong mt i tng ArrayList.
S dng ArrayList ch php vic thay i kch thc cu mng to
thi gian thc hin. Ti tng Scene, i tng kiu ArrayList c
chuyn i sang mt Array v sau l sang i tng hnh hc.
Chng ta xem xt phn code ch yu trong tng Object. Ton b
phn code y nm trong example.jar.
import QuadFileParser;
// many other imports omitted in tutorial text
public class SimpleQuadObject
{
protected int flags;
protected int fileType = 0; // what properties vertices have
// constants for indicating file type
protected

static

final

int

COORDINATE

GeometryArray.COORDINATES;
// lists of points are read from the .quad file into this //array. . .
protected ArrayList coordList; // Holds Point3f
/**
* readVertex reads one vertex's coordinate data
*/
boolean readVertex(QuadFileParser st)
{
http://tailieuhay.com

374

Lp trnh ha trn Java 2D v 3D


Point3f p = new Point3f();
st.getToken();
if(st.ttype == st.TT_EOF)
return false; // reached end of file
p.x = (float)st.nval;
st.getToken();
p.y = (float)st.nval;
st.getToken();
p.z = (float)st.nval;
// Add this vertex to the array
coordList.add(p);
return true;
} // End of readVertex
/**
* readQuad reads four vertices of the correct type (which in this
* version is always just coordinate data).
*/
boolean readQuad(QuadFileParser st)
{
int v;
boolean result = false;
for(v=0; v < 4; v++)
result = readVertex(st);
return result;
} // End of readQuad
/*
* readFile
*
* Read the model data from the file.
http://tailieuhay.com

375

Lp trnh ha trn Java 2D v 3D


*/
void readQuadFile(QuadFileParser st)
{
// verify file type
st.getToken();
if(st.sval.equals("QUAD") || st.sval.equals("POLY"))
fileType = COORDINATE;
else
throw new ParsingErrorException("bad file type: "+st.sval);
// read vertices
while (readQuad(st);
} // End of readFile
} // End of class SimpleQuadObject
// End of file SimpleQuadObject.java
Nu trong chng ta c cc thng tin i km vi mi nh nh mu
sc, ch .. cc thng tin ny cng c luwu trong mt ArrayList.
Nhng thng tin thm vo ny cng oc chuyn sang mng thch
hp trong tng scene.
y l tng thc hin ch yu cng vic ca mt loader. Tip n
l tng Scene, tng khung cnh
Thc hin tng Scene
Tng scene thc thi bi lp SimpleQuadScene.
Cc phng thc lp SimpleQuadScene
Phng thc
SceneBase makeScene()

Nhim v
Nhn d liu t mt ArrayList do
tng di a ln, to ra cc i
tng hnh hc tng ng v a

http://tailieuhay.com

376

Lp trnh ha trn Java 2D v 3D


vo khung cnh ha

Point3f[]

Chuyn i mt ArrayList thnh

objectToPoint3fArray(ArrayList mt mng Point3f, dng phng


in)

thc makeScene() to ra cc i

Scene load(Reader reader)

tng hnh hc
1.Khi to a mt i tng
QuadFileParser
2.Gi QuadFileLoad(scene)
3.Gi makeScene()

class SimpleQuadScene extends SimpleQuadObject


2. {
3. // coordList is converted to an arrays for creating geometry
4. //
5. private Point3f coordArray[] = null;
6.
7. private Point3f[] objectToPoint3fArray(ArrayList inList)
8. {
9. Point3f outList[] = new Point3f[inList.size()];
10.
11. for (int i = 0 ; i < inList.size() ; i++) {
12. outList[i] = (Point3f)inList.get(i);
13. }
14. return outList;
15. } // End of objectToPoint3fArray
16.

http://tailieuhay.com

377

Lp trnh ha trn Java 2D v 3D


17.
18. private SceneBase makeScene()
19. {
20. // Create Scene to pass back
21. SceneBase scene = new SceneBase();
22. BranchGroup group = new BranchGroup();
23. scene.setSceneGroup(group);
24.
25. // the model will be one Shape3D
26. Shape3D shape = new Shape3D();
27.
28. coordArray = objectToPoint3fArray(coordList);
29.
30. QuadArray qa = new QuadArray(coordArray.length, fileType);
31. qa.setCoordinates(0, coordArray);
32.
33. // Put geometry into Shape3d
34. shape.setGeometry(qa);
35.
36. group.addChild(shape);
37. scene.addNamedObject("no name", shape);
38.
39. return scene;
40. } // end of makeScene
41.
42. public Scene load(Reader reader) throws FileNotFoundException,
43. IncorrectFormatException,
44. ParsingErrorException
45. {
http://tailieuhay.com

378

Lp trnh ha trn Java 2D v 3D


46. // QuadFileParser does lexical analysis
47. QuadFileParser st = new QuadFileParser(reader);
48.
49. coordList = new ArrayList();
50.
51. readQuadFile(st);
52.
53. return makeScene();
54. } // End of load(Reader)
55. } // End of class SimpleQuadScene
56. // End of file SimpleQuadScene.java
Thc hin tng File
Tng ny c nhim v thc hin vic giao tip vi File. a s phn
code ca tng ny cng tn t nh tng Object. Lp
SimpleQuadFileLoader tha k lp SimpleQuandScene v thc thi
giao din Loader.
Xy dng mt Loader hon chnh
Trong thc t c rt nhiu thng tin chi tit trong file QUAD m
loader n gin m chng ta va xy dng khng p ng dc. V
d nh nhng k hiu khoa hc trong mt file QUAD, cc thng
tin v mu sc Lp StreamTokenizer chng ta xy dng cha
p ng nhu cu .
Mt file QUAD cso th cha nhng thng tin v b mt, mu sc ..
ca mi nh, mi i tng. nhn c cc thng tin ny
chng ta cn thay i tng Object v tng scene.

http://tailieuhay.com

379

Lp trnh ha trn Java 2D v 3D


Mt file QUAD c th bao gm ni dung ca mt file khc. iu
ny lm tng s phc tp ca loader v i hi vic thay i code
ti tt c cc tng.
Mt loader phc tp hn c th nhn ra v load c mt h cc
nh dng file, v d nh LightWave loader.

Text2D
C hai cch thc hin vic them ch vo trong khung hnh
Java3D. Cch th nht l s dng lp Text2D, cch th hai l s
dng Text3D. S khc nhau ch, lp Text2D thc hin cc dng
ch trong khng gian 2 chiu cn Text3D thc hin trong khng
gian 3 chiu.
i tng Text2D l cc a gic vung trong cc ch c coi
nh l phn b mt. i tuwng Text3D l nhng i tng hnh
hc trong khng gian 3 chiu.
L mt lp con ca lp Shpae3D, th hin ca lp Text2D c th l
con ca i tng group. thm vo dng ch 2D trong Java3D
chng ta cn to ra i tng Text2D sau thm n vo khng
gian ho.
i tng Text2D c thc hin s dng mt a gic v mt
texture.

http://tailieuhay.com

380

Lp trnh ha trn Java 2D v 3D


3.5.1 V d Text2D n gin
Trong v d di y chng ta xem xt vic to ra mt di tng
Text2D n gin. Bao gmg bc to ra i tng Text2D v bc
tip hteo l thm i tng ny vo khng gian ha.
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.Font;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.Text2D;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
// Text2DApp renders a single Text2D object.
public class Text2DApp extends Applet {
public BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
// Create a Text2D leaf node, add it to the scene graph.
Text2D text2D = new Text2D("2D text is a textured polygon",
new Color3f(0.9f, 1.0f, 1.0f),
"Helvetica", 18, Font.ITALIC));
objRoot.addChild(text2D);

3.5.2 Lp Text2D
Lp Text2D l lp tin ch th k t lp Shape3D.
http://tailieuhay.com

381

Lp trnh ha trn Java 2D v 3D

Hm to lp Text2D.
Text2D Constructor Summary
Gi: com.sun.j3d.utils.geometry
Lp Text2D to ra mt khung ch nht c nh x n phn ni dung
text, hin th ni dung text c gi bi ngui dng. Kch thc ca
khung ch nht c xc nh ph thuc vo font c s dng(tham s
ca hm to). Kt qu ca i tng Shape3D trong sut ngoi tr hnh
ch nht cha ni dung text c t ti v tr (0,0,0) ko di theo chiu
dng trc x, trc y
Text2D(java.lang.String

text,

Color3f

color,

java.lang.String

fontName,
int fontSize, int fontStyle)
Trong hm to Text2D ta c th thay i t l kch thoc ca i
tuwng dng ch hin ra so vi kch thc im c nh.
Text2D Method Summary
void setRectangleScaleFactor(float newScaleFactor)

http://tailieuhay.com

382

Lp trnh ha trn Java 2D v 3D


t gi tr t l c s dng trong vic chuyn i chiu rng/chiu di
ca hnh nh sang chiu rng/chiu cao tng ng trong khng gian
ha bt u bng tha s 1/256
void setString(java.lang.String text) <new in 1.2>
Thit lp gi tr dng ch hin th cho i tng Text2D
Text3D
Trong phn ny chng ta tm hiu vn lm vic vi lp Text3D.
Khi to mt i tng Text3D bao gm nhiu cng vic hn trong
i Text2D. trc ht i tng Text3D c to ra bng cch s
dng i tng hnh hc. Bc u tin chng ta phi to ra i
tng Font3D bao gm cc thuc tnh b mt, kch thoc v kch
c ca font. Lp Text3D l lp con ca lp Geometry, nn i
tuwng text3D l mt i tng NodeComponent c tham chiu
bi mt hay nhiu i tuwng Shape3D.
Cc bc to ra i tng Text3D
To mi i tng Font3D t AWTFont
To mi i tng Text3D s dng i tng Font3D, ta c
th ch nh dim tham chiu tu chn
Tham chiu i tng Shape3D, v thm o khng gian
ho
Mt v d Text3D
Cc bc to ra v s dng i tuwng Text3D c minh ho
trong v d sau. Trong i tuwng Font3D to ra vi thuc tnh
kiu b mt l Helvetica, font ch l 10. Sau chng ta to ra
i tng Text3D tham chiu n mt im trong khng gian
ha.

http://tailieuhay.com

383

Lp trnh ha trn Java 2D v 3D


import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.Font;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
// Text3DApp renders a single Text3D object.
public class Text3DApp extends Applet {
public BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
Font3D font3d = new Font3D(new Font("Helvetica", Font.PLAIN, 10),
new FontExtrusion());
Text3D textGeom = new Text3D(font3d, new String("3DText"),
new Point3f(-2.0f, 0.0f, 0.0f));
Shape3D textShape = new Shape3D(textGeom);
objRoot.addChild(textShape);
Chng ta xem hnh di y.

http://tailieuhay.com

384

Lp trnh ha trn Java 2D v 3D


to ra chiu su (th hin bng vng mu ghi) chng ta s dng
cc i tng Material v i tuwng DirectionLight.
Ta c th chiu sng i tng Text3D theo nhiu hng khc
nhau. c th chiu nhiug hng khc nhau chng ta s dng
lp Material.
Mi i tng Text3D c mt im tham chiu. im tham chiu
l s kt hp ca path v alignment ca i tng Text3D.
Trong bng di y cho ta minh ha v s kt hp ny.

Nhng lp lin quan to ra i tng Text3D


Trong phn ny chng ta xem xt nhng lp c lin quan to ra
i tng Text3D.

http://tailieuhay.com

385

Lp trnh ha trn Java 2D v 3D

Lp Text3D bao gm nhiu hm to. Cho php ta to ra i tuwn


Text3D mt cch linh hot.
Text3D Constructor Summary
A Text3D object is a text string that has been converted to 3D geometry.
The Font3D object determines the
appearance of the Text3D NodeComponent object. Each Text3D object
has a position - a reference point placing the
Text3D object. The 3D text can be placed around this position using
different alignments and paths.
Mt i tng Text3D l mt xu k t c chuyn i sang hnh hc
3D. i tng Font3D xc nh b ngoi ca i tng Text3D
NodeComponent
Text3D()
To ra i tng Text3D. Cc gi tr mc nh:
appropriate, are:
font 3D null
string null
position (0,0,0)
alignment ALIGN_FIRST
path PATH_RIGHT
character spacing 0.0

http://tailieuhay.com

386

Lp trnh ha trn Java 2D v 3D


Text3D(Font3D font3D)
To ra i tng Text3D vi i tng Font3D xc nh
Text3D(Font3D font3D, String string)
To ra i tng Text3D vi i tng Font3D xc nh v ni dung
ca xu k t cn hin th
Text3D(Font3D font3D, String string, Point3f position)
To ra i tng Text3D vi c tham s i tng Font3D, xu k t,
ta ca im tham chiu. Mc nh im tham chiu nm v pha bn
doi cng bn tri ca ch cn hin th
Text3D(Font3D font3D, String string, Point3f position,
int alignment, int path)
ALIGN_CENTER Cn l gia.
ALIGN_FIRST alignment: k t u tin ca dng ch c t ta
im tham chiu.
ALIGN_LAST alignment: k t cui cng ca dng ch c t ti
im tham chiu..
Xem thm v d bng trn.
Nhng phng thc ca lp Text3D, gm nhng phng thc
thit lp cc thuc tnh ca i tng Text3D (setXXX), nhng
phng thc ly gi tr cc tuc tnh ca i tng
Text3D(getXXX).

Text3D Method Summary


void setAlignment(int alignment)
t canh l cho i tng Text3D NodeComponent
void setCharacterSpacing(float characterSpacing)

http://tailieuhay.com

387

Lp trnh ha trn Java 2D v 3D


t k t du cch khi to ra i tng Text3D
void setFont3D(Font3D font3d)
Thit lo i tng Font3D c s dng bi i tng Text3D
NodeComponent
void setPath(int path)
t ng dn ca node
void setPosition(Point3f position)
t im tham chiu ca node
void setString(java.lang.String string)
Copies the character string from the supplied parameter into the Text3D
node.
Copy xu k t t tham s u vo cho i tng Text3D node.
Cc ch ca i tng Text3D.
Text3D Capabilities Summary
ALLOW_ALIGNMENT_READ | WRITE Cho php c ghi gi tr
xu k t.
ALLOW_BOUNDING_BOX_READ
ALLOW_CHARACTER_SPACING_READ | WRITE Cho php c
ghi cc k t du cch.
ALLOW_FONT3D_READ | WRITE cho php c ghi thng tin cc
thnh phn Font3D
ALLOW_PATH_READ | WRITE Cho php c ghi gi tr xu ng
dn.
ALLOW_POSITION_READ | WRITE Cho php c ghi gi tr v tr
ca xu

http://tailieuhay.com

388

Lp trnh ha trn Java 2D v 3D


ALLOW_STRING_READ | WRITE Cho php dc ghi i tng xu
k t..
Mi i tng Text3D c to ra t mt i tng Font3D. Mt
i tng Font3D c th c dng to ra nhiu i tng
Text3D khc nhau. Mt i tng Font3D lu cc thng tin v b
dy hnh hc ca i tng Text3D. i tuwonjg Font3D c thu
hi t ng (garbage collected) m khng nh hng n i tng
Text3D s dng chng.
Font3D Constructor Summary
Lp cha: java.lang.Object
Mt i tng Font3D bao gm Java 2D Font v chiu su.
Font3D(java.awt.Font font, FontExtrusion extrudePath)
Font3D(java.awt.Font font, double tessellationTolerance,
FontExtrusion extrudePath) <new in 1.2>
ALLOW_PATH_READ | WRITE Cho php c ghi gi tr ng
dn.
ALLOW_POSITION_READ | WRITE Cho php c ghi gi tr v tr.
ALLOW_STRING_READ | WRITE Cho php c ghi i tng xau
k t.
Lp Font3D khng c nhng phng thc set* c th, vic thit
lp cc thuc tnh ca i tng Font3D c thc hin trong hm
to. Di y l cc phng thc get*.
Font3D Method Summary
void getBoundingBox(int glyphCode, BoundingBox bounds)
java.awt.Font getFont()
Returns the Java 2D Font used to create this Font3D object.

http://tailieuhay.com

389

Lp trnh ha trn Java 2D v 3D


Tr v i tng Java2D Font c s dng to ra i tng Font3D
void getFontExtrusion(FontExtrusion extrudePath)
Copies the FontExtrusion object used to create this Font3D object into
the specified parameter.
Thit lp gi tr i tng FontExtrusion s dng to ra i tng
Font3D

bng

gi

tr

cu

tham

vo.

double

getTessellationTolerance() <new in 1.2>


Lp Font c s dng trong vic t ra i tng Font3D. Ta m t
mt hm to lp Font, cc hm to cn li c th xem thm trong
javadoc.
Font Constructor Summary (partial list)
Gi: java.awt
public Font(String name, int style, int size)
Hm to mi mt i tng Font vi tham s tn Font, kiu, kch c
name - the typeface name. C th l ten logic hoc ten typeface. Mt
tn logic cn phi l m trong cc ga tr:
Dialog, DialogInput, Monospaced, Serif, SansSerif, or Symbol.
style Tham s kiu c th alf m trong cc kiu: BOLD, ITALIC
size - C Font.
Hm to lp FontExtrusion
FontExtrusion Constructor Summary
Lp cha: java.lang.Object
The FontExtrusion object is used to describe the extrusion path for a
Font3D object. The extrusion path is used in

http://tailieuhay.com

390

Lp trnh ha trn Java 2D v 3D


conjunction with a Font2D object. The extrusion path defines the edge
contour of 3D text. This contour is
perpendicular to the face of the text. The extrusion has its origin at the
edge of the glyph with 1.0 being the height of
the tallest glyph. Contour must be monotonic in x. User is responsible
for data sanity and must make sure that
extrusionShape does not cause intersection of adjacent glyphs or within
single glyph. The output is undefined for
extrusions that cause intersections.
FontExtrusion()
Hm to vi gi tr mc nh
FontExtrusion(java.awt.Shape extrusionShape)
Hm to i tng FontExtrusion vi i s shape truyn vo v
tolerance = 0.01
FontExtrusion(java.awt.Shape extrusionShape, <new in 1.2>
double tessellationTolerance)

http://tailieuhay.com

391

Lp trnh ha trn Java 2D v 3D


Cc phng thc lp FontExtrusion
FontExtrusion Method Summary
java.awt.Shape getExtrusionShape()
Gets the FontExtrusion's shape parameter.
void setExtrusionShape(java.awt.Shape extrusionShape)
Sets the FontExtrusion's shape parameter.
double getTessellationTolerance() <new in 1.2>
Return the tessellation tolerance with which this FontExtrusion object
was created.

Nn khng gian ha
Mt cch mc nh, mu nn ca khng gian ha l mu en sm.
Tuy nhin Java3D cung cp cho chng ta kh nng thay i nn ca
khng gian ha, ta c th la chn mu sc, nh, cc i tng hnh
hc hay kt hp cc thnh phn ny li to thnh nn ca khng
gian ha.
Cc bc to ra nn ca khng gian ha:
Khi to mt i tng background mi ch nh mu sc hoc
mt hnh nh no .
Thm vo mt i tng hnh hc (ty chn)
Cung cp mt Application Boundary hoc mt BoundingLeaf
Thm i tng background vo khng gian ha

Mt v d background
Nh ta trnh by phn trc. Mt di tung background c th l
mt mu c th, mt hnh nh hay thm ch mt i tng hnh hc.

http://tailieuhay.com

392

Lp trnh ha trn Java 2D v 3D


tng v d u tin chng ta s xem xt i tng backgrond l mu
trng, v d th hai ta thm mt i tng hinh hc vo background.
V d background l mu nn
Background backg = new Background(1.0f, 1.0f, 1.0f);
//
backg.setApplicationBounds(BoundingSphere());
contentRoot.addChild(backg);
V d background l i tng hnh hc
Background backg = new Background(); //black background
backg.setGeometry(createBackGraph()); // add BranchGroup
of background
backg.setApplicationBounds(new

BoundingSphere(new

Point3d(), 100.0));
objRoot.addChild(backg);
Phng thc createBackGraph() bao gm vic to ra i tng hnh
hc lm nn. Phng thc ny tr v i tng BranchGroup. Ta c
th xem mt v d hon chinh BackgroundApp.java trong th mc
examples/easyContent.

Lp Background

Trong phn ny chng ta xem xt c th thnh phn v hat dng ca


lp background
Lp background tha k lp Leaf, mt th hin ca lp background l
thnh phn con thuc i tng Group

http://tailieuhay.com

393

Lp trnh ha trn Java 2D v 3D

Background c nhiu hm to. Tham s trong hm ta cho bit mu


sc hoc hnh nh cho background.
Hm to ca lp Background
Background Constructor Summary
The Background leaf node defines either a solid background color or a
background image that is used to fill the
window at the beginning of each new frame. It optionally allows
background geometry to be referenced.
Background geometry must be pre-tessellated onto a unit sphere and is
drawn at infinity. It also specifies an
application region in which this background is active.
Background()
Constructs a Background node with a default color (black).
Background(Color3f color)
Constructs a Background node with the specified color.
Background(float r, float g, float b)
Constructs a Background node with the specified color.
Background(ImageComponent2D image)
Constructs a Background node with the specified image.

Cc phng thc trong lp background


http://tailieuhay.com

394

Lp trnh ha trn Java 2D v 3D

Background Method Summary


void setApplicationBoundingLeaf(BoundingLeaf region)
Set the Background's application region to the specified bounding leaf.
void setApplicationBounds(Bounds region)
Set the Background's application region to the specified bounds.
void setColor(Color3f color)
Sets the background color to the specified color.
void setColor(float r, float g, float b)
Sets the background color to the specified color.
void setGeometry(BranchGroup branch)
Sets the background geometry to the specified BranchGroup node.
void setImage(ImageComponent2D image)
Sets the background image to the specified image.
Cc tham s cu hnh khc ca i tng Background
Background Capabilities Summary
ALLOW_APPLICATION_BOUNDS_READ | WRITE allow read
(write) access to its application bounds
ALLOW_COLOR_READ | WRITE allow read (write) access to its
color
ALLOW_GEOMETRY_READ | WRITE allow read (write) access to
its background geometry
ALLOW_IMAGE_READ | WRITE allow read (write) access to its
image
3.8 D liu ngi dng:
Cc i tng SceneGraphObject c th tham chiu n bt c i
tng no nh l cc d liu ngi dng. Danh sch lp con ca lp

http://tailieuhay.com

395

Lp trnh ha trn Java 2D v 3D


SceneGraphObject gm c: Appearance, Background, Behaviour,
BranchGroup, Geometry, Lights, Shape3D v TransformGroup.
Ly v d, mt ng dng c th c nhiu i tng c kh nng tng
tc, di chuyn. Mi i tng c th c th cha nhng d liu dng
text trong i tng d liu ngi dng.
Cc phng thc lp SceneGraphObject
SceneGraphObject Methods (Partial List - User Data Methods)
SceneGraphObject is a common superclass for all scene graph
component objects. This includes Node, Geometry,
Appearance, etc.
java.lang.Object getUserData()
Retrieves the userData field from this scene graph object.
void setUserData(java.lang.Object userData)
Sets the userData field associated with this scene graph object.

http://tailieuhay.com

396

Lp trnh ha trn Java 2D v 3D

CHNG 4
TNG TC

Trong chng ta s tm hiu v cc vn sau:

Tm hiu lp Behaviour, lp c s cho vic thc hin tng tc v


xy dng hot hnh

Xy dng mt lp Behaviour

Phi hp cc i tng Behaviour vo trong th gii o thc


hin tong tc

S dng lp tin ch x l bn phm


S dng lp tin ch x l chut
S lp lp tic ch picking
Trong cc chng trc chng ta a xem xt vic lp trnh Java3D mt
cch hon ton tnh. Tuy nhin iu th v cu Java3D cn nm vec lp
trnh tng tc v hot hnh.
Tng tc l khi cc hnh nh thay i phn ng li hnh ng cu ngi
dng. Hot hnh l nhng thay i ca hnh nh m khng cn s tng
tc trc tip ca con ngi. Trong Java3D, c tng tc v hot hnh u
s dng lp Behaviour. Chng ta s xem xt lp ny chi tit hn trong
cc mc cha chuwong ny.

http://tailieuhay.com

397

Lp trnh ha trn Java 2D v 3D


4.1 Hnh vi: C s ca tng tc v hot hnh
C tong tc v hot hnh u s dng i tng Behaviour. Lp
Behaviour l mt lp c s tru tng, cung cp cc k thut thay i
th khung cnh. Lp Behaviour v cc lp dn xut, lin kt vi phn
m ca ngi pht trin cung cp nhm lm thay i hnh nh, m thanh
trong khng gian o. i tng Behaviour trong mt th khung cnh
c nhim v thy i th khung cnh, hay phn ng li cc kch thch.
Mt kch thch, hay tc ng c th l vic n mt phm, di chuyn chut,
s va chm gia cc i tng Nhng tc ng ny c th thm vo
cc i tng trong th khung cnh hay loi b c i tng trong
th khung cnh, thay i thuc tnh ca i tng, sp li li cc i
tng
4.1.1 ng dng ca hnh vi
Trong bng di y chng ta s lit k nhng kh nng c th ca
lp Behaviour, lit k nhng tc nhn t ct bn tri xung pha di, v
nhng thay i nm trn dng u. Chng ta ch lit ke nhng kh nng
n gin cu Behaviour ch khng lit k y tt c cc kh nng c
th ca Behaviour. Mt vi s kt hp gi cc tc nhn v cc thay i
ch c ngha trong nhng trng hp c bi, chng ta gi l ng dng
c th.

Tc nhn TransformGroup

Geometry

Ngi

ng dng c ng

Tng tc

dng
S
chm

th
va i
quan

http://tailieuhay.com

SceneGraph Vie w

c th

dng Di
chuyn

tng

trc i

tng i

tng Th

thay

i trc

quan xut

hin hin
398

Lp trnh ha trn Java 2D v 3D


hng hay v tr

thay i b trong cc va nhng


noi

trong chm

thay i

cc va chm

trong va
chm

Thi
gian
Khung

Hot hnh
Bng

nhn

Hot hnh

Hot hnh

Tn cc chi ng
tit
(LOD)

c th

Hot

hnh
dng ng
dng c
th

Bmg trn chng ta ch lit k nhng trun hp n gin nhng kh


nng ca lp Behaviour. Picking c thc thi s dng cc hnh vi
nhng khng c li k trn.
Nhng s vt ngoi t nhin, nh mt ci cy, bao gm mt s lng
rt ln cc i tng hnh hc c th hin mt cch chnh xc nh la,
cnh .Mt phng php khc c s dng l s dng kt cu a gic
thay cho cc i tng hnh hc.
K thut trn (texture polygon) thng c gi l billboard
approach. iu ny l hp l v ng n khi mt hnh vi c s dng
t ng nh hng textured polygon trc giao vi khung nhn, trong
ch c b mt cu kt cu a din c nhn thy. Hnh vi nh hnggi
l billboard behavior.
Hng tip cn billboard thc s hiu qu khi i tng c biu
din bi texture c khong cch xa v vy cc phn c lp khc ca i
tng trc quan c biu din bi texture s kh khn. Ly v d biu
din mt ci cy, nu khung nhn l rt xa khng kh nng nhn mt
cch r rng v ni bt cnh cy, khi s l rt v l v ph phm khi
tn b nh v cng vic x l bi din tng chic l. K thut ny

http://tailieuhay.com

399

Lp trnh ha trn Java 2D v 3D


c khuyn khch s dng trong cc ng dng yu cu th hin cc i
tng trc quan khong cch xa.
Hnh vi LOD (level of detail) c nh ng ng dng lin quan. Vi
LOD, cc i tng trc quan c biu din bi rt nhiu i tng trc
quan khc nh hn, chi tit hn. Khi khung nhn (viewer) cng gn cc
chi tit c th hin cng r v khi khung nhn xa, cc i tng trc
quan c biu din t chi tit hn. Behaviour LOD t ng chuyn i
cc ch trnh din da vo khong cch gia i tng vi viewer.
C billboard v LOD u tng ng vi cc lp dn xut t lp
Behaviour

4.1.2 Tng quan lp Behaviour


Trong bng 4-1, ch r s chuyn mn ho ca Behaviour trong
Java3D API v cc gi tin ch. Trong phn ny chng ta s ln lt xem
xt tng lp trong bng 4-1.
4.2 C bn v hnh vi
Nh cp trong cc phn trc, lp Behaviour c s dng
nhiu trong cc ng dng Java3D theo nhiu cch khc nhau.Vic tm
hiu hot ng v lp trnh vi lp Behaviour l iu rt quan trng.
Trong mc ny chng ta s tm hiu lp Behaviour, a ra cch thc
to ra mt lp Behaviour

ca ring mnh v mt v s dng lp

Behaviour.

http://tailieuhay.com

400

Lp trnh ha trn Java 2D v 3D

S cc lp con ca lp Behaviour
4.2.1 Vit mt lp Behaviour
Trong phn ny chng ta s tm hiu cch vit mt lp
Behaviour.Mechanics ca Behaviours
Mt lp Behaviour thc thi qu trnh khi to v phng thc
processStimulus ca lp c s tru tng Behaviour. Ngoi ra mt lp
Behaviour t xy dng cng c t nht mt hm to v c cc phng
thc khc ca ring n.
Cc Behaviour thng qua cc i tng ho, s hnh ng trong
mt th khung cnh nhm tc ng n hnh vi. i tng Behaviour
cn mt tham chiu n i tng c s thay i, n c kh nng to
ra nhng hnh vi thay i.
Trong hm to, c th thit lp tham chiu n i tng trong s
thay i. Nu khng, tng mt phng thc khc cu lp Behaviour t
xy dng phi cha nhng thng tin ny, qu trnh tham chiu phi c
thc hin ti thi im th khung cnh c to ra.

http://tailieuhay.com

401

Lp trnh ha trn Java 2D v 3D


Qu trnh khi to c gi n khi th khung cnh cha lp
Behaviour c to ra.
Phng thc khi to c trch nhim ci t nhng trigger ban u
bt cc s kin ca Behaviour v ci t nhng iu kin ban u cho
cc d liu tnh ca i tng Behaviour.
Cc triggger thc cht l cc i tng WakeupCondition (cc iu
kin thc dy), hay l s kt hp ca cc WakeupCondition . Phng
thc processStimulus c gi khi cc trigger c kch hot. Phng
thc processStimulus c trach nhim bt v x l cc s kin xy ra.
Nhiu s kin c th c th c m ho trong mt i tng
WakeupCondition (nhiu loi kch hot ca bn phm c th c m
ho trong WakeupOnAWTEvent), n bao gm c vic gii m cc s
kin.
Phng thc processStimulus phn x li cc tc nhn, thng l s
thay i ca cc i tng, trong nhng iu kin thch hp, thit lp li
cc trigger.
Tip theo chng ta xem xt cc bc vit mt lp Behaviour cho ring
mnh.
Vit hm to, cha tham chiu n i tng trong s thay i
Vit hm khi to public void initialization(),ch nh cc tiu
chun kch hot ban u (trigger)
Vit hm public void processStimulus(), gii m iu kin xy ra
hnh ng ca trigger, reset li trigger nu cn thit.
Cc bc trn l cc thc chng ta to ra cc lp Behaviour n gan,
nhng Behaviour phc tp i hi phi lp trnh x l nhiu bc hn.
Chng ta xem xt v d di y, c thc hin theo cc bc
nu trn
V d xy dng lp Behaviour : SimpleBehaviour
http://tailieuhay.com

402

Lp trnh ha trn Java 2D v 3D

Trong v d di y chng ta xy dng mt lp Behaviour thc hin


mt hnh vi n gin, lm quay mt s th di s iu khin bang bn
phm. xy dng mt lp Behaviour nh vy, chng ta cn mt tham
chiu n mt TransformGroup (i tng cha, chu s thay i) v
mt bin gc nghing. Di s kch hot ca bn phm, goc nghing s
thay i v gc nghing ca TransformGroup c thit lp bng vi
gi tr mi ca gc nghing ny. Khi vic quay i tng
TransformGroup khng cn l vn kh khn na.
to ra lp Behaviour ny, chng ta ch cn lp trnh theo cc
buwc nu trn. Hm to s cha tham chiu n i tng
TransformGroup ca s thay i. Phng thc initialization thit lp c
thng s trigger ban u theo s kin WakeOnAWTEvent s kin, v
thit lp gc nghing bng 0. Nh cp phn trn, tc nhn ca mt
Behaviour c coi nh mt i tng WakeupCondition . Trong phn
4.3 chngs ta s xem xt lp WakeupCondition . Phng thc
processStimulus s gii m phm bm c th xc nh c phm hay
t hp phm no c n. Phng thc processStimulus thuwng xuyn
tng bin gc nghing ln, t ta c th iu chnh s thay i cu i
tng TransformGroup mt cch thch hp. Cng vic cui cng ca
phng thc processStimulus l thit lp li cc trigger.
Trong v d ny, trigger lun lun c thit lp li di tc ng ca
phm bm. Behaviour c th thay i cc trigger ca mnh thm ch trong
sut thi gian hot ng cu Behaviour thay i cc hnh vi.
Trong v d di y gi java.awt.event dng x l tng tc vi
bn phm. Gi java.util.enumeration

cn thit gii m i tng

WakeuponCondition

http://tailieuhay.com

403

Lp trnh ha trn Java 2D v 3D


// SimpleBehaviorApp renders a single, rotated
cube.
public class SimpleBehaviorApp extends Applet {
public class SimpleBehavior extends Behavior
{
private TransformGroup targetTG;
private

Transform3D

rotation

new

Transform3D();
private double angle = 0.0;
// create SimpleBehavior - set TG object
of change
SimpleBehavior(TransformGroup

targetTG)

{
this.targetTG = targetTG;
}
// initialize the Behavior
// set initial wakeup condition
// called when behavior becomes live
public void initialize() {
// set initial wakeup condition
this.wakeupOn(new
WakeupOnAWTEvent(KeyEvent.KEY_PRESSED));
}

http://tailieuhay.com

404

Lp trnh ha trn Java 2D v 3D


// called by Java 3D when appropriate
stimulus occurs
public

void

processStimulus(Enumeration

criteria) {
// do what is necessary in response
to stimulus
angle += 0.1;
rotation.rotY(angle);
targetTG.setTransform(rotation);
this.wakeupOn(new
WakeupOnAWTEvent(KeyEvent.KEY_PRESSED));
}
}
}// end of class SimpleBehavior
Lp SimpleBehaviourApp ch thc hin nhng chc nng chnh cn
thit ca mt Behaviour n gin. Chungs ta c th pht trin thm cc
chc nng phong ph hn, v d ta c th xet gc quay ca trc quay c
th c thay i bi cc phng thc ca lp.
Mt im pht trin nng cp l khc phc hin tng trn ca gc
nghing.
Nhng sai lm trong vic vit mt lp Behaviour

Qun vic thit lp v reset li Behaviour trigger

Khng tr v t phng thc ca lp Behaviour

Mt iu hin nhin l nu khng thit lp trigger th hnh vi s khng th


thc hin c. Ngoi ra trigger cng cn phi c reset trc khi hnh
ng tip theo lp li.
Khi c hai phng thc initilization v processStimulus c gi bi
h thng Java3D, cc hm ny phi tr v cho php vic t trt c

http://tailieuhay.com

405

Lp trnh ha trn Java 2D v 3D


tip tc. Ly v d, khi hnh vi quay trn c gi, gc quay v i tng
TransformGroup cn c cp nht mt cch nh k.

4.2.2 S dng mt lp Behaviour

Trong phn ny chng ta s tm hiu vic thm vo hnh vi cu i


tng trong chng trnh.
Bc du tin thm vo hnh vi bao gm vic chc chn th
khung cnh c s d tr cho hnh vi. V d, s dng c lp
SimpleBehaviourApp trong phn trn , trong th khung cnh phi c
cha i tng TransformGroup c chun b quay. Rt nhiu
Behaviour ch cn mt i tng TransformGroup, trong khi th
khung cnh i hi mt Behaviour l ng dng v Behaviour ph thuc.
Thit lp s h tr cu mt Behaviour, mt th hin ca lp
Behaviour phi c thm vo th khung cnh.Trong thc t mt i
tng Behaviour khng phi l mt phn ca th khung cnh v s tr
thnh rc v c dn dp bi garbage collection.
Bc cui cng thm vo mt Behaviour l cung cp mt khung
lch cho Behaviour. nng cp lm vic hiu qu hn, Java3D s dng
khung lch thc hin execution culling.Bhv ch tr n n active khi
khung lch ca n giao vi s hot ng ca ViewPlatform. Ch c nhng
Behaviour active mi c kh nng nhn c cc tc nhn kch thch.
Trong trng hp , cc tc nhn c th b mt s Behaviour b
qua.Ngi lp trnh cn qun l s chn lc trong sut qu trnh chn la
lch ca cc Behaviour.
Cc bc s dng mt Behaviour
1.Chun b th khung cnh

http://tailieuhay.com

406

Lp trnh ha trn Java 2D v 3D


2.Them Behaviour vo th khung cnh, tham chiu dn i
tng cn chuyn ng, thay i
3.Xc nh mt khung lch (SchedulingBoundingLeaf)
4.c v ghi cc kh nng cho i tng ch
V d di y m t cc bc s dng mt Behaviour nh trnh
by trn

public BranchGroup createSceneGraph() {


// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
TransformGroup

objRotate

new

TransformGroup();

objRotate.setCapability(TransformGroup.ALLOW_TRA
NSFORM_WRITE);
objRoot.addChild(objRotate);
objRotate.addChild(new ColorCube(0.4));
SimpleBehavior myRotationBehavior = new
SimpleBehavior(objRotate);
myRotationBehavior.setSchedulingBounds(new
BoundingSphere());
objRoot.addChild(myRotationBehavior);
// Let Java 3D perform optimizations on
this scene graph.

http://tailieuhay.com

407

Lp trnh ha trn Java 2D v 3D


objRoot.compile();
return objRoot;
}

Hnh trn m t mi quan h gia i tng Behaviour v i tng


chu s thay i. i tng TransformGroup. V d ca chng ta nhm
thc hin quay mt ColorCube, nhng lp Behaviour khng ch gioi
hn nh vy , ta c th quay bt k i tng no l con ca i tng
TransformGroup. V d trn ch c dnh l im khi u cho qu tnhf
lm vic vi Behaviour, ch khng c nh thc hin nhng kh nng
c th ca Behaviour.
Nhng sai lm trong vic s dng i tng Behaviour
Trong ba bc s dng lp Behaviour , hai bc thuwng gy nhm
ln sai st:
Khng ch nh khung lch

Khng thm i tng Behaviour vo trong th khung cnh

Mt iu ch l chng ta nn ch hn ch vic to lch cho mi i


tng Behaviour cng t cng tt m bo cho hiu nng ca ton h
thng.
t i tng Behaviour vo th khung cnh
Behaviour c th c thm vo bt c au trong th khung cnh.
Tiu ch la chn v tr thm i tng Behaviour vo th khung cnh
ph thuc vo cc yu t: hiu qu ca vec t lch, bo tr code.
http://tailieuhay.com

408

Lp trnh ha trn Java 2D v 3D


Trong th khung cnh to bi SimpleBehaviourApp, i tng
SimpleBehaviour v i tng ColorCube khong nm trong cng mt h
ta a phng.
i tng TransformGroup ch c tc dng quay i tng
ColorCube v vy khung lch ca di myRotationBehaviour lun nh km
i tng ColorCube cho php vic tng tc vi i tng ColorCube
khi n visible. D sao, nu i tng TransformGroup c dng
bic dch i tng ColorCube, khi d i tng ColorCube c th b
dch chuyn ra ngoi ca khung nhn. Khi i tng bound nm trong
th khung cnh cng vi i tng Behaviour, ngi dng c th c kh
nng tip tc bin dch i tng .
Min l s kch hot qu view vn giao vi kung lch ca i tng
Behaviour, lc i tng Behaviour vn cn active.
Chng ta c th tng tc vi i tng trc quan khng nm trong
view.Vn l nu nh lc o view thay i v khng cn giao vi
khung k hoch ca ca i tng Behaviour , khi i tng
Behaviour l khng active. Nh vy khi i tng chng ta mun
tng tc c th vn anm trng view nhng khng active. C hai gii
php cho vn ny. Mt l chng ta thay i th khung cnh vn
gi c khung lch ca i tng Behaviour vi i tng trc quan.
iu ny c th thc hin c trn vn theo hnh di y. Phng
php th hai l s dng i tng BoundingLeaf cho khung lch. Chng
ta s xem xt lp BoundingLeaf ny trong phn 3.7

http://tailieuhay.com

409

Lp trnh ha trn Java 2D v 3D

Nhng ch khi xy dng lp Behaviour


iu cn ch khi vit mt Behaviour l hiu nng ca h thng.
Mt Behaviour khng tt s lm gim hiu nng ca qu trnh t
trt.chc nng. Mt iu cn ch khi vit mt Behaviour l: memory
burnv nhng trigger iu kin khng cn thit.
Memory burn l thut ng dng ch vic to ra nhng i tng
khng cn thit tng Java. Vic s dng b nh qu mc ,s nh huwng
n qu trnh garbage collection v qu trnh trt s b dng li. Cc
phng thc ca lp Behaviour thuwng gy ra vn memmory burn.
V d nh on m tng 4-1, phng thc processStimulus s dng ton
t new trong qu tr nh g i wakeupOn. i u n y khi n cho m t i
tng mi c to ra mi khi phng thc ny c gi, i tng ny
tr thnh rc mi ln Behaviour c kch hot.
Tuy nhin vic xc nh v trnh xy ra memmory burn thng kh
d dng.
V d trong on code 4-3, thay bng vic khi to mt i tng mi,
chng ta s s dng li i tng c. Trong phn ny chng ta xem xt
kh nng thit lp cc iu kin trigger nhm kch hoc cc Behaviour
trong mi khung ca qu trnh t trt. Nu nh khng c tc nhn g kch
hot Behaviour, s l khng cn thit nu chng ta gi n phng thc
processStimulus.

http://tailieuhay.com

410

Lp trnh ha trn Java 2D v 3D


4.2.3 Cc hm API trong lp Behaviour
Trong phn ny chng ta s tm hiu chi tit v cc hm API ca lp
Behaviour.
L mt lp c s tru tng, lp Behaviour cn c tha k trc khi
khi to mt i tng Behaviour.
Trong gi tin ch ca Java3D c sn rt nhiu cc lp Behaviour.
l cc lp con ca Leaf, th hin ca mt lp tha k lp Behaviour l
con ca mt nhm trong th khung cnh.

Cc phng thc processStimulus v initialization cung cp mt gao


din chng Java3D c th hp tc cc Behaviours trong khng gian
o. Cc phng thc khc ca lp Behaviour c trnh by trong bng
di y. Phng thc wakeOn c dng trong hai phng thc
initialization v processStimulus thit lp trigger cho Behaviour.Tham
s u vo ca phng thc ny l i tng WakeupCondition . Lp
WakeupCondition v cc lp lin quan s c trnh by trong phn
4.3.
Phng thc postId cho php mt Behaviour c th giao tip vi cc
phng

thc

khc.

trong

nhng

iu

kin

wakeup

WakeupOnBehaviorPost. i tng Behaviour c th s dng phng


http://tailieuhay.com

411

Lp trnh ha trn Java 2D v 3D


thc postId to ra s cng tc vi iu kin WakeupOnBehaviorPost
thch hp. Chng ta xem xem xt lp akeupOnBehaviorPost chi tit hn
trong mc 4-16.
Phng thc setEnable chung cp mt cch thc v hiu ho mt
Behaviour thm ch ngay c khi bounds lm cho n active. Gi tr mc
nh l true (i tng Behaviour c enable)
Mt i tng Behaviour ch active khi khung t lch ca n giao
vi qu tnh hat ng ca view.Tng mt khng gian o, chng ta c th
c nhiu view, mt Behaviour c th c active bi nhiu view.
Phng thc getView rt hiu qu vi Behaviour da trn thng tin
ca mi View (BillBoard, LOD..) v i vi nhng Behaviour ni chung
chung. Phng thc ny tr v tham chiu ti i tng View chnh hin
ang c kt hp vi Behaviour . Chng ta khng c phng thc
setView.
i tng View chnh c nh ngha l i tng View u tin
c gn km vi ViewPlatform, nu chng ta c nhiu View active.
V vy mt hnh vi Billboard pah hng ti view chnh, trong trng
hp c nhiu view trong cng mt th khung cnh.
Cc hm API ca ViewPlatform
Cc Behaviour ch active (c kh nng kch hot c) ch khi khung
lch ca n giao vi qu trnh hot ng ca ViewPlatform .
Behavior Method Summary
Behavior is an abstract class that contains the framework for all
behavioral components in Java 3D.
View getView()
Returns the primary view associated with this behavior.
void initialize()
Initialize this behavior.
http://tailieuhay.com

412

Lp trnh ha trn Java 2D v 3D


void postId(int postId)
Post the specified Id.
void processStimulus(java.util.Enumeration criteria)
Process a stimulus meant for this behavior.
void setEnable(boolean state)
Enables or disables this Behavior.
void setSchedulingBoundingLeaf(BoundingLeaf region)
Set the Behavior's scheduling region to the specified bounding leaf.
void setSchedulingBounds(Bounds region)
Set the Behavior's scheduling region to the specified bounds.
void wakeupOn(WakeupCondition criteria)

ViewPlatform Method Summary (partial list)


These methods of the ViewPlatform class get and set the activation
volume (sphere) radius. Default activation radius
= 62.
float getActivationRadius()
Get the ViewPlatform's activation radius.
void setActivationRadius(float activationRadius)
Set the ViewPlatform's activation radius which defines an activation
volume around the view platform.
4.3 iu kin kch hot: Cch kch hot cc hnh vi
Nhng active Behaviour c kch hot bi s kin ca mt hay
nhiu tc nhn kch hot. tc nhn kch hot. Tc nhn wakeup cho mt
Behaviour c xc nh s dng lp con ca lp WakeupCondition .
Lp c s tru tng, l c s ca tt c cc lp wakeup trong
Java3D. C 5 lp tha k lp WakeupCondition , mt trong s d l lp

http://tailieuhay.com

413

Lp trnh ha trn Java 2D v 3D


c s tru tng WakeupCriterion, cc lp cn li kt hp nhiU iu
kin wakeup trong mt iu kin wakeup duy nht.

Mt iu kin wakeup ca mt i tng Behaviour c xc nh


nh l s kt hp ca cc iu khin khc s dng lp kt hp wakeup
thch hp. Phn tip theo chng ta m t lp WakeupCondition v cc
lp con ca n.

4.3.1 iu kin kch hot

Lp WakeupCondition cung cp hai phng thc.Phng thc u


tin, allElements, tr v danh sch lit k cc tc nhn wakeup ca i
tng WakeupCondition . Phng thc cn li, triggeredElements, li t
k nh ng t c nh n wakeup c th kch hot Behaviour. Phng thc
ny c th rt hu hiu trong phng thc processStimulus.
WakeupCondition Method Summary

http://tailieuhay.com

414

Lp trnh ha trn Java 2D v 3D


The WakeupCondition

abstract class is the base for all wakeup

classes. It provides the following two methods.


Enumeration allElements()
Returns an enumeration of all WakeupCriterion objects in this
Condition.
Enumeration triggeredElements()
Returns an enumeration of all triggered WakeupCriterion objects in
this Condition.
4.3.2 WakeupCriterion
WakeupCriterion l phng thc tru tng cho php 14 quy nh
lp tc nhn wakeup. WakeupCondition ch cung cp mt phng thc
duy nht: hasTriggered. Chng ta khng cn thit phi s dng phng
thc ny, v phng thc triggeredElements ca lp WakeupCondition
thc hin iu ny h chng ta.
WakeupCriterion Method Summary
boolean hasTriggered()
Returns true if this criterion triggered the wakeup.

4.3.3 Quy nh lp WakeupCriterion


Trong bng 4-2 a ra quy nh 14 lp WakeupCriterion. Nhng
lp ny c s dng xc nh nhng iu kin wakup cho i tng
Behaviour. Th hin ca nhng lp ny c s dng mt cch c lp
hay trong vic s dng kt hp cc iu kin wakeup trong cc lp ni
trong mc trc.
Chng ta s xem xt chi tit cc lp ny trong ngay sau y. C
nhng lp ch gm nhng hm API n gin, lp WakeupOnActivation

http://tailieuhay.com

415

Lp trnh ha trn Java 2D v 3D


ch c mt hm to duy nht. Tham s khung lch ca cc iu kin
wakeup c ch nh trong i tng Behaviour tng ng.
Nhng ch xung quanh WakeupCriterion
Mt s lp WakeupCriterion c kch hot ngay trong first
detection ca mt s kin. u ny c ngha l tc nhn s ch mt ln
kch hot bi s kin. V d i tng WakeupOnActivation s kch hot
s giao nhau gia qu trnh vn ng ca ViewPlatform v vng kung
lch ca i tng Behaviour. Khi s giao nhau ny vn cn,
WakeupCondition s khng kch hot thm mt no na. Iu tng t
cng ng vi mt dy cc frame sau cho n khi Java3D nhn bit
c s thay i qu trnh giao nhau, th WakeupCondition mi c th
kch hot ln tip theo.
Ta c nhng lp WakeupCriterion theo tn cp (Entry/Exit hay
Activation/ Deactivation). Nhng nhn t ny ch kch hot mt cch xen
k gia tung cp Entry hoc Activation.
WakeupOnActivation
Nu khung lch giao vi qu trnh active ca ViewPlatform trong mt
thi gian ngn th rt c th l n khng c nhn ra. Khi c
Acivation v Deactivation u khong c kch hot. trong nhng trng
hp nh vy, Behaviour s khng tr nn active.
WakeupOnActivation Constructor Summary
extends: WakeupCriterion
Class specifying a wakeup on first detection of a ViewPlatform's
activation volume intersection with this object's
scheduling

region.

WakeupOnActivation

is

paired

with

WakeupOnDeactivation which appears on page 4-21.


http://tailieuhay.com

416

Lp trnh ha trn Java 2D v 3D


WakeupOnActivation()
Constructs a new WakeupOnActivation criterion.
WakeupOnAWTEvent
Nhiu lp WakeupCriterion thc hin kch hot trong nhng hm
to v cc phng thc mt cch ph thuc.
V d WakeupOnAWTEvent c 2 hm to v mt phng thc. Hm
to cho php xc nh cc s kin AWT nht nh bng cch s dng cc
hn ca lp AWT. Phng thc cn li tr v mng cc s kin AWT lin
tc nhau c kch hot bi trigger/
WakeupOnAWTEvent Constructor Summary
Tha k: WakeupCriterion
Lp xc nh mt Behaviour c kch hot bi mt s kin AWT
WakeupOnAWTEvent(int AWTId)
Khi to mt i tng WakeupOnAWTEvent mi, trong AWTId l
mt trong cc hng s
KeyEvent.KEY_TYPED,
KeyEvent.KEY_PRESSED,

KeyEvent.KEY_RELEASED,

MouseEvent.MOUSE_CLICKED,
MouseEvent.MOUSE_PRESSED, MouseEvent.MOUSE_RELEASED,
MouseEvent.MOUSE_MOVED,
MouseEvent.MOUSE_DRAGGED, or one of many other event values.
WakeupOnAWTEvent(long eventMask)
Khi to mt i tng WakeupOnAWTEvent s dng ORed
EVENT_MASK,v AWT EVENT_MASK vi cc gi tr:
:

KEY_EVENT_MASK,

MOUSE_EVENT_MASK,

MOUSE_MOTION_EVENT_MASK, hoc cc gi tr khc.

http://tailieuhay.com

417

Lp trnh ha trn Java 2D v 3D


WakeupOnAWTEvent Method Summary
AWTEvent[] getAWTEvent()
Tr v mt mng cc s kin AWT lin tip, nhng s kin kch hot
lp WakeupOnAWTEvent .
WakeupOnBehaviorPost
Lp WakeupOnBehaviorPost cng vi phng thc the postID ca
lp Behavior cung cp mt k thut qua mt hnh vi c th c thc
hin.Mt i tng Behavior c th post a ra mt gi tri ID (kiu s
nguyn). Cc Behaviour khc c th xc nh c iu kin kch hot
ca n, s dng ID ca mt Behaviour xc nh. iu ny cho php
chng ta c th to ra mt Behaviour m ca ra vo, v mt Behaviour
khc ng ca. Vi cch thc nh vy ngay c nhng Behaviour phc
tp chng ta c th xy dng mt cch tng t nh vy, kt hp
Behaviour vi post ID.

WakeupOnBehaviorPost Constructor Summary


Tha k: WakeupCriterion
Lp xc nh mt Behaviour c kch hot khi mt i tng
Behaviour khc a ra mt s kin
WakeupOnBehaviorPost(Behavior behavior, int postId)
Khi to mt i tng WakeupOnBehaviorPost

Do

WakeupCondition

th

cha

nhiu

tng

WakeupCriterion, bao gm nhiu hn 1 WakeupOnBehaviorPost,

http://tailieuhay.com

418

Lp trnh ha trn Java 2D v 3D


phng thc xc nh r cc triggering post can thit cho s kin
trigger.
WakeupOnBehaviorPost Method Summary
Behavior getBehavior()
Tr v Behaviour xc nh c thit lp trong hm to ca i tng
int getPostId()
Nhn postId xc nh ca WakeupCriterion
Behavior getTriggeringBehavior()
Tr v behavior c kch hot bng tc nhn.
int getTriggeringPostId()
Tr v thng tin postId kch hot Behaviour
on code di y ca mt chuwong trnh n gin s dng
Behaviour posting hp tc cc Behaviour. V d m v ng ca ra
vo. ng dng bao gm mt lp: OpenBehaviour, v an code to ra
hai i tng Behaviour. i tng th hai l th hin ca
CloseBehaviour, hon ton ginh ht OpenBehaviour. Trong lp
CloseBehaviour, iu kin tro i trong phng thc initialization (v
Behaviour ngc li c thc hin)
public class OpenBehavior extends Behavior {
private TransformGroup targetTG;
private

WakeupCriterion

pairPostCondition;
private WakeupCriterion wakeupNextFrame;
http://tailieuhay.com

419

Lp trnh ha trn Java 2D v 3D

private

WakeupCriterion

AWTEventCondition;
private

Transform3D

t3D

new

rotMat

new

Transform3D();
private

Matrix3d

Matrix3d();
private double doorAngle;
OpenBehavior(TransformGroup targetTG) {
this.targetTG = targetTG;
AWTEventCondition

new

WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
wakeupNextFrame

new

WakeupOnElapsedFrames(0);
}
public

void

setBehaviorObjectPartner(Behavior behaviorObject)
{
pairPostCondition

new

WakeupOnBehaviorPost(behaviorObject, 1);
}
public void initialize() {
this.wakeupOn(AWTEventCondition);

http://tailieuhay.com

420

Lp trnh ha trn Java 2D v 3D


doorAngle = 0.0;
}
public

void

processStimulus(Enumeration

criteria) {
if
(criteria.nextElement().equals(pairPostCondition)
) {
System.out.println("ready

to

open door");
this.wakeupOn(AWTEventCondition);
doorAngle = 0.0f;
} else { // could be KeyPress or
nextFrame, in either case: open
if (doorAngle < 1.6) {
doorAngle += 0.1;
if (doorAngle > 1.6)
doorAngle = 1.6;
//

get

rotation

and

scale

portion of transform
targetTG.getTransform(t3D);
t3D.getRotationScale(rotMat);
//

set

y-axis

rotation

to

doorAngle
// (clobber any previous yrotation, x and z scale)

http://tailieuhay.com

421

Lp trnh ha trn Java 2D v 3D


rotMat.m00

Math.cos(doorAngle);
rotMat.m22 = rotMat.m00;
rotMat.m02

Math.sin(doorAngle);
rotMat.m20 = -rotMat.m02;
t3D.setRotation(rotMat);
targetTG.setTransform(t3D);
this.wakeupOn(wakeupNextFrame);
}

else

//

finished

opening

door, signal other behavior


System.out.println("door

is

open");
this.wakeupOn(pairPostCondition);
postId(1);
}
}
}
} // end of class OpenBehavior
Code 4-4: S dng lp OpenBehaviour v CloseBehaviour
i tng ca hai lp ny s thay phin nhau phn hi vi tc nhn
phm bm.i tng open behavior s tr li li kch hot phm bm u
tin ng thi n nh du cho i tng close Behaviour bit v thit
lp iu kin trigger ca n c th oc i tng close Behaviour
nhn bit.i tng open behavior m ca tr li li tc nhn phm

http://tailieuhay.com

422

Lp trnh ha trn Java 2D v 3D


bm.i tng close behavior thit lp trigger ca n nh l mt phm
bm tr li li tn hiu t i tng open Behaviour
Phm bm tip theo kch hot i tng close. i tng close lc o
s thc hin chc nng tng t i tng open : gi n mt tn hiu v
thit lp li iu kin kch hot ca chnh n.
i tng close ng ca tr li s kin bm phm. Tip phm
bm tip theo cng c thc hin tng t. WakeupOnCollisionEntry
Java3D c kh nng t ng nhn ra s va chm gia cc i tng trong
khng gian o. Java3D cung cp 3 lp WakeupCondition x l s va
chm ca cc i tng:
WakeupOnCollisionEntry,
WakeupOnCollisionMovement,
WakeupOnCollisionExit.
Mt WakeupOnCollisionEntry s oc kch hot khi mt i tng
ln u va chm. Sau WakeupOnCollisionMovement s c kch
hot trong khi hai i tng trong va chm
Cui cng mt i tng WakeupOnCollisionExit s kch hot khi va
chm kt thc Java3D ch c th qun l c mt va chm ca mt i
tng ti mt thi im. Nhng va chm din ra trong khong thi gian
rt ngn cng khng c nhn bit. Mt cch hp l, CollisionEntry v
CollisionExit u khng oc kch hot. Qu trnh nhn bit va chm
Collision detectiontrong thc t din ra rt phc tp.D sao tron ti liu
ny chng ta khng i su vo collision detection, c th tham kah thm
trong Java3D API specification.
Hm to WakeupOnCollisionEntry
Tha k: WakeupCriterion

http://tailieuhay.com

423

Lp trnh ha trn Java 2D v 3D


Lp xc nh va chm u tin ca mt i tng xc nh vi mt i
tng khc trong th khung cnh.
WakeupOnCollisionEntry(Bounds armingBounds)
To mt i tng WakeupOnCollisionEntry mi.
WakeupOnCollisionEntry(Node armingNode)
To mt i tng WakeupOnCollisionEntry mi.
WakeupOnCollisionEntry(Node armingNode, int speedHint)
To mt i tng WakeupOnCollisionEntry mi trong speedHint
nhn mt trong cc gi tr: USE_BOUNDSv USE_GEOMETRY
WakeupOnCollisionEntry(SceneGraphPath armingPath)
To mt i tng WakeupOnCollisionEntry mi vi gi tr speed hint
l

USE_BOUNDS

WakeupOnCollisionEntry(SceneGraphPath

armingPath, int speedHint)


To mt i tng WakeupOnCollisionEntry mi vi gi tr speed hint
l USE_BOUNDS hoc USE_GEOMETRY.

WakeupOnCollisionExit
WakeupOnCollisionExit Constructor Summary
Tha k WakeupCriterion
Lp xc nh khi mt i tng xc nh kt thc va chm vi cc i
tng khc trong th khung cnh
WakeupOnCollisionExit(Bounds armingBounds)
Hm to vi tham s Bound
WakeupOnCollisionExit(Node armingNode)
Hm to vi tham s armingNode
WakeupOnCollisionExit(Node armingNode, int speedHint)

http://tailieuhay.com

424

Lp trnh ha trn Java 2D v 3D


Hm to vi tham s armingNode,speedHine
WakeupOnCollisionExit(SceneGraphPath armingPath)
Hm to vi tham sarmingPath
WakeupOnCollisionExit(SceneGraphPath

armingPath,

int

speedHint)
Hm to vi tham s armingPath, speedHint

WakeupOnCollisionExit Method Summary


Bounds getArmingBounds()
Tr v i tng Bound c s dng trong vic xc ng va chm
SceneGraphPath getArmingPath()
Tr v ng dn dng trong va chm xc nh
Bounds getTriggeringBounds()
Tr v i tng Bounds gy ra va chm
SceneGraphPath getTriggeringPath()
Tr v ng dn m t i tng gy ra va chm

WakeupOnCollisionMovement
WakeupOnCollisionMovement Constructor Summary
Th k: WakeupCriterion
Lp xc nh khi i tng xc nh di chuyn trong va chm vi mt
i tng khc trong khng gian o
WakeupOnCollisionMovement(Bounds armingBounds)
Hm to WakeupOnCollisionMovement
WakeupOnCollisionMovement(Node armingNode)

http://tailieuhay.com

425

Lp trnh ha trn Java 2D v 3D


Hm to WakeupOnCollisionMovement
WakeupOnCollisionMovement(Node armingNode, int speedHint)
Hm to WakeupOnCollisionMovement trong speedHint nhn gi
tr:
USE_BOUNDS hoc USE_GEOMETRY
WakeupOnCollisionMovement(SceneGraphPath armingPath)
Hm to WakeupOnCollisionMovement.
WakeupOnCollisionMovement(SceneGraphPath armingPath, int
speedHint)
Hm to WakeupOnCollisionMovement, trong speedHint nhn mt
trong hai gi tr: USE_BOUNDS hoc USE_GEOMETRY

WakeupOnCollisionMovement Method Summary


Bounds getArmingBounds()
Tr v i tng bounds c s dng trong collision condition.
SceneGraphPath getArmingPath()
Tr v ng dn oc s dng trong collision condition.
Bounds getTriggeringBounds()
Tr v i tng Bounds gy ra va chm
SceneGraphPath getTriggeringPath()
Tr v ng dn gy ra va chm.

WakeupOnDeactivation
WakeupOnDeactivation Constructor Summary
Tha k: WakeupCriterion

http://tailieuhay.com

426

Lp trnh ha trn Java 2D v 3D


Lp xc nh va chm u tin khi qu trnh hot ng c ViewPlatform
khng cn giao vi khung lch ca i tng
WakeupOnDeactivation()
Hm to i tng WakeupOnDeactivation
WakeupOnElapsedFrames
i tng WakeupOnElapsedFrames c s dng kch hot mt
i tng active sau mt s lng frame nht inh tri qua.
WakeupOnElapsedFrames Constructor Summary
Tha k: WakeupCriterion
Lp xc nh mt kch hot sau mt lng frame nht nh
WakeupOnElapsedFrames(int frameCount)
Hm to WakeupOnElapsedFrames.
frameCount - S luwng cc frames m Java 3D v ra trc khi kch
hot mt i tng Behaviour; gi tr n cho bit sao n frame Behaviour
s uc kch hot. gi tr 0 cho bit Behaviour s oc kch hot ngay
sau frame hin thi.
WakeupOnElapsedFrames(int frameCount, boolean passive) <new
in 1.2>
Hm to WakeupOnElapsedFrames vi tham s frameCount v tham s
passive
passive - c ch dn cho bit khi no Behaviour tr nn b ng, mt
Behaviour ch ng s lm cho h thng phi chy mt cch lic tc
khi mt Behaviour b ng n cho php cc s kin khc gy ra frame
uc chy.

http://tailieuhay.com

427

Lp trnh ha trn Java 2D v 3D


WakeupOnElapsedFrames Method Summary
int getElapsedFrameCount()
Tr v s lng cc frameCount
boolean isPassive() <new in 1.2>
Tr v trng thi ca c b ng.
WakeupOnElapsedTime
Java 3D khng th bo m thi gian chnh xc ca trigger cho mt tiu
chun WakeupOnElapsedTime.
WakeupOnElapsedTime Constructor Summary
Tha k: WakeupCriterion
Lp xc nh mt wakeup sau mt khoang thi gian (ms) tri qua.
WakeupOnElapsedTime(long milliseconds)
Hm to i tng WakeupOnElapsedTime

WakeupOnElapsedTime Method Summary


long getElapsedFrameTime()
Tr v thi gian tri qua ca WakeupCriterion
WakeupOnSensorEntry
Trong Java 3D, bt k thit b input no (ngoi tr chut v bn phm)
u l mt sensor Mi sensor c mt hotspot c xc nh trong h
thnh ca sensor. S giao nhau gia hotspt cu mt sensor vi mt region
c

th

nhn

bit

bi

lp

WakeupOnSensorEntry

WakeupOnSensorExit.

http://tailieuhay.com

428

Lp trnh ha trn Java 2D v 3D


WakeupOnSensorEntry Constructor Summary
Th k: WakeupCriterion
Lp xc nh mt wakeup trong giai an u tin nhn bit s giao
nhau gia mt sensor no vi mt boundary xc nh
WakeupOnSensorEntry(Bounds region)
Hm to i tng WakeupOnEntry.

WakeupOnSensorEntry Method Summary


Bounds getBounds()
Tr v bound ca i tng xc nh.
Sensor getTriggeringSensor() <new in 1.2>
Tr v i tng sensor gy ra wakeup.
WakeupOnSensorExit
WakeupOnSensorExit Constructor Summary
Tha k: WakeupCriterion
Lp xc nh mt wakeup trong giai on nhn bit u tin khi khng
cn s giao nhau gia mt i tng sensor trc vi mt boundary
xc nh.
WakeupOnSensorExit(Bounds region)
Hm to i tng WakeupOnExit .

WakeupOnSensorExit Method Summary


Bounds getBounds()
Tr v bound ca i tng xc nh.
Sensor getTriggeringSensor() <new in 1.2>

http://tailieuhay.com

429

Lp trnh ha trn Java 2D v 3D


Tr v i tng Sensor gy ra wakeup.

WakeupOnTransformChange
WakeupOnTransformChange rt hiu qu trong vic nhn bit thay
i v tr hay hng ca cc i tng trc quan trong th khung cnh.
Lp ny s dng phng thc postId to ra cc Behaviour hp tc.
iu ny c bit hiu qu khi chng ta mun hp tc vi mt Behaviour
c xy dng trc .
WakeupOnTransformChange Constructor Summary
Tha k: WakeupCriterion
Lp xc nh mt wakeup khi mt i tng transform trong mt nhm
TransformGroup xc nh thay i.
WakeupOnTransformChange(TransformGroup node)
Hm to i tng WakeupOnTransformChange.

WakeupOnTransformChange Method Summary


TransformGroup getTransformGroup()
Tr v node TransformGroup s dng trong WakeupCriterion
WakeupOnViewPlatformEntry
Qu trnh nhn bit s giao nhau ca ViewPlatform vi mt region xc
nh c th c thc hin bi lp WakeupOnViewPlatfomEntry v lp
WakeupOnViewPlatformExit.
WakeupOnViewPlatformEntry Constructor Summary
Tha k: WakeupCriterion

http://tailieuhay.com

430

Lp trnh ha trn Java 2D v 3D


Lp xc nh mt wakeup trong ln u tin giao nhau ca
ViewPlatform vi mt boundary xc nh.
WakeupOnViewPlatformEntry(Bounds region)
Hm to i tng WakeupOnEntry.

WakeupOnViewPlatformEntry Method Summary


Bounds getBounds()
Tr v bound ca i tng xc nh
WakeupOnViewPlatformExit
WakeupOnViewPlatformExit Constructor Summary
Tha k : WakeupCriterion
Lp xc nh mt wakeup trong ln u tin khi ViewPlatform khng
cn giao nhau vi i tng boundary xc nh
WakeupOnViewPlatformExit(Bounds region)
Hm to i tng WakeupOnExit

WakeupOnViewPlatformExit Method Summary


Bounds getBounds()
Tr v bound ca i tng xc nh

4.3.4 Thnh phn ca WakeupCondition

http://tailieuhay.com

431

Lp trnh ha trn Java 2D v 3D


Nhiu i tng WakeupCriterion c th c kt hp gn vi mt
WakeupCondition s dng 4 lp c gii thiu trong phn sau. Hai
lp u tin c gn lin vo mt WakeupCondition

t mt tp

WakeupCriterion mt cch vt l.Lp th ba v lp th t cho php kt


hp cc th hin ca hai lp u tin thnh mt i tng
WakeupCondition phc tp.
WakeupAnd Constructor Summary
extends: WakeupCondition
Class specifying any number of wakeup criterion logically ANDed
together.
WakeupAnd(WakeupCriterion[] conditions)
Constructs a new WakeupAnd condition.

WakeupOr Constructor Summary


extends: WakeupCondition
Class specifying any number of wakeup criterion logically ORed
together.
WakeupAnd(WakeupCriterion[] conditions)
Constructs a new WakeupOr condition.

WakeupAndOfOrs Constructor Summary


extends: WakeupCondition
Class specifying any number of WakeupOr condition logically ANDed
together.
WakeupAndOfOrs(WakeupOr[] conditions)

http://tailieuhay.com

432

Lp trnh ha trn Java 2D v 3D


Constructs a new WakeupAndOfOrs condition..

WakeupOrOfAnds Constructor Summary


extends: WakeupCondition
Class specifying any number of WakeupAnd condition logically ORed
together.
WakeupOrsOfAnds(WakeupAnd[] conditions)
Constructs a new WakeupOrOfAnds condition.

4.4 Lp Behaviour tin ch x l bn phm

Chng ta xem xt viewer vi v tr v gc khng i. Thay i


viewer l mt kh nng quan trng trong rt nhiu ng dng 3D. Java3D
cung cp kh nng thay i v tr, hng ca viewer. Trong hnh di y
chng ta c th thy nn transform. Nu nh transform thay i, nh
huwng ti dch chuyn hoc nh hng li hoc ca viewer. T quan
im ny chng ta c th thy thit k c bn ca tng tc bn phm: ta
c mt i tng Behaviour thay i nn view p li tc ng ca
phm bm.
y chnh cch m l lp tin ch Java3D lm vic. trong phn cn li
chng ta xem xt vic s dng lp tng tc vi bn phm.

http://tailieuhay.com

433

Lp trnh ha trn Java 2D v 3D

Cch dch chuyn trong SimpleUniverse


Lp SimpleUniverse v cc lp lin quan cung cp mt s kt hp
nhn c i tng ViewPlatformTransform object. T chng ta
c th di chuyn SimpleUniverse. cbit an cod di y nhn c
ViewPlatformTransform t mt i tng SimpleUniverse
TransformGroup vpt =
su.getViewingPlatform().getViewPlatformTransform ();

4.4.1 Mt v d n gin
V

KeyNavigatorApp

sau

nm

trong

th

mc

examples/Interaction
Trong chng trnh ny chng ta c th thy c cc bc thc hin bao
gm c vic s dng lp KeyNavigatorBehavior ging nh vic s dng
cc lp Behaviour khc.
1. To ra i tng KeyNavigatorBehaviour

,thit lp transform

group
2. Thm i tng KeyNavigatorBehavior vo th khung cnh

http://tailieuhay.com

434

Lp trnh ha trn Java 2D v 3D


3. Cung cp mt gi hn

(hoc BoundingLeaf) cho i tng

KeyNavigatorBehavior
public

BranchGroup

createSceneGraph(SimpleUniverse su) {
// Create the root of the branch graph
TransformGroup vpTrans = null;
BranchGroup

objRoot

new

BranchGroup();
objRoot.addChild(createLand());
// create other scene graph content
vpTrans

su.getViewingPlatform().getViewPlatformTransform
();
translate.set( 0.0f, 0.3f, 0.0f); // 3
meter elevation
T3D.setTranslation(translate);

//

set

as translation
vpTrans.setTransform(T3D); // used for
initial position
KeyNavigatorBehavior

keyNavBeh

new

KeyNavigatorBehavior(vpTrans);
keyNavBeh.setSchedulingBounds(new
BoundingSphere(new Point3d(),1000.0));
objRoot.addChild(keyNavBeh);
// Let Java 3D perform optimizations on
this scene graph.
objRoot.compile();
return objRoot;

http://tailieuhay.com

435

Lp trnh ha trn Java 2D v 3D


}
Theo cng thc cc bc trnh by trn, trong phng thc
createSceneGraph i hi vic truy cp vo nhm ViewPlatform
transform.Qu trnh thc thi ny truyn i tng SimpleUniverse vo
phng thc createSceneGraph lm cho n tr nn active c th truy
cp

vo

cc

nhnh

PlatformGeometry,

view

khc

ca

ViewerAvatar, hoc

SimpleUniverse,
thm

mt

nh
tng

BoundingLeaf vo nhnh view.


Dng 13-15 khi to v tr ban u ca viewer. Trong trng hp
ny , i tng viewer c chuyn ti v tr 0.3 meters nm trn v tr
ban u ca th gii o. y ch l v tr ban u v chng ta c th thay
i v tr v gc ca viewer sau ny.
// The following allows this to be run as an
application
// as well as an applet
public KeyNavigatorApp() {
setLayout(new BorderLayout());
Canvas3D canvas3D = new Canvas3D(null);
add("Center", canvas3D);
//

SimpleUniverse

is

Convenience

Utility class
SimpleUniverse

simpleU

new

SimpleUniverse(canvas3D);
BranchGroup

scene

createSceneGraph(simpleU);

http://tailieuhay.com

436

Lp trnh ha trn Java 2D v 3D


simpleU.addBranchGraph(scene);
} // end of KeyNavigatorApp (constructor)
Cch xy dng ng dng chung ca mt Behavior
Nh bt k i tng Behaviour khc, KeyNavigatorBehaviour
ch active khi khung lch ca n giao nhau vi giai on active ca mt
ViewPlatform.

4.4.2 Lp KeyNavigatorBehaviour v KeyNavigator

Lp tic ch tng tc bn phm thc thi hai lp. Trong thi gian chy
chng trnh c hai i tng. i tng u tin l i tng
KeyNavigatorBehavior, i tng th hai l KeyNavigator. Lp th hai
khng cn thit phi trnh by trong ti liu ny. i tng
KeyNavigatorBehavior thc hin hu ht tt c cc hm chc nng
truyn thng ca mt lp Behaviour, ngoi vic n gi n i tng
KeyNavigator

thc

hin

phng

thc

perform

the

processStimulus.Lp KeyNavigator nhn s kin AWTEvent v chuyn


cc s kin thnh tng cc phm bm ring bit.Bng di y 4-3 ch ra
tc dng ca tng phm bm ring bit. Lp KeyNavigator thc thi s
vn ng nhanh chng.
KeyNavigatorBehavior Constructor Summary
Gi: com.sun.j3d.utils.behaviors.keyboard
Tha k : Behavior
Lp l mt behavior n gin that gi n KeyNavigator thay i
b ngoi view platform
KeyNavigatorBehavior(TransformGroup targetTG)

http://tailieuhay.com

437

Lp trnh ha trn Java 2D v 3D


Hm to mt node key navigator behavior mi c tc dng trn nhm
transform xc nh

KeyNavigatorBehavior Method Summary


void initialize()
Hm phng thc khi to ca lp Behavior thit lp thng s
wakeupvoid processStmulus(java.util.Enumeration criteria)
Hm phng thc processStimulus ca lp Behavior qun l s
kin

4.5 Lp tin ch tng tc vi chut


Gi tin ch Behaviour

(com.sun.j3d.utils.behaviors.mouse) cha

nhng lp Behaviour tng qun l vic tng tc vi chut. Bao gm


cc lp chuyn dch, phng to/nh v iu khin quay cc i tng
trc quan theo s di chuyn ca chut.
Bng 4-4 tng hp li 3 Behaviour xc nh ca trong vic tng tc
vi chut the. Trong gi cn c cha lp c s tru tng
MouseBehavior class v giao din MouseCallback . Lp c s tru
tng v giao din c s dng to ra cc Behaviour xc nh ca
con chut.

4.5.1 S dng lp MouseBehaviour


S dng lp mouse Behaviour cng tng t nh ki s dng cc
lop Behaviour khc.
Cc bc khi s dng lp mouse Behaviour

http://tailieuhay.com

438

Lp trnh ha trn Java 2D v 3D


1.Cung cp kh nng c v ghi cho i tng ch transform group
2. Khi to mt i tng MouseBehavior
3. Thit lp i tng ch n transform group
4. Cung cp mt gioi hn (or BoundingLeaf) cho i tng
MouseBehavior
5. Thm i tng MouseBehavior vo th khung cnh
Figure 4-10 Recipe for Using Mouse Behavior Classes
Tuy nhin cc bc trn l k bt buc phi thc hin y . Bc 2
v bc 3 c th cung thc hin trong mt hm to. v d di y gii
thiu phng thc createSceneGraph t v d MouseRotateApp. th
khung cnh cha i tng ColorCube. Ngi dng c th quay i
tng ColorCube s dng chut v c i tng MouseRotate trong
th khung cnh
//

MouseRotateApp

renders

single,

interactively rotatable cube.


public class MouseRotateApp extends Applet {
public BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
TransformGroup

objRotate

new

TransformGroup();

http://tailieuhay.com

439

Lp trnh ha trn Java 2D v 3D

objRotate.setCapability(TransformGroup.ALLOW_TRAN
SFORM_WRITE);

objRotate.setCapability(TransformGroup.ALLOW_TRAN
SFORM_READ);
objRoot.addChild(objRotate);
objRotate.addChild(new ColorCube(0.4));
objRoot.addChild(new Axis());
MouseRotate

myMouseRotate

new

MouseRotate();
myMouseRotate.setTransformGroup(objRotate);
myMouseRotate.setSchedulingBounds(new
BoundingSphere());
objRoot.addChild(myMouseRotate);
// Let Java 3D perform optimizations on
this scene graph.
objRoot.compile();
return objRoot;
}

//

end

of

CreateSceneGraph

method

of

MouseRotateApp

http://tailieuhay.com

440

Lp trnh ha trn Java 2D v 3D


// Create a simple scene and attach it to the
virtual universe
public MouseRotateApp() {
setLayout(new BorderLayout());
Canvas3D canvas3D = new Canvas3D(null);
add("Center", canvas3D);
BranchGroup scene = createSceneGraph();
//

SimpleUniverse

is

Convenience

Utility class
SimpleUniverse

simpleU

new

SimpleUniverse(canvas3D);
// This will move the ViewPlatform back
a bit so the
// objects in the scene can be viewed.

simpleU.getViewingPlatform().setNominalViewingTra
nsform();
simpleU.addBranchGraph(scene);
} // end of MouseRotateApp (constructor)
// The following allows this to be run as an
application
// as well as an applet

http://tailieuhay.com

441

Lp trnh ha trn Java 2D v 3D

public static void main(String[] args) {


System.out
.print("MouseRotateApp.java

\n-

a demonstration of using the MouseRotate ");


System.out
.println("utility behavior class
to provide interaction in a Java 3D scene.");
System.out
.println("Hold the mouse button
while

moving

the

mouse

to

make

the

cube

rotate.");
System.out
.println("This

is

simple

example progam from The Java 3D API Tutorial.");


System.out.println("The Java 3D Tutorial
is available on the web at:");
System.out
.println("http://java.sun.com/pr
oducts/java-media/3D/collateral");
Frame

frame

new

MainFrame(new

MouseRotateApp(), 256, 256);


} // end of main (method of MouseRotateApp)
} // end of class MouseRotateApp
Code Fragment 4-7 Using the MouseRotate Utility Class

Chng trnh cho kt qa:

http://tailieuhay.com

442

Lp trnh ha trn Java 2D v 3D

Mt cch tng t chng ta c th lm vic vi hai lp mouse


Behaviour cn li. Trong thc tc ba lp ny u c th dng chung
trong mt ng dng tc ng cn vo mt i tng trc quan Chng ta
cng ch cn mt i tng TransformGroup chung c c 3 i tng
mouse behaviors. Trong v d tip theo chng ta xem xt cc thc hai
mouse Behaviour cng hnh ng trong mt th gii o. V d
MouseRotate2App to ra mt th khung cnh vi hai i tng
ColorCube nm gn nhau.Mi i tng ColorCubes gn lin vi mt i
tng MouseRotate.
Khi c hai i tng mouse behavior cng active, lc o ngi dng
click v di chuyn chut, c hai i tng ColorCubes cng quay.
Nu chng ta khng mun c hai i tng cng quay, ta c hai gii
php

Thay i v tr viewer hay thay i khung lch ca Behaviour sao


cho ch c mt Behaviour uwc active

S dng k thut picking cch ly Behaviour. K thut picking


c xem xt trong phn 4.6

http://tailieuhay.com

443

Lp trnh ha trn Java 2D v 3D


Trong phn 4.6 chng s s dng cc lp thch hp c th kt hp
cc mouse Behaviour vi picking cho php ngi dng tng tc vi
tng i tng trc quan ti mt thi im.

4.5.2 Mouse Behaviour Foundation


Cc phng thc mouse Behaviour xc nh (MouseRotate,
MouseTranslate, v MouseZoom) l m rng ca lp c s tr tng
MouseBehavior v thc thi giao din MouseCallback .
Lp c s tru tng Mouse Behavior
Lp c s tru tng c gii thiu sau y khi chng ta mun tha
k n vit cc lp mouse Behaviour ca rieng mnh.
MouseBehavior Method Summary
Lp c s cho tt c cc thao tc chut mouse
void initialize()
Khi to behavior.
void processMouseEvent(java.awt.event.MouseEvent evt)
kim soat cc s kin chut.
void processStimulus(java.util.Enumeration criteria)
Tt c cc thao tc chut phi thc thi phng thc ny ca lp
Behaviour

void

setTransformGroup(TransformGroup

TransformGroup)
Thit lp TransformGroup ch cho Behaviour
void wakeup()
Gi n phng thc wakeup.
MouseCallback Interface

http://tailieuhay.com

444

Lp trnh ha trn Java 2D v 3D


Mt lp thc thi giao din ny cung cp phng thc
transformChanged, phng thc ny s c gi khi i tng ich
transform

thay

i theo mt cch thc xc nh. c 3 lp mouse

Behaviour u phi thc thi giao din ny. Chng ta cng c th vit
phng thc transformChanged ca mt trong s cc lp kia xc nh
phng thc c gi khi i tng transform thay i
Cc phng thc Interface MouseBehaviorCallback
Gi: com.sun.j3d.utils.behaviors.mouse
void transformChanged(int type, Transform3D transform)
Lp thc thi giao din ny c dng k vi mt trong s cc
MouseBehaviors s c gi mi khi Behaviour cp nht transform.
Gi

tr

ca

type:

MouseCallback.ROTATE,

MouseCallback.TRANSLATE, hoc MouseCallback.ZOOM.

4.5.3 Cc lp MouseBehaviour

Mouse Rotate
Mt th khung cnh c cha mt i tng MouseRotate cho php
ngui dng quay i tng truqj quan. Chng ta s xem chi tit trong cc
v d MouseRotateApp,
MouseRotate2App, v MouseBehaviorApp.
Hm to MouseRotate Constructor
Gi: com.sun.j3d.utils.behaviors.mouse
Tha k : MouseBehavior

http://tailieuhay.com

445

Lp trnh ha trn Java 2D v 3D


MouseRotate l mt Behaviour cho php ngi dng iu khin vic
quay i tng thng qua chut. s dng lp ny, trc ht to ra
mt transform group m hnh ng quay ny tc ng vo. ngi dng
c th quay bt c i tng con no ca nhm TransformGroup.
MouseRotate()
Hm to mt mouse rotate behavior mc nh.
MouseRotate(TransformGroup TransformGroup)
Hm to mt mouse rotate behavior gn vi TransformGroup
MouseRotate(int flags)
Khi to mt mouse behavior vi c, gii tr ca c:
MouseBehavior.INVERT_INPUT Cho php o ngc u vo.
MouseBehavior.MANUAL_WAKEUP Cho php gi Behaviour mt
cch ch ng

Tng hp phng thc MouseRotate


void setFactor(double factor)
void setFactor(double xFactor, double yFactor)
void setupCallback(MouseBehaviorCallback callback)
Phng thc transformChanged trong lp callback s oc gi t ng
mi khi transform c cp nht
void transformChanged(Transform3D transform)
Chng ta c th chng hm, khi hm mi s c gi mi khi
Behaviour cp nht transform
MouseTranslate
Cho php ngi dng di chuyn i tng trc quan trong mt mt
phng song song vi mt phng xc nh trong khng gian o. Xem v d
MouseBehaviorApp.

http://tailieuhay.com

446

Lp trnh ha trn Java 2D v 3D

MouseTranslate Constructor Summary


Gi : com.sun.j3d.utils.behaviors.mouse
Tha k : MouseBehavior
MouseTranslate l mt i tng Behaviour cho php ngi dng iu
khin s chuyn ng theo (X/Y) ca mt i tng bn cc s dng
chut phi
MouseTranslate()
Khi to mt Behaviour dch chuyn mc nh
MouseTranslate(TransformGroup TransformGroup)
Khi to mt Behaviour dch chuyn vi tham s TransformGroup
MouseTranslate(int flags)
Khi to mt Behaviour dch chuyn vi tham s c. C nhn mt
trong cc gi tr:
MouseBehavior.INVERT_INPUT Cho php o ngc u vo.
MouseBehavior.MANUAL_WAKEUP Cho php gi Behaviour mt
cch ch ng

MouseTranslate Method Summary


void setFactor(double factor)
void setFactor(double xFactor, double yFactor)
void setupCallback(MouseBehaviorCallback callback)
Phng thc transformChanged trong lp callback s oc gi t ng
mi khi transform c cp nht
void transformChanged(Transform3D transform)
Chng ta c th chng hm, khi hm mi s c gi mi khi
Behaviour cp nht transform

http://tailieuhay.com

447

Lp trnh ha trn Java 2D v 3D


MouseZoom
Cho php ngi dng di chuyn i tng trc quan trong mt mt
phng trc giao vi .Xem them v d MouseBehaviorApp.
Hm to MouseZoom
Gi: com.sun.j3d.utils.behaviors.mouse
Tha k : MouseBehavior
MouseZoom l mt i tng behavior cho php ngi dng thay i v
tr ca i tng truqjc uan theo trc Z bn nt gi ca chut.
MouseZoom()
To ra i tng mouse zoom behavior mc nh.
MouseZoom(TransformGroup TransformGroup)
To ra i tng mouse zoom behavior vi tham s transform group.
MouseZoom(int flags)
Khi to mt zoom Behaviour vi tham s c. C nhn mt trong cc
gi tr:
MouseBehavior.INVERT_INPUT Cho php o ngc u vo.
MouseBehavior.MANUAL_WAKEUP Cho php gi Behaviour mt
cch ch ng

MouseZoom Method Summary


void setFactor(double factor)
void setupCallback(MouseBehaviorCallback callback)
void transformChanged(Transform3D transform)
Chng ta c th chng hm, khi hm mi s c gi mi khi
Behaviour cp nht transform

http://tailieuhay.com

448

Lp trnh ha trn Java 2D v 3D

4.5.4 Mouse Navigation


Trong s cc hm to ca ba lp mouse Behaviour u c tham s
flag.Khi c c gi tr

MouseBehavior.INVERT_INPUTS i tng

mouse Behaviour o ngc li th t ca input. Nh vy ta cc lp


mouse Behaviour c th dng iu khin chuyn hng.Xem v d
MouseNavigatorApp.
on code trong 4-8 trnh by phng thc createSceneGraph. i tng
TransformGroup ch ca mi i tng the mouse behavior objects l
ViewPlatform transform. i tng SimpleUniverse l tham s truyn
cho phng thc createSceneGraph v vy i tng ViewPlatform c th
c truy cp.

public

BranchGroup

createSceneGraph(SimpleUniverse su) {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
TransformGroup vpTrans = null;
BoundingSphere mouseBounds = null;
vpTrans

su.getViewingPlatform().getViewPlatformTransform
();
objRoot.addChild(new ColorCube(0.4));
objRoot.addChild(new Axis());

http://tailieuhay.com

449

Lp trnh ha trn Java 2D v 3D


mouseBounds = new BoundingSphere(new
Point3d(), 1000.0);
MouseRotate

myMouseRotate

new

MouseRotate(MouseBehavior.INVERT_INPUT);
myMouseRotate.setTransformGroup(vpTrans)
;
myMouseRotate.setSchedulingBounds(mouseB
ounds);
objRoot.addChild(myMouseRotate);
MouseTranslate myMouseTranslate = new
MouseTranslate(MouseBehavior.INVERT_INPUT);
myMouseTranslate.setTransformGroup(vpTra
ns);
myMouseTranslate.setSchedulingBounds(mou
seBounds);
objRoot.addChild(myMouseTranslate);
MouseZoom

myMouseZoom

new

MouseZoom(MouseBehavior.INVERT_INPUT);
myMouseZoom.setTransformGroup(vpTrans);
myMouseZoom.setSchedulingBounds(mouseBou
nds);
objRoot.addChild(myMouseZoom);
// Let Java 3D perform optimizations on this
scene graph.
objRoot.compile();

http://tailieuhay.com

450

Lp trnh ha trn Java 2D v 3D

return objRoot;
}

//

end

of

CreateSceneGraph

method

of

MouseNavigatorApp

Kt qu cho ta l:

4.6 Picking Object


Trong v d MouseRotate2App, c hai i tng ColorCube u quay
khi gp tc ng ca gui dng. Trong v d c hai i tng u cha
c th quay mt cch c lp.K thut picking cho php chng ta tng
tc vi tng i tng trc quan trong th khung cnh .
Picking c thc thi bi mt Behaviour, di s kch hot ca s kin
click chut. picking mt i tng, ngi dng di chuyn chut vo
i tng trc quan v click chut. i tng behavior c kch hot
bi s kin click chut v thc hin picking. Mt ray l mt tia oc
chiu t v tr con tr chut song song vi projected.

http://tailieuhay.com

451

Lp trnh ha trn Java 2D v 3D


S giao nhau ca ray vi i tng trong khng gian o c tnh ton .
i tng trc quan giao ct vi mt phng khung hnh gn nht c
cla chn giao ct.

Mt pick ray trong khng gian o


Mt cch tng th, qu trnh giao ct khng thc hin trc tip trn
i tng c la chn, m lm vic vi i tng chuyn hng th
khung cnh n i tng. Ly v d picking mt i tng
ColorCube object iu khin quay , i tng ColorCube khng b
trc tip iu khin m thay vo l i tng TransformGroup nm
trn i tng ColorCube trong cng path n i tng ColorCube. Ni
mt cch khc nu cng vic picking ka chn i tng trc quan nhm
thay i mu sc ca i tng,khi i tng trc quan phi c tc
ng mt cch trc tip.
Vic xc nh chnh xc i tng c x l khng phi l mt cng
vic n gin. Nu chng ta cn quay mt i tng hn lp phng 6
mt , mi mt l mt i tng Shape3D c lp c sap xp bi 6 i

http://tailieuhay.com

452

Lp trnh ha trn Java 2D v 3D


tng TransformGroup , khi i tng hnh lp phng s cn phi
giao ct trc tip ch khng phi l i tng TransformGroup
Vic quay i tng hnh lp phng bng vic tng tc n i
tng TransformGroup, l con ca i tng BranchGroup trong th
khung cnh .

Vic tnh ton qu trnh giao ct l rt tn km. V vy, picking i


hi kh nng tnh ton cao v lm tng phc tp ca th khung
cnh. trong Java3D cung cp cho chng ta nhng cch khc nhau gii
hn s lng tnh ton phi thc hin trong picking. Mt cch quan trng
l s dng kh nng v thuc tnh cc node ca th khung cnh.
Mt node trong th khung cnh c phng thc setPickable()t l
false khi i tng node ny v tt c cc i tng con ca n u
khng th picking Bi vy, nhng node khng c xem xt n khi tnh
ton giao ct.
Mt

im

khc

ca

lp

Node

kh

nng

ENABLE_PICK_REPORTING. Kh nng ny ch p dng vi mt nhm


node.

Node Method (partial list)

http://tailieuhay.com

453

Lp trnh ha trn Java 2D v 3D


Tha k : SceneGraphObject
Lp con: Group, Leaf
Lp Node l mt lp c s tru tng cho tt c cc Group v Leaf
Nodes.N cung cp mt khung thng dng trong vic xy dng mt
Java3D th khung cnh., nh specifically bounding volumes, picking
v kh nng nhn bit collision
void setBounds(Bounds bounds)
Thit lp mt i tng hnh hc bao quanh mt node.
void setBoundsAutoCompute(boolean autoCompute)
Bt tt ch t ng tnh ton t ng i tng hnh hc bao quanh
m setPickable(boolean pickable)
t ch pick, nu l true i tng Node ny c th pick, ngoc li
i tng Node v cc con ca n u khng th pick c

Node Capabilities Summary (partial list)


ENABLE_PICK_REPORTING
Ch nh Node c th c thng bo trong SceneGraphPath nu nh
qu trh pick c thc hin. Kh nng ny ch c th uwc nh r
cho cc Group node, n khng p dng cho cc node l.Gi tr mc nh
l false.
ALLOW_BOUNDS_READ | WRITE
Ch nh Node c c/ghi truy cp cc thng tin vo khung ca n.
ALLOW_PICKABLE_READ | WRITE

Mt cch khc ngi lp trnh c th gim thiu vic tnh ton


trong q trnh picking l s dng th nghim giao ct ca khung bao

http://tailieuhay.com

454

Lp trnh ha trn Java 2D v 3D


quanh thay v vic s dng giao ct ca cc i tng hnh hc. Rt nheu
lp c cc hm to v phng thc nhn tham s u vo
USE_BOUNDS hoc USE_GEOMETRY. Quyt nh s dng khung
baop quanh r rng em li hiu qu hn nhiu (trong vic tnh ton)
i vi hu ht v vy hiu nng ca chng trnh tng r rt. Tuy nhin
phng n ny thc t khng phi lc no cng t ra hiu qu v thc
hin uc.
Mt k thut th 3 gim nhng tnh ton phc tp trong qu trnh
picking la gii hn phm vi picking vi nhng phn c lin quan trong
th khung cnh.

4.6.1 Using Picking Utility Classes


C hai cch tip cn trong qu tnh s dng picking ca java3D: s
dng i tng ca lp picking, hoc to ra lp picking mi v s dng
th hin ca n . Gi picking bao gm cc lp pick/rotate,
pick/translate, v pick/zoom . Mi lp picking s dng mt phm chut
khc nhau thc hin qu trnh iu khin i tng vi y kh
nng ca cc lp picking trong cng mt ng dng.
Trong

phn

ny

PickRotateBehavior,

chng

ta

gii

thiu

PickTranslateBehavior,

cc

lp

tin

ch

PickZoomBehavior.

Trong phn tip theo 4.6.2 chng ta gii thiu cc lp hay s dng trong
vic to ra cc lp picking mi.
Do mi i tng picking behavior object c kh nng thc hin vi
bt k i tng th khung cnh, v vy ch cn mt i tng picking
behavior cung cp kh nng picking on code di y m t cng
vic cn thit s dng cc lp picking behavior trong mt chng trnh
Java 3D

http://tailieuhay.com

455

Lp trnh ha trn Java 2D v 3D


PickRotateBehavior behavior = new PickRotateBehavior(root,
canvas, bounds);
root.addChild(behavior);
i tng behavior s qun l bt c sk kin picking no din ra
trong th khung cnh (nm di root) v x l cc thao tc ko th
chut.
Cc boc s dng lp picking
1. Khi to th khung cnh
2. Khi to i tng picking behavior vi root, canvas, v bounds
xc nh.
3. Thm i tng behavior vo th khung cnh.
4. Bt chc nng thch hp cho i tng th khung cnh
Nhng sai st hygp phi khi s dng i tng Picking
S dng lp picking behavior c th dn n cc sai lm hay gp phi
nh khi lp trnh vi lp behavior. Vn thng gp l: qun khng bao
gm cc i tng behavior trong th khung cnh, v khng thit lp
khung thch hp cho i tng behavior
Chng trnh v d MousePickApp.
on code di y trnh by phng thc createSceneGraph ca lp
MousePickApp. Chng trnh s dng i tng PickRotate object
cung cp qu trnh tung tc. on code di y tun th cc bc
trnh by trn.
public BranchGroup createSceneGraph(Canvas3D
canvas) {
http://tailieuhay.com

456

Lp trnh ha trn Java 2D v 3D


// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
TransformGroup objRotate = null;
PickRotateBehavior pickRotate = null;
Transform3D

transform

new

Transform3D();
BoundingSphere

behaveBounds

new

BoundingSphere();
//

create

ColorCube

and

PickRotateBehavior objects
transform.setTranslation(new Vector3f(0.6f, 0.0f, -0.6f));
objRotate

new

TransformGroup(transform);
objRotate.setCapability(TransformGroup.AL
LOW_TRANSFORM_WRITE);
objRotate.setCapability(TransformGroup.AL
LOW_TRANSFORM_READ);
objRotate.setCapability(TransformGroup.EN
ABLE_PICK_REPORTING);
objRoot.addChild(objRotate);
objRotate.addChild(new ColorCube(0.4));
pickRotate
PickRotateBehavior(objRoot,

new

canvas,

behaveBounds);

http://tailieuhay.com

457

Lp trnh ha trn Java 2D v 3D


objRoot.addChild(pickRotate);
// add a second ColorCube object to the
scene graph
transform.setTranslation(new
Vector3f( 0.6f, 0.0f, -0.6f));
objRotate

new

TransformGroup(transform);
objRotate.setCapability(TransformGroup.AL
LOW_TRANSFORM_WRITE);
objRotate.setCapability(TransformGroup.AL
LOW_TRANSFORM_READ);
objRotate.setCapability(TransformGroup.EN
ABLE_PICK_REPORTING);
objRoot.addChild(objRotate);
objRotate.addChild(new ColorCube(0.4));
// Let Java 3D perform optimizations on this
scene graph.
objRoot.compile();
return objRoot;
}

//

end

of

CreateSceneGraph

method

of

MousePickApp

http://tailieuhay.com

458

Lp trnh ha trn Java 2D v 3D

on code trn cng tung t vi v d MouseRotate2App, tuy nhin


vn khc nhua trong mt s trng hp. iu khc bit ch yu l ng
dng trn ch s dng mt i tng behavior trong khi ng dng
MouseRotate2App s dng h2 i tng behavior cho mi i tng
trc quan.
Ngoi ra chc nng ca cc behavior cng rt khc nhau. ng dng ca
chng ta ch php ngi dng pick mt i tng tng tc, trong khi
ng dng MouseRotate2App lm quay c hai i tng.

4.6.2 Cc hm API c bn trong cc lp Picking

V c bn c 3 'levels' picking classes c cung cp trong Java 3D.


Cc hm Java 3D API c bn cung cp cc hm chc nng tng di
cng. Gi tin ch picking cung cp nhng lp picking behavior chung,
ph hp v d dng thay i. Gi tic ch picking cng cung cp cc lp
behavior c th s dng trc tip trong chuwong trnh Java3D.
Nhng lp nhn c bn bao gm lp PickShape v lp
SceneGraphPath, v cc phng thc ca BranchGroup v Locale.Nhng
http://tailieuhay.com

459

Lp trnh ha trn Java 2D v 3D


lp ny cung cp nhng k thut xc nh hng hnh oc s dng
trong vic tng tc vi cc i tng tru tng. trong phn ny chng
ta gioi thiu cc hm API ca cc lp : PickShape and SceneGraphPath.
Nhng lp tic ch picking xc nh s dng cc lp chung thc
thi mt picking behavior xc nh.
PickShape classes
Lp c s tru tng ch cung cp mt cch tru tng 5 lp con:
PickBounds, PickRay, PickSegment, PickPoint, v PickCone.
Thng thng , i tng hnh hc, l ch ca picking, s xc nh
s dng i tng pick shapes no.i vi cc hnh c dng a gic bt
c pick shape no cng tha mn c nhim v ny. Tuy nhin c s
khc nhau v hiu nng s dung gia cc lp ny.

S ph h PickShape
PickShape
Lp con: PickBounds, PickRay, PickSegment, PickPoint, and PickCone
PickBounds
i tng PickBounds th hin mt khung cho pick testing.

http://tailieuhay.com

460

Lp trnh ha trn Java 2D v 3D

PickBounds Constructor Summary


Tha k: PickShape
Mt khung cung cp cho phng thc BranchGroup Locale pick.
PickBounds()
Hm to Pickbounds
PickBounds(Bounds boundsObject)
Hm to vi tham s bound.

PickBounds Method Summary


Bounds get()
Tr v i tng bound t i tng PickBounds.
void set(Bounds boundsObject)
Thit lp boundsObject trong i tng PickBounds.
PickPoint
i tng PickPoint th hin cho im picking. L lp con ca lp
PickShape, i tng PickPoint c th c s dng vi BranchGroup
and Locale pick testing
PickPoint Constructor Summary
Tha k : PickShape
Mt im cung cp cho phng thc pick ca BranchGroup v Locale
PickPoint()
Hm ta i tng PickPoint ti (0, 0, 0).
PickPoint(Point3d location)
Hm ta PickPoint vi tham s location.

http://tailieuhay.com

461

Lp trnh ha trn Java 2D v 3D

PickPoint Method Summary


void set(Point3d location)
Thit lp gi tr v tr ca PickPoint.
PickRay
i tng PickRay th hin mt ray trong picking.
PickRay Constructor Summary
Tha k : PickShape
i tng PickRay l mt gi gn cc ray truyn vo cho phng
thc picking trong lp BranchGroup v Locale
PickRay()
Hm to vi gi tr mc nh (0, 0, 0).
PickRay(Point3d origin, Vector3d direction)
Hm to vi tham s hng.

PickRay Method Summary


void set(Point3d origin, Vector3d direction)
Thit lp mt tia n mt im t v tr vi tham s ta v hng.
PickSegment
i tng PickSegment biu din mt on thng (defined by two
points) picking.
Lp con lp PickShape, i tng PickSegment c s dng vi
phng thc pick testing ca BranchGroup v Locale

http://tailieuhay.com

462

Lp trnh ha trn Java 2D v 3D


PickSegment Constructor Summary
Tha k : PickShape
PickSegment()
Hm to PickSegment.
PickSegment(Point3d start, Point3d end)
Hm to PickSegment tham s im u im cui.

PickSegment Method Summary


void set(Point3d start, Point3d end)
Thit lp mt PickSegment tham s im u im cui.
PickCone
PickCone lp mi trong API phin bn 1.2. Lp PickCone l lp c
s tru tng vi tt c cc khung hnh nn. Khung hnh nn s dng
hiu qu khi picking gia cc i tng hnh hc.
G hai lp con: PickConeRay v PickConeSegment. im khc bit
gia chng l di. PickConeRay l mt hnh nn vi di is a cone
of v tn length trong khi PickConeSegment c di gii hn.
i tng PickConeRay oc xc nh i mt im ban u v
hng. i tng PickConeSegment c nh ngha hai im xc nh
c di v huwosng ca hnh nn.

PickCone Method Summary


void getDirection(Vector3d direction) <new in 1.2>
http://tailieuhay.com

463

Lp trnh ha trn Java 2D v 3D


Tr v hng ca i tng PickCone
void getOrigin(Point3d origin) <new in 1.2>
double getSpreadAngle() <new in 1.2>
Tr v gc rng ca i tng PickCone.PickConeRay <new in 1.2>

PickConeRay Constructor Summary


Tha k PickCone
PickConeRay() <new in 1.2>
Hm to PickConeRay.
PickConeRay(Point3d origin, Vector3d direction, <new in 1.2>
double spreadAngle)
Hm to PickConeRay.

PickConeRay Method Summary


void set(Point3d origin, Vector3d direction, double spreadAngle)
Phng thc thit lp cc tham s ca i tng PickCone
PickConeSegment <new in 1.2>
PickConeSegment Constructor Summary
Tha k : PickCone
PickConeSegment() <new in 1.2>
PickConeSegment(Point3d

origin,

Point3d

end,

double

spreadAngle) <new in 1.2>

PickConeSegment Method Summary


void getEnd(Point3d end) <new in 1.2>

http://tailieuhay.com

464

Lp trnh ha trn Java 2D v 3D


Tr v im cui ca i tng PickConeSegment. im u uwojc
nhn t phng thc ca lp cha.
void set(Point3d origin, Point3d end, double spreadAngle) <new in
1.2>
PickCylinder <new in 1.2>
Lp PickCylinder v lp con ca n cng tong t nh lp PickCone
v cc lp con ca PickCone. Lp PickCone l lp c s tru tng ca
hai lp: PickCylinderRay v PickCylinderSegment.

PickCylinder Method Summary


void getDirection(Vector3d direction) <new in 1.2>
Tr v hng ca i tng PickCylinder.
void getOrigin(Point3d origin) <new in 1.2>
Tr v im khi u ca i tng cylinder.
double getRadius() <new in 1.2>
Tr v goc ban u ca i tng cylinder

PickCylinderRay <new in 1.2>


PickCylinderRay Constructor Summary
Tha k : PickCylinder
PickCylinderRay() <new in 1.2>

http://tailieuhay.com

465

Lp trnh ha trn Java 2D v 3D


Hm to PickCylinderRay. S dng phng thc set(Point3d, Vector3d
double) thit lp cc gi tr ca htuc tnh
PickCylinderRay(Point3d origin, Vector3d direction, <new in 1.2>
double radius)
Hm to vi tham s im ban u v hong.

PickCylinderRay Method Summary


void set(Point3d origin, Vector3d direction, double radius) <new in
1.2>
Phng thc thit lp gi tr cho cc thuc tnh ca i tng
PickCylinderRay.
PickCylinderSegment <new in 1.2>
PickCylinderSegment Constructor Summary
Tha k : PickCylinder
PickCylinderSegment() <new in 1.2>
Hm to PickCylinderSegment.
PickCylinderSegment(Point3d origin, Point3d end, double radius)
<new in 1.2>

PickCylinderRay Method Summary


void getEnd(Point3d end) <new in 1.2>
Tr v im cui i tng PickCylinderSegment.
void set(Point3d origin, Point3d end, double radius) <new in 1.2>
SceneGraphPath

http://tailieuhay.com

466

Lp trnh ha trn Java 2D v 3D


Lp SceneGraphPath c s dng trong hu ht cc ng dng
picking.iu ny l do qu trnh picking thuwongf xuyn bao gm qu
trnh tm ong i trong th khung cnh c cha i tng cn tng
tc. Mt i tng SceneGraphPath th hin mt ng i trong th
khung cnh.

SceneGraphPath Method Summary (partial list)


boolean equals(java.lang.Object o1)
Tr v true nu i tng o1 c kiu SceneGraphPath v cc d liu
thnh phn ca i tng o1 tng ng bng vi cc thnh phn d liu
ca i tng SceneGraphPath v nu gi tr ca transforms cng bng
nhau
Transform3D getTransform()
Tr v bn copy ca transform gn lin vi i tng SceneGraphPath;
tr v null nu khng c transform.
int hashCode()
boolean isSamePath(SceneGraphPath testPath)
Xc nh hai i tng i din cho cng mt ng i hay khng.
int nodeCount()
Tr v s node ca ong i.
void set(SceneGraphPath newPath)
void setLocale(Locale newLocale)
Thit lp ng i l ng i t i tng Locale n mt i tng
Locale.xc nh
void setNode(int index, Node newNode)
void setNodes(Node[] nodes)
void setObject(Node object)
http://tailieuhay.com

467

Lp trnh ha trn Java 2D v 3D


void setTransform(Transform3D trans)
java.lang.String toString()
Cc phng thc picking ca BranchGroup v Local Picking
y l tng thp nht trong vic tnh ton picking c cung cp
trong Java 3D API.
BranchGroup and Locale picking methods for use with PickShape
SceneGraphPath[] pickAll(PickShape pickShape)
Tr v mng tham chiu cc node nm dui BranchGroup,c th pick
v c giao ct vi i tng PickShape.
SceneGraphPath[] pickAllSorted(PickShape pickShape)
Tr v mt mng cc c th t tham chiu n cc thnh phn c th
pick oc v c giao ct vi i tng pickShape. Phn t [0] tham
chiu n thnh phn nm gn i tng PickShape nht
SceneGraphPath pickClosest(PickShape pickShape)
SceneGraphPath pickAny(PickShape pickShape)

4.6.3 Cc lp picking
Nhng lp picking ni chung c dng hiu qu trong vic to ra
cc picking behavior . Cc lp : PickMouseBehavior, PickObject,v
PickCallback.
PickMouseBehavior Class
Lp c s cung cp cc phng thc picking behavior.Lp ny cn
rt hiu qu trong vic xy dung cc picking class sau ny bng vic
tha k n.
PickMouseBehavior Method Summary
http://tailieuhay.com

468

Lp trnh ha trn Java 2D v 3D


Gi : com.sun.j3d.utils.behaviors.picking
Tha k : Behavior
void initialize()
Phng thc ny cn c vit cung cp cc trng thi ban u v
cc iu kin trigger ban u.
void processStimulus(java.util.Enumeration criteria)
void updateScene(int xpos, int ypos)

PickObject Class
Lp PickObject cung cp cc phng thc xc nh i tng no
oc chn bi hnh ng pick ca ngi dng.
PickObject Constructor Summary
Gi: com.sun.j3d.utils.behaviors.picking
Tha k : java.lang.Object
PickObject(Canvas3D c, BranchGroup root)
Hm to PickObject.

PickObject Method Summary (partial list)


Lp PickObject c nhiu phng thc tnh ton s giao ct ca mt
i tng pickRay vi i tng th khung cnh..
PickShape generatePickRay(int xpos, int ypos)
Khi to mt i tng PickRay bt u t v tr ca viewer v tr ti
im xc nhtheo huwonsg xc nh.
PickObject Method Summary (partial list - continued)

http://tailieuhay.com

469

Lp trnh ha trn Java 2D v 3D


SceneGraphPath[] pickAll(int xpos, int ypos)
Tr v mt mng tham chiu tt c cc thnh phn nm di
BranchGroup c giao ct vi mt ray bt u t v tr viewer v tr ti
khung hnh theo hng v em ti xc nh
SceneGraphPath[] pickAllSorted(int xpos, int ypos)
Tng t phng thc trn nhng mng tr v c sp xp theo th t.
SceneGraphPath pickAny(int xpos, int ypos)
Tr v tham chiu n mt i tng nm di BranchGroup c giao
ct vi mt ray bt u t v tr viewer v tr ti khung hnh theo hng
v em ti xc nh
SceneGraphPath pickClosest(int xpos, int ypos)
Node pickNode(SceneGraphPath sgPath, int node_types)
Tr v mt i tng Node c kiu xc nh v c cha i tng
SceneGraphPath

xc

nh

gi

tr

ca

kiu

node:

PickObject.BRANCH_GROUP,
PickObject.GROUP,

PickObject.LINK,

PickObject.MORPH,

PickObject.PRIMITIVE,
PickObject.SHAPE3D,

PickObject.SWITCH,

PickObject.TRANSFORM_GROUP.
Node pickNode(SceneGraphPath sgPath, int node_types, int
occurrence)

PickingCallback Interface
Giao din PickingCallback cung cp mt khng lm vic tha k
mt lp picking c trc.
Interface PickingCallback Method Summary

http://tailieuhay.com

470

Lp trnh ha trn Java 2D v 3D


Gi: com.sun.j3d.utils.behaviors.picking
void transformChanged(int type, TransformGroup tg)
Lp Intersect
Lp cung cp cc phng thc kim tra vic qiao ct ca mt i
tng PickShape (core class) vi mt i tng geometry primitives.
Intersect Constructor Summary
Gi: com.sun.j3d.utils.behaviors.picking
Tha k : java.lang.Object
Intersect()
Hm to Intersect.

Intersect Method Summary (partial list)


boolean pointAndLine(PickPoint point, Point3d[] coordinates, int
index)
Tr v true nu nh i tng PickPoint v i tng Line giao nhau.
Lien uc xc nh bi tham s u vo.
boolean pointAndPoint(PickPoint point, Point3d pnt)
Tra v true nu i tng PickPoint v i tng Point3d giao ct nhau.
boolean rayAndLine(PickRay ray, Point3d[] coordinates, int index,
double[] dist)
boolean rayAndPoint(PickRay ray, Point3d pnt, double[] dist)
boolean rayAndQuad(PickRay ray, Point3d[] coordinates, int index,
double[] dist)
boolean rayAndTriangle(PickRay ray, Point3d[] coordinates, int
index,

http://tailieuhay.com

471

Lp trnh ha trn Java 2D v 3D


double[] dist)
boolean

segmentAndLine(PickSegment

segment,

Point3d[]

coordinates, int index,


double[] dist)
Intersect Method Summary (partial list - continued)
boolean segmentAndPoint(PickSegment segment, Point3d pnt,
double[] dist)
boolean

segmentAndQuad(PickSegment

segment,

Point3d[]

coordinates, int index,


double[] dist)
boolean

segmentAndTriangle(PickSegment

segment,

Point3d[]

coordinates,
int index, double[] dist)

4.6.4 Cc lp Picking Behavior


Gi com.sun.j3d.utils.behaviors.picking cung cp cc lp
PickRotateBehavior
Lp PickRotateBehavior cho php ngi dng tong tc pick v
rotate i tng trc quan.
PickRotateBehavior Constructor Summary
Gi: com.sun.j3d.utils.behaviors.picking
Tha k : PickMouseBehavior
Thc this: PickingCallback
PickRotateBehavior(BranchGroup root, Canvas3D canvas, Bounds
bounds)

http://tailieuhay.com

472

Lp trnh ha trn Java 2D v 3D


PickRotateBehavior(BranchGroup root, Canvas3D canvas, Bounds
bounds,
int pickMode)
Giptr

PickMode

PickObject.USE_BOUNDS

hay

PickObject.USE_GEOMETRY. Note: If pickMode is set


to PickObject.USE_GEOMETRY, all geometry objects in the scene
graph intended to be available for picking
must have their ALLOW_INTERSECT bit set.

PickRotateBehavior Method Summary


void setPickMode(int pickMode)
Thit

lp

gi

tr

pickMode:

nhn

mt

trong

cc

gi

tr

PickObject.USE_BOUNDS hay
PickObject.USE_GEOMETRY.
void setupCallback(PickingCallback callback)
void transformChanged(int type, Transform3D transform)
void updateScene(int xpos, int ypos)
PickTranslateBehavior
Lp PickTranslateBehavior cho php ngi dung tng tc pick v
translate

tng

trc

quan.

Mt

th

hin

ca

lp

PickTranslateBehavior c th uc s dng kt hp vi cc i tng


tca cc lp picking khc.
PickTranslateBehavior Constructor Summary
Gi : com.sun.j3d.utils.behaviors.picking
Tha k : PickMouseBehavior

http://tailieuhay.com

473

Lp trnh ha trn Java 2D v 3D


Thc thi: PickingCallback
PickTranslateBehavior(BranchGroup

root,

Canvas3D

canvas,

Bounds bounds)
Khi to hnh vi pick/translate ch s kin t chut trong th khung
cnh
PickTranslateBehavior(BranchGroup

root,

Canvas3D

canvas,

Bounds bounds,
int pickMode)

PickTranslateBehavior Method Summary


void setPickMode(int pickMode)
Thit lp gi tr thnh phn pickMode
void setupCallback(PickingCallback callback)
ng k lp callback c gi mi khi i tng c kch hat.
void transformChanged(int type, Transform3D transform)
void updateScene(int xpos, int ypos)
PickZoomBehavior
Lp PickZoomBehavior cho php ngi dung tng tc pick v zoom
i tng trc quan. Mt th hin ca lp PickZoomBehavior c th uc
s dng kt hp vi cc i tng tca cc lp picking khc.
PickZoomBehavior Constructor Summary
Gi: com.sun.j3d.utils.behaviors.picking
Tha k : PickMouseBehavior
Thc thi: PickingCallback

http://tailieuhay.com

474

Lp trnh ha trn Java 2D v 3D


PickZoomBehavior(BranchGroup root, Canvas3D canvas, Bounds
bounds)
Khi to hnh vi pick/zoom ch s kin t chut trong th khung
cnh
PickZoomBehavior(BranchGroup root, Canvas3D canvas, Bounds
bounds,
int pickMode)

PickZoomBehavior Method Summary


void setPickMode(int pickMode)
Thit lp gi tr thnh phn pickMode .
void setupCallback(PickingCallback callback)
ng k lp callback c gi mi khi i tng c kch hat.
void transformChanged(int type, Transform3D transform)
Phng thc Callback t lp MouseZoom.
void updateScene(int xpos, int ypos)
Cp nht khung cnh .

http://tailieuhay.com

475

Lp trnh ha trn Java 2D v 3D


CHNG 5
Hot Hnh

Trong chng ny, chng ti s trnh by cc vn c bn sau:

S dng cc lp Alpha v Interpolator

thm cc hot nh

n gin

S dng cc lp LOD

v Billboard gim khi lng tnh

ton khi to cc hot nh

S dng i tng Morph

vi cc i tng hnh vi ty chnh

to hot nh t cc khung hnh chnh


To i tng hnh hc ng to Behavior hiu chnh d liu
BY_REFERENCE.
Trong th gii o, c rt nhiu i tng trc quan thay i c lp vi
hnh ng ca con ngi. V nh mt chic ng h o chng hn, n c
th hot ng m khng cn tng tc ca ngi dng. Chic ng h
chnh l mt v d v hot nh. Vy hot nh l nhng thay i xy ra
trong v tr o m khng c tng tc trc tip ca con ngi. Ngc li,
nhng thay i xy ra trong v tr o m l kt qu trc tip ca hnh
http://tailieuhay.com

476

Lp trnh ha trn Java 2D v 3D


ng ngi dng th c gi l tng tc (chng ta xt trong chng
4).
Animation - Hot hnh:
Tng t nh phn tng tc, hot nh trong Java 3D cng c ci
t nh s dng i tng Behavior (hnh vi). Bt c hot nh no cng
c th to ra c vi cc i tng hnh vi. Tuy nhin, Java 3D API
cung cp mt tp cc lp cho php to hot nh m khng phi to mt
lp mi. Cc lp ny u k tha lp Behavior.
Java 3D cung cp mt tp cc lp hot nh c vai tr nh nhng b
ni suy (Interpolator ). i tng Interpolator cng vi mt i tng
Alpha iu khin mt vi thng s ca i tng th khung cnh
to ra hot nh da thi gian. i tng Alpha cung cp c ch nh thi
gian. Chi tit v hai lp i tng ny s c bn n trong mc 5.2.
Mt tp cc lp hot nh khc trong Java 3D to hot nh cho cc i
tng trc quan nh p ng s thay i v khung nhn. Tp cc lp ny
(bao gm: lp OrientedShape3D, cc lp hnh vi Billboard v Level Of
Detail (LOD )) khng c iu khin bi cc khong thi gian m bi
v tr v hng ca khung nhn. Hai lp hnh vi s c xt k hn trong
cc mc 5.3 v 5.5
Mt vi lp hot nh khng k tha t lp Behavior nh:
OrientedShape3D v Morph . Mc 5.4 s trnh by v OrientedShape3D,
lp hot nh c a vo Java 3D API t phin bn v1.2 nh mt s
thay th cho hnh vi Billboard trong cc phin bn trc . Mc 5.6
trnh by v Morph , lp hot nh c s dng c trong cc ng dng
hot nh v ni suy.

http://tailieuhay.com

477

Lp trnh ha trn Java 2D v 3D

Hnh 5-1. S phn cp cc lp hot nh k tha Behavior


i tng Interpolator v Alpha vi hot nh da thi gian
i tng Alpha sinh ra mt gi tr nm trong khong t 0 n 1 ty
thuc vo thi gian v cc tham s ca i tng Alpha. Thc th ni suy
(Interpolator ) l cc i tng hnh vi ty chnh s dng mt i tng
Alpha sinh hot nh cho cc i tng trc quan. Ni suy bao gm s
thay i v tr, hng, ln, mu sc hoc trong sut ca i tng.
Cc hnh vi ni suy c th c ci t bng cch to ra mt lp hnh vi
ty chnh, tuy nhin, s dng lp ni suy cho php to hot nh d dng
hn nhiu. Trong phn 5.2.3, chng ta s xt mt v d s dng lp ni
suy RotationInterpolator.
Alpha
i tng Alpha sinh ra mt gi tr, c gi l gi tr Alpha, nm
trong khong t 0.0 v 1.0, k c hai u mt. Gi tr Alpha thay i theo
thi gian nh nh sn bi cc tham s ca i tng Alpha. Vi cc
b gi tr tham s nht nh, ti thi im c th, i tng Alpha ch
sinh ra mt gi tr Alpha duy nht. Biu din bng th gi tr Alpha so
vi thi gian, chng ta s c mt dng sng m i tng Alpha sinh
ra.
th dng sng ca i tng Alpha c bn on: Alpha tng,
Alpha bng 1, Alpha gim v Alpha bng 0. Bn on ny to thnh mt
http://tailieuhay.com

478

Lp trnh ha trn Java 2D v 3D


chu k ca dng sng Alpha v tng ng vi bn tham s ca i tng
Alpha. Thi gian ca mt chu k c xc nh bng mt s nguyn, n
v tnh l mili giy. Hnh 5-2 biu din bn on ca dng sng Alpha.
Vic nh thi gian ca cc i tng Alpha c lin h vi thi im
khi ng chng. Thi im khi ng ca tt c cc i tng Alpha
u c ly t thi im khi ng h thng. V th tuy cc i tng
Alpha c to ra cc thi im khc nhau, nhng chng u c chung
mt thi im khi ng. Kt qu l, tt c cc i tng ni suy mc d
da trn cc i tng Alpha khc nhau nhng u c ng b ha.
Dng sng ca cc i tng Alpha c th bt u nhng thi im
khc nhau. Chu k dng sng u tin ca mt i tng Alpha c th b
tr do vic s dng mt trong hai hoc c hai tham s: TriggerTime (thi
im kch hot) v PhaseDelayDuration (thi gian tr). TriggerTime xc
nh khong thi gian t lc i tng Alpha khi ng cho n khi bt
u hot ng. Sau khong thi gian xc nh

bi tham s

PhaseDelayDuration tnh t thi im kch hot TriggerTime, chu k ca


dng sng u tin bt u. Cc tham s ny c th hin trong hnh 5-2.
Dng sng ca i tng Alpha c th quay vng mt chu k, tip tc
quay vng vi s ln xc nh hoc s quay vng khng dng. S chu k
ca sng xc nh bi tham s loopCount. loopCount dng qui nh s
chu k, loopCount bng 1 xc nh vng lp khng dng. Nu dng sng
Alpha quay vng hn 1 chu k, tt c cc giai on trn u c lp li,
ngoi tr giai on tr.

http://tailieuhay.com

479

Lp trnh ha trn Java 2D v 3D

Hnh 5-2. Cc giai on ca dng sng Alpha


Dng sng Alpha c th khng s dng tt c bn giai on trn m
c th c to thnh t mt, hai, ba hoc bn giai on. Hnh 5-3 biu
din mt s dng sng to bi mt, hai hoc ba giai on.
i tng Alpha c hai kiu ch nh cc tp con giai on c s
dng. Kiu INCREASING_ENABLE ch nh s dng cc giai on
Alpha tng v giai on Alpha bng 1. Kiu DECREASING_ENABLE
ch nh s dng giai on Alpha gim v Alpha bng 0. Kiu th ba l
kt hp ca c hai kiu trn, ch nh s dng c bn giai on.

Hnh 5-3. Mt vi dng sng c s c to vi i tng Alpha

http://tailieuhay.com

480

Lp trnh ha trn Java 2D v 3D


Cc c t v kiu ca i tng Alpha s v hiu cc thit lp tham
s khong thi gian. V d, khi kiu l INCREASING_INABLE, th cc
tham s DecreasingAlphaDuration, DecreasingAlphaRampDuration v
AlphaAtZeroDuration s b b qua. Mc d bt k mt dng sng no
cng c th xy dng c bng cch cho khong thi gian tn ti ca
cc giai on khng cn thit bng 0, tuy nhin, vic c t chnh xc kiu
s lm tng hiu qu ca i tng Alpha.
S dng cc i tng Interpolator v Alpha:
Cch thc s dng cc i tng Interpolator v Alpha rt ging
vi cch thc s dng i tng hnh vi. im khc bit ln nht so vi
cch s dng i tng hnh vi chnh l vic gp cng vi i tng
Alpha.
Cng thc s dng cc i tng Interpolator v Alpha c th tm
tt nh sau:
1. to i tng ch vi cc kh nng thch hp
2. to i tng Alpha
3. to i tng Interpolator tham chiu n n i tng Alpha

v i tng ch
4. thm cc gii hn cho i tng Interpolator
5. thm i tng Interpolator vo th khung cnh

Hnh 5-4. Cng thc s dng cc i tng Interpolator v Alpha


to hot nh
V d s dng lp Alpha v RotationInterpolator:
ClockApp.java l mt v d s dng lp RotationInterpolator. Khung
cnh l mt mt chic ng h. Chic ng h ny c iu khin quay

http://tailieuhay.com

481

Lp trnh ha trn Java 2D v 3D


mi pht mt ln bi hai i tng RotationInterpolator v Alpha.
Chng trnh y xin xem phn ph lc, y chng ti ch trch rt
mt phn tp trung vo vn chnh.
Trong chng trnh ny, i tng ch l mt i tng
TransformGroup. Yu cu i tng ny phi c thit lp kh nng
ALLOW_TRANSFORM_WRITE. Cc i tng Interpolator

khc

nhau s hot ng trn cc i tng ch khc nhau. V d, ch ca i


tng ColorInterpolator l mt i tng Material. i tng
Interpolator thit lp gi tr ca i tng ch da vo cc gi tr ca
i tng Alpha v cc gi tr do chnh n lu gi.
i tng Interpolator nh ngha im kt thc ca hot nh.
Trong trng hp ca RotationInterpolator, i tng ny xc nh gc
quay bt u v kt thc. i tng Alpha iu khin hot nh tng ng
vi thi gian v cch m Interpolator dch chuyn t im ny n mt
im khc bng c t cc giai on ca dng sng Alpha.
ng dng ny s dng thit lp mc nh cho i tng
RotationInterpolator vi gc bt u l 0 v gc kt thc l 2 (mt vng
quay hon chnh). Trc quay mc nh l trc y. i tng Alpha c
thit lp ch quay khng dng (loopCount = -1) vi qung thi gian
l 1 pht (60.000 mili giy). Hai i tng ny kt hp vi nhau s lm
cho i tng trc quan (i tng ch) quay mt vng hon chnh trong
1 pht. Chu trnh ny c tip din v lp li ngay lp tc. Kt qu l
chic ng h dng nh quay khng ngng ch khng phi l quay mt
vng ri bt u li mt vng khc.
on m sau nh ngha phng thc createSceneGraph trong chng
trnh ClockApp.java. on m ny c nh du cc bc tng ng
vi cng thc a ra trong hnh 5-4.
public BranchGroup createSceneGraph() {
http://tailieuhay.com

482

Lp trnh ha trn Java 2D v 3D


// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
// create target TransformGroup with
Capabilities
TransformGroup

objSpin

new

TransformGroup();
objSpin.setCapability(TransformGroup.ALL
OW_TRANSFORM_WRITE);
// create Alpha that continuously
rotates with a period of 1 minute
Alpha alpha = new Alpha (-1, 60000);
// create rotation about y-axis
RotationInterpolator

rotInt

new

RotationInterpolator (alpha, objSpin);


rotInt.setSchedulingBounds(new
BoundingSphere());
objRoot.addChild(objSpin);
objSpin.addChild(new Clock());
objRoot.addChild(rotInt);
Background

background

new

Background();
background.setColor(1.0f, 1.0f, 1.0f);
background.setApplicationBounds(new
BoundingSphere());

http://tailieuhay.com

483

Lp trnh ha trn Java 2D v 3D


objRoot.addChild(background);
// Let Java 3D perform optimizations on this
scene graph.
objRoot.compile();
return objRoot;
} // end of CreateSceneGraph method of
ClockApp
Hnh 5-5 l mt cnh c to ra bng chng trnh ClockApp ti 4:30.
Mt ng h trng b nghing i l do c mt y quay theo trc thng
ng.
Lm trn dng sng Alpha
Ngoi khong thi gian ca 4 giai on nh trnh by, ngi lp
trnh cn c th xc nh cc sn thoi cho giai on Alpha tng v
Alpha gim. Trong on thoi ny, gi tr Alpha thay i dn dn. Trong
trng hp lp trnh cho vt th chuyn ng, th cch ny cho php vt
th chuyn ng chm dn hoc nhanh dn trng ging tht hn.
V gi tr ca on dc thoi tc ng n c phn bt u v kt thc
ca giai on, nn on ny ln nht ch bng mt na ca c giai on.

http://tailieuhay.com

484

Lp trnh ha trn Java 2D v 3D

Hnh 5-5. Mt cnh sinh bi chng trnh ClockApp ti 4:30


Hnh 5-6 biu din mt dng sng Alpha c thit lp c

Hnh 5-6. Lm trn dng sng Alpha


AlphaApp.java (xem ph lc) l mt chng trnh v d v tc ng
ca vic thit lp IncreasingAlphaRampDuration trn mt dng sng
Alpha. S khc bit v gi tr s c nh gi trc quan qua vic quan
st chuyn ng ca 3 chic t. C 3 chic ny xut pht ti cng mt
ta x v di chuyn song song vi nhau. Chic xe trn cng khng c
on gi tr Alpha thoi, chic di cng c on thoi vi gi tr ln
nht (bng mt na ca giai on Alpha tng hoc gim), cn chic

http://tailieuhay.com

485

Lp trnh ha trn Java 2D v 3D


gia c on thoi vi gi tr bng mt na gi tr ln nht (tc l bng
giai on Alpha tng hoc gim). Mi xe cn 2 giy chuyn ng qua
khung nhn.
Time ~ 0.4s

Time ~ 1.2s

Time ~ 0.8s

Time ~ 1.6s

Hnh 5-7. Tc dng ca IncreasingAlphaRampDuration trn mt dng


sng Alpha
Hnh 5-7 biu din 4 cnh sinh ra t chng trnh AlphaApp. Quan
st chng trnh, chng ta c th nhn thy rng: ban u chic xe trn
cng (khng c on thoi) chuyn ng nhanh hn v gi nguyn tc
http://tailieuhay.com

486

Lp trnh ha trn Java 2D v 3D


, hai chic pha di chuyn ng chm hn nhng nhanh dn. n
thi im 1 giy sau khi khi ng, c 3 chic u i c qung ng
ging nhau. Trong mt na qung ng cn li, v tr ca 3 chic xe b
o ngc vi chic di cng chy nhanh nht nhng chm dn. Cui
cng, khi ht 2 giy, 3 chic xe li bt kp nhau.
Alpha API:
Lp Alpha c vai tr chuyn i mt gi tr thi gian v mt gi tr
Alpha (gi tr nm trong khong t 0 n 1, k c hai u mt). V vy,
c th ni i tng Alpha l mt hm ca thi gian, tr v mt gi tr
nm trong on [0, 1]. ng dng thng thng ca Alpha l cung cp gi
tr Alpha cho cc hnh vi Interpolator .
Cc phng thc API ca lp Alpha c th ty bin mt cch d
dng s dng trong cc ng dng bng cch tc ng vo cc tham s
ca chng. 4 phng thc khi to ch yu sau xut hin trong hu ht
cc ng dng Alpha:
Alpha()
Khi to i tng Alpha vi mode = INCREASING_ENABLE,
loopCount = -1, increasingAlphaDuration = 1000, tt c cc tham s khc
= 0, ngoi tr thi gian khi ng: StartTime. StartTime c thit lp
bng thi gian khi ng ca chng trnh.
Alpha(int loopCount, long increasingAlphaDuration)
Khi to i tng Alpha vi hai tham s loopCount v
increasingAlphaDuration l ty bin ca ngi dng, thit lp ch
INCREASING_ENABLE v gn gi tr 0 cho tt c cc tham s cn li
(ngoi tr StartTime).
Alpha(int loopCount, long triggerTime,
long phaseDelayDuration, long increasingAlphaDuration,
long increasingAlphaRampDuration,

http://tailieuhay.com

487

Lp trnh ha trn Java 2D v 3D


long alphaAtOneDuration)
Khi to i tng Alpha ch INCREASING_ENABLE
Alpha(int loopCount, int mode, long triggerTime,
long phaseDelayDuration, long increasingAlphaDuration, long
increasingAlphaRampDuration,
long alphaAtOneDuration, long decreasingAlphaDuration, long
alphaAtZeroDuration)
Khi to i tng Alpha theo cc tham s nh ngha ca ngi dng.
Lp Alpha cung cp rt nhiu cc phng thc hu ch, cho php
ngi dng tu bin cc c tnh ca i tng Alpha. Chng ti lit k
y mt vi phng thc ph dng nht. Ch rng mi phng thc set
(phng thc thit lp) u c mt phng thc get (khng tham s) tr
v mt gi tr cng kiu vi kiu ca tham s c mt trong phng thc
set tng ng.
boolean finished()
Kim tra xem i tng Alpha hin thi kt thc mi hot ng
ca n hay cha.
void setAlphaAtOneDuration(long alphaAtOneDuration)
Thit lp thuc tnh alphaAtOneDuration ca i tng Alpha hin
thi n gi tr xc nh.
void setAlphaAtZeroDuration(long alphaAtZeroDuration)
Thit lp gi tr xc nh cho thuc tnh alphaAtZeroDuration ca i
tng Alpha hin thi.
void setDecreasingAlphaDuration(long decreasingAlphaDuration)
Thit lp gi tr xc nh cho thuc tnh decreasingAlphaDuration ca
i tng Alpha hin thi.
void setDecreasingAlphaRampDuration(long
decreasingAlphaRampDuration)
Thit

lp

http://tailieuhay.com

gi

tr

xc

nh

cho

thuc

tnh
488

Lp trnh ha trn Java 2D v 3D


decreasingAlphaRampDuration ca i Alpha tng hin thi.
void setIncreasingAlphaDuration(long increasingAlphaDuration)
Thit lp gi tr xc nh cho thuc tnh increasingAlphaDuration ca
i tng Alpha hin thi.
void setIncreasingAlphaRampDuration(long
decreasingAlphaRampDuration)
Thit

lp

gi

tr

xc

nh

cho

thuc

tnh

increasingAlphaRampDuration ca i tng Alpha hin thi.


void setLoopCount(int loopCount)
Thit lp gi tr xc nh cho thuc tnh loopCount ca i tng
Alpha hin thi.
void setMode(int mode)
Thit lp ch xc nh bi i s mode cho i tng Alpha hin
thi.

mode

th

INCREASING_ENABLE

hoc

DECREASING_ENABLE, hay l hoc ca hai gi tr.


INCREASING_ENABLE - ch nh s dng giai on 3 v 4
DECREASING_ENABLE - ch nh s dng giai on 1 v 2
void setPhaseDelayDuration(long phaseDelayDuration)
Thit lp gi tr phaseDelayDuration ca i tng Alpha hin thi
bng gi tr cho trong i s.
void setStartTime(long startTime)
Thit lp gi tr startTime ca i tng Alpha hin thi bng gi tr
cho trong i s. startTime quy nh mc cho mi tnh ton thi gian
tng i. Gi tr mc nh ca startTime l thi im khi ng h
thng.
void setTriggerTime(long triggerTime)
Thit lp gi tr triggerTime ca i tng Alpha hin thi bng gi
tr cho trong i s.
http://tailieuhay.com

489

Lp trnh ha trn Java 2D v 3D


float value()
Tr v mt gi tr nm trong on [0, 1] da trn thi gian hin thi v
i s time-to-Alpha c thit lp cho i tng Alpha ang xt.
float value(long atTime)
Tr v mt gi tr nm trong on [0, 1] da trn gi tr atTime v i
s time-to-Alpha c thit lp cho i tng Alpha ang xt.
Cc lp hnh vi Interpolator :
Interpolator l mt lp tru tng, k tha lp hnh vi Behavior
cung cp cc phng thc chung cho cc lp con ni suy. C khong hn
10 lp con Interpolator c bn. Hnh 5-8 biu din mi quan h ca cc
lp Interpolator c s ( sng mu) trong Java 3D cng cc gi tin ch
( sm mu).

Hnh 5-8. Biu phn cp lp i tng Interpolator c s trong Java


3D v cc tin ch
Mi i tng ni suy Interpolator

l mt i tng hnh vi

Behavior ty bin c c ch kch hot nh thc mi khung nh.


Trong phng thc processStimulus, i tng Interpolator kim tra
gi tr ca i tng Alpha lin hp vi n, hiu chnh i tng ch
da trn cc gi tr ny ri xc lp li c ch kch hot nh thc
khung nh tip theo (tr phi i tng Alpha kt thc hot ng). Mt

http://tailieuhay.com

490

Lp trnh ha trn Java 2D v 3D


vi phng thc ny c cung cp bi lp tru tng Interpolator , cn
hu ht cc hnh vi cn li c ci t trong mi lp Interpolator n
l.
Mi i tng Interpolator cha 2 gi tr c s dng nh cc
im gii hn cho cc hnh ng c ni suy. V d, i tng ni suy
RotationInterpolator lu tr hai gc l gii hn quay do n iu khin.
Vi mi khung nh, i tng Interpolator kim tra gi tr Alpha ca
i tng Alpha lin hp vi n ri to ra cc hiu chnh quay thch hp
cho i tng ch TransformGroup ca n. Nu gi tr Alpha l 0 th
mt trong hai gi tr s c s dng; nu gi tr Alpha l 1, th gi tr kia
s c s dng. Nu gi tr Alpha nm trong khong t 0 n 1, i
tng Interpolator s ni suy tuyn tnh gia hai gi tr, da trn gi tr
Alpha ri s dng kt qu iu chnh i tng ch.
M t chung chung v cc i tng Interpolator nh vy khng
ng lm vi cc lp SwitchValueInterpolator v PathInterpolator. i
tng SwitchValueInterpolator la chn mt nt con trong nhm cc nt
ch Switch, nn trong lp ny, khng h c qu trnh ni suy.
Tuy rng cc lp Interpolator rt ging nhau, chng cng mang mt
vi chi tit khc nhau d nhn ra. Bng sau so snh cc c im khc
nhau ca 7 lp Interpolator c bn. Trong cc phn sau, chng ta ln
lt s i su hn v 7 lp ny.
lp Interpolator
ColorInterpolator

chc nng
thay i

kiu i tng ch
mu Material

Trang
5-12

khuych tn ca
PathInterpolator
PositionInterpolator

mt i tng
lp tru tng TransformGroup
thay i v tr TransformGroup

5-20
5-14

RotationInterpolator

ca i tng
thay i chuyn TransformGroup

5-15

http://tailieuhay.com

491

Lp trnh ha trn Java 2D v 3D


ng

quay

(hng) ca i
ScaleInterpolator

tng
thay i kch c TransformGroup

ca i tng
SwitchValueInterpolator la chn mt Switch

5-16
5-17

thay i (switch)
trong mt b cc
i tng
TransparencyInterpolator thay i mc TransparencyAttributes 5-19
trong sut ca
i tng
Bng 5-1. Tm tt cc lp Interpolator c bn
Ch : PathInterpolator l mt lp tru tng, nn khng c i
tng ch. Tuy nhin, bt c lp no tha k lp ny u c i tng
ch thuc kiu Transformation.
hiu thm hiu ng ca cc Interpolator

ny, hy xem v d

InterpolatorApp.java (chi tit phn ph lc). Trong chng trnh ny,


mi i tng Interpolator c iu khin bi mt i tng Alpha
n. Cc thay i v v tr, quay, ln, mu sc, trong sut, v i
tng trc quan c to ra bi cc i tng PositionInterpolator,
RotationInterpolator,

ScaleInterpolator,

ColorInterpolator,

TransparencyInterpolator, v SwitchValueInterpolator tng ng.

http://tailieuhay.com

492

Lp trnh ha trn Java 2D v 3D

Hnh 5-9. InterpolatorApp.java


M ca chng trnh Interpolator.java
package Animation;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import javax.media.j3d.*;

http://tailieuhay.com

493

Lp trnh ha trn Java 2D v 3D


import javax.vecmath.*;

//

InterpolatorApp renders an

public class InterpolatorApp extends Applet {


Shape3D createCar(float xScale, float yScale,
boolean createNormals,
boolean assignColoring) {
Shape3D car = new Shape3D();
QuadArray carGeom = null;
if (createNormals)
carGeom

new

QuadArray(16,

GeometryArray.COORDINATES
|
GeometryArray.NORMALS);
else
carGeom

new

QuadArray(16,

GeometryArray.COORDINATES);
carGeom.setCoordinate(

0,

new

Point3f(xScale*-0.25f, yScale*0.22f, 0.0f));


carGeom.setCoordinate(

1,

new

Point3f(xScale* 0.20f, yScale*0.22f, 0.0f));


carGeom.setCoordinate(

2,

new

Point3f(xScale* 0.10f, yScale*0.35f, 0.0f));

http://tailieuhay.com

494

Lp trnh ha trn Java 2D v 3D


carGeom.setCoordinate(

3,

new

Point3f(xScale*-0.20f, yScale*0.35f, 0.0f));


carGeom.setCoordinate(

4,

new

Point3f(xScale*-0.50f, yScale*0.10f, 0.0f));


carGeom.setCoordinate(

5,

new

Point3f(xScale* 0.50f, yScale*0.10f, 0.0f));


carGeom.setCoordinate(

6,

new

Point3f(xScale* 0.45f, yScale*0.20f, 0.0f));


carGeom.setCoordinate(

7,

new

Point3f(xScale*-0.48f, yScale*0.20f, 0.0f));


carGeom.setCoordinate(

8,

new

Point3f(xScale*-0.26f, yScale*0.00f, 0.0f));


carGeom.setCoordinate(

9,

new

Point3f(xScale*-0.18f, yScale*0.00f, 0.0f));


carGeom.setCoordinate(10,

new

Point3f(xScale*-0.16f, yScale*0.12f, 0.0f));


carGeom.setCoordinate(11,

new

Point3f(xScale*-0.28f, yScale*0.12f, 0.0f));


carGeom.setCoordinate(12,

new

Point3f(xScale* 0.25f, yScale*0.00f, 0.0f));


carGeom.setCoordinate(13,

new

Point3f(xScale* 0.33f, yScale*0.00f, 0.0f));


carGeom.setCoordinate(14,

new

Point3f(xScale* 0.35f, yScale*0.12f, 0.0f));


carGeom.setCoordinate(15,

new

Point3f(xScale* 0.23f, yScale*0.12f, 0.0f));


if (createNormals){
int i;

http://tailieuhay.com

495

Lp trnh ha trn Java 2D v 3D


Vector3f normal = new Vector3f(0.6f,
0.6f, 0.8f);
for(i = 0; i < 8; i++)
carGeom.setNormal(i, normal);
normal.set(new Vector3f(0.5f, 0.5f,
0.5f));
for(i = 8; i <16; i++)
carGeom.setNormal(i, normal);
}
if (assignColoring){
ColoringAttributes colorAttrib =
new ColoringAttributes(0.0f,
0.0f, 1.0f, ColoringAttributes.NICEST);
Appearance

carAppear

new

Appearance();
carAppear.setColoringAttributes(color
Attrib);
car.setAppearance(carAppear);
}
car.setGeometry(carGeom);
return car;
}
public BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
Transform3D t3d = new Transform3D();

http://tailieuhay.com

496

Lp trnh ha trn Java 2D v 3D


BoundingSphere

bounds

new

BoundingSphere();
// create target TransformGroup with
Capabilities
TransformGroup

objMove

new

TransformGroup();
objMove.setCapability(TransformGroup.ALLO
W_TRANSFORM_WRITE);
// create target TransformGroup with
Capabilities
TransformGroup

objRotate

new

TransformGroup();
objRotate.setCapability(TransformGroup.AL
LOW_TRANSFORM_WRITE);
// create target TransformGroup with
Capabilities
TransformGroup

objScale

new

TransformGroup();
objScale.setCapability(TransformGroup.ALL
OW_TRANSFORM_WRITE);
//

create

target

Material

with

Capabilities
Material objColor = new Material();
objColor.setCapability(Material.ALLOW_COM
PONENT_WRITE);

http://tailieuhay.com

497

Lp trnh ha trn Java 2D v 3D

// create target Transparency with


Capabilities
TransparencyAttributes objTransp = new
TransparencyAttributes();
objTransp.setCapability(TransparencyAttri
butes.ALLOW_VALUE_WRITE);
objTransp.setTransparencyMode(Transparenc
yAttributes.BLENDED);
// create target Switch with Capabilities
Switch objSwitch = new Switch();
objSwitch.setCapability(Switch.ALLOW_SWIT
CH_WRITE);
// create Alpha
Alpha alpha = new Alpha (-1,
Alpha.INCREASING
_ENABLE + Alpha.DECREASING_ENABLE,
0, 0, 2000, 0,
1000, 2000, 0, 1000);
// create position interpolator
PositionInterpolator

posInt

new

PositionInterpolator (alpha, objMove);


posInt.setSchedulingBounds(bounds);
posInt.setStartPosition(-1.0f);
// create rotation interpolator

http://tailieuhay.com

498

Lp trnh ha trn Java 2D v 3D


RotationInterpolator

rotInt

new

new

new

RotationInterpolator (alpha, objRotate);


rotInt.setSchedulingBounds(bounds);
// create scale interpolator
ScaleInterpolator

scaInt

ScaleInterpolator (alpha, objScale);


scaInt.setSchedulingBounds(bounds);
// create color interpolator
ColorInterpolator

colInt

ColorInterpolator (alpha, objColor);


colInt.setStartColor(new Color3f(1.0f,
0.0f, 0.0f));
colInt.setEndColor(new Color3f(0.0f,
0.0f, 1.0f));
colInt.setSchedulingBounds(bounds);
// create transparency interpolator
TransparencyInterpolator traInt = new
TransparencyInterpolator (alpha, objTransp);
traInt.setSchedulingBounds(bounds);
// create switch value interpolator
SwitchValueInterpolator swiInt = new
SwitchValueInterpolator (alpha, objSwitch);
swiInt.setSchedulingBounds(bounds);

http://tailieuhay.com

499

Lp trnh ha trn Java 2D v 3D


t3d.setTranslation(new Vector3f(0.0f,
0.8f, 0.0f));
TransformGroup

objMovePos

new

TransformGroup(t3d);
objRoot.addChild(objMovePos);
objMovePos.addChild(objMove);
objMove.addChild(createCar(0.4f, 0.4f,
false, true));
objRoot.addChild(posInt);
t3d.setTranslation(new Vector3f(0.0f,
0.5f, 0.0f));
TransformGroup

objRotPos

new

TransformGroup(t3d);
objRoot.addChild(objRotPos);
objRotPos.addChild(objRotate);
objRotate.addChild(createCar(0.4f, 0.4f,
false, true));
objRoot.addChild(rotInt);
t3d.setTranslation(new Vector3f(0.0f,
0.2f, 0.0f));
TransformGroup

objScalePos

new

TransformGroup(t3d);
objRoot.addChild(objScalePos);
objScalePos.addChild(objScale);
objScale.addChild(createCar(0.4f, 0.4f,
false, true));
objRoot.addChild(scaInt);

http://tailieuhay.com

500

Lp trnh ha trn Java 2D v 3D

t3d.setTranslation(new Vector3f(0.0f,
-0.2f, 0.0f));
TransformGroup

objColorPos

new

TransformGroup(t3d);
objRoot.addChild(objColorPos);
Shape3D colorCar = createCar(0.4f, 0.4f,
true, false);
Appearance

materialAppear

new

Appearance();
materialAppear.setMaterial(objColor);
colorCar.setAppearance(materialAppear);
objColorPos.addChild(colorCar);
objRoot.addChild(colInt);
t3d.setTranslation(new Vector3f(0.0f,
-0.5f, 0.0f));
TransformGroup

objTranspPos

new

TransformGroup(t3d);
objRoot.addChild(objTranspPos);
Shape3D transpCar = createCar(0.4f, 0.4f,
false, true);
Appearance

transpAppear

transpCar.getAppearance();
transpAppear.setTransparencyAttributes(ob
jTransp);
objTranspPos.addChild(transpCar);
objRoot.addChild(traInt);

http://tailieuhay.com

501

Lp trnh ha trn Java 2D v 3D


t3d.setTranslation(new Vector3f(0.0f,
-0.8f, 0.0f));
TransformGroup

objSwitchPos

new

TransformGroup(t3d);
objRoot.addChild(objSwitchPos);
objSwitch.addChild(createCar(0.4f, 0.4f,
false, true));;
objSwitch.addChild(new ColorCube(0.1f));
objSwitchPos.addChild(objSwitch);
objRoot.addChild(swiInt);
swiInt.setLastChildIndex(2);// since
switch made after interpolator
DirectionalLight

lightD1

new

DirectionalLight();
// lightD1.setDirection(new Vector3f(-0.7f,0.7f,0.0f));
lightD1.setInfluencingBounds(bounds);
objRoot.addChild(lightD1);
Background background = new Background();
background.setColor(1.0f, 1.0f, 1.0f);
background.setApplicationBounds(new
BoundingSphere());
objRoot.addChild(background);
// Let Java 3D perform optimizations on this
scene graph.
objRoot.compile();

http://tailieuhay.com

502

Lp trnh ha trn Java 2D v 3D

return objRoot;
}

//

end

of

CreateSceneGraph

method

of

InterpolatorApp
// Create a simple scene and attach it to the
virtual universe
public InterpolatorApp() {
setLayout(new BorderLayout());
Canvas3D canvas3D = new Canvas3D(null);
add("Center", canvas3D);
BranchGroup scene = createSceneGraph();
// SimpleUniverse is a Convenience
Utility class
SimpleUniverse

simpleU

new

SimpleUniverse(canvas3D);
// This will move the ViewPlatform back a bit
so the
// objects in the scene can be viewed.
simpleU.getViewingPlatform().setNominalVi
ewingTransform();
simpleU.addBranchGraph(scene);
} // end of InterpolatorApp (constructor)

http://tailieuhay.com

503

Lp trnh ha trn Java 2D v 3D


//

The following allows this to be run as an

application
//

as well as an applet

public static void main(String[] args) {


System.out.print("InterpolatorApp.java
\n- a demonstration of using Interpolator ");
System.out.println("objects to provide
animation in a Java 3D scene.");
System.out.println("This is a simple
example progam from The Java 3D API Tutorial.");
System.out.println("The Java 3D Tutorial
is available on the web at:");
System.out.println("http://java.sun.com/p
roducts/java-media/3D/collateral");
Frame

frame

new

MainFrame(new

InterpolatorApp(), 256, 256);


} // end of main (method of InterpolatorApp)
} // end of class InterpolatorApp
Nhng nhm ln thng gp khi lp trnh vi Interpolator
Cc i tng Interpolator l dn sut c quan h rt gn gi vi
cc i tng hnh vi. V vy, vic s dng cc i tng Interpolator
cng s phi i mt vi cc li thng gp nh khi s dng cc i
tng hnh vi. Thm vo , cng c cc by li khc, chung cho cc
Interpolator v cc by li ring cho mi Interpolator .
Mt nhm ln thng gp gy ra bi vic khng nhn thy rng cc
i tng Interpolator thay i thng xuyn gi tr cc i tng ch
http://tailieuhay.com

504

Lp trnh ha trn Java 2D v 3D


ca chng. Ngi lp trnh c th ngh rng i tng ch
TransformGroup ca i tng RotationInterpolator c th c s dng
tnh tin i tng ngoi hot ng quay m i tng
RotationInterpolator cung cp. iu ny l hon ton sai. Tp cc bin
i ca i tng ch TransformGroup c ghi li mi ln ti khung
nh m i tng Alpha hot ng. iu ny cng c ngha rng: hai i
tng Interpolator khng th c cng mt i tng ch.
Mt li khc cng hay xy ra khi ngi lp trnh qun khng thit lp
cc kh nng thch hp cho i tng ch. Kt qu l gy ra li runtime
error.
Core Interpolator API:
Interpolator l mt lp tru tng, n ch c s dng khi cn to
mt lp con mi. Lp Interpolator ch cung cp duy nht mt hm cho
ngi s dng cc lp con ca n:
void setAlpha(Alpha Alpha)
Thit lp i tng Alpha cho i tng Interpolator hin hnh .
ColorInterpolator
i tng ColorInterpolator c i tng ch thuc kiu Material.
Interpolator ny cho php thay i thnh phn mu khuych tn ca vt
liu ch. Kh nng ny va l im mnh li cng l im hn ch ca
ColorInterpolator. im mnh th hin kh nng cho php nhiu hn
mt i tng trc quan dng chung mt i tng vt liu Material. V
vy, mt i tng ColorInterpolator cng vi mt i tng ch
Material c th tc ng ti nhiu i tng trc quan khc nhau. Hn
ch ch cc i tng trc quan vi cht liu Material NodeComponent
ch c th nhn thy khi c chiu sng.
S nhm ln thng xy ra y chnh l do s phc tp trong vic
to bng cho hnh nh. Vic s dng nh sng trong ha l kh rc

http://tailieuhay.com

505

Lp trnh ha trn Java 2D v 3D


ri, v vy n c trnh by chi tit trong mt chng ring, chng 6.
Mu sc ca thc th trc quan l s kt hp ca 3 thnh phn: phn x,
khuych tn v mu xung quanh. ColorInterpolator ch thay i mt trong
3 thnh phn, chnh l thnh phn khuych tn.
Mt li khc cng hay xy ra khi gn i tng ch Material cho i
tng Shape3D. Hnh 5-10 biu din mt phn biu th khung cnh
ca i tng ColorInterpolator vi i tng ch Material
NodeComponent.

Hnh 5-10. Mt phn biu th khung cnh ca i tng


ColorInterpolator vi i tng ch Material NodeComponent
Lp ColorInterpolator c dng ca phng thc get khc vi cc
Interpolator khc. Phng thc get ca ColorInterpolator khng phi l
phng thc khng tham s.
ColorInterpolator l mt hnh vi hiu chnh mu khuych tn ca i
tng material ch bng cch ni suy tuyn tnh gia mt cp mu cho
trc, s dng gi tr sinh ra bi i tng Alpha xc nh.
Lp ColorInterpolator c cc phng thc khi to sau:
ColorInterpolator(Alpha Alpha, Material target)
Khi to i tng Interpolator mu thng vi i tng ch cho
trc. Gi tr mu ni suy nm trong khong t mu en ti mu trng.

http://tailieuhay.com

506

Lp trnh ha trn Java 2D v 3D

ColorInterpolator(Alpha Alpha, Material target,


Color3f startColor, Color3f endColor)
Khi to i tng Interpolator mu vi i tng ch, mu bt
u, mu kt thc cho trc.
Cc phng thc thng dng khc:
void setEndColor(Color3f color)
Thit lp thuc tnh endColor cho i tng Interpolator hin thi.
Phng thc get tng ng: void getEndColor(Color3f color)
void setStartColor(Color3f color)
Thit lp thuc tnh startColor cho i tng Interpolator hin thi.
Phng thc get tng ng: void getStartColor(Color3f color)
void setTarget(Material target)
Thit lp i tng thnh phn cht liu (material) ch cho
Interpolator hin thi
Phng thc get tng ng: Material getTarget()
PositionInterpolator
i tng PositionInterpolator thay i v tr ca i tng trc quan
theo mt trc ta . Hai im dng s dng cho php ni suy c cho
di dng hai gi tr thc du phy ng cng trc ta tnh tin. Trc
tnh tin mc nh l trc x.
Cc phng thc khi to:
PositionInterpolator(Alpha Alpha, TransformGroup target)
Khi to i tng ni suy v tr Interpolator thng vi i tng
ch cho trc, trc tnh tin mc nh l x, v tr bt u startPosition l
0.0f, v tr kt thc endPosition l 1.0f.
PositionInterpolator(Alpha Alpha, TransformGroup target,
http://tailieuhay.com

507

Lp trnh ha trn Java 2D v 3D


Transform3D axisOfTranslation,
float startPosion, float endPosition)
Khi to i tng Interpolator v tr bin i thnh phn tnh tin
ca i tng TransformGroup ch theo mt trc tnh tin nht nh.
Cc phng thc khc:
void setAxisOfTranslation(Transform3D axisOfTranslation)
Thit lp trc tnh tin cho i tng Interpolator hin thi.
void setEndPosition(float position)
Thit lp v tr kt thc endPosition cho i tng Interpolator hin
thi.
void setStartPosition(float position)
Thit lp v tr bt u startPosition cho i tng Interpolator hin
thi.
RotationInterpolator
i tng RotationInterpolator bin i hng quay ca i tng
trc quan xung quanh mt trc. Hai im s dng trong php ni suy
c cho di dng hai gi tr gc du phy ng v trc quay. Gi tr ni
suy s c s dng sinh chuyn ng quay quanh trc quay. Trc
quay mc nh l trc y dng.
Cc phng thc khi to:
RotationInterpolator(Alpha Alpha, TransformGroup target)
Khi to i tng ni suy quay Interpolator thng vi i tng
ch cho trc, s dng trc quay mc nh (+Y), gc nh nht l 0.0f,
gc ln nht l 2*pi radian.
RotationInterpolator(Alpha Alpha, TransformGroup target,
Transform3D axisOfRotation,
float minimumAngle, float maximumAngle)
Khi to i tng Interpolator bin i thnh phn quay ca mt
i tng transform ch.
http://tailieuhay.com

508

Lp trnh ha trn Java 2D v 3D


Cc phng thc khc:
void setAxisOfRotation(Transform3D axisOfRotation)
Thit lp trc quay cho i tng Interpolator hin thi.
void setMaximumAngle(float angle)
Thit lp gi tr gc ln nht maximumAngle theo radian cho i
tng Interpolator hin thi.
void setMinimumAngle(float angle)
Thit lp gi tr gc nh nht minimumAngle theo radian cho i
tng Interpolator hin thi.
void setTarget(TransformGroup target)
Thit lp nt TransformGroup ch cho i tng Interpolator hin
thi.
ScaleInterpolator
Lp ScaleInterpolator nh ngha mt hnh vi bin i thnh phn t
l kch thc (gi nguyn cc tnh cht khc) ca i tng
TransformGroup ch bng cch ni suy tuyn tnh gia mt cp gi tr t
l cho trc (s dng gi tr ca i tng Alpha xc nh). Gi tr t l
ni suy c s dng sinh ra bin i t l trong h ta a phng
ca i tng Interpolator hin thi.
Cc phng thc khi to:
ScaleInterpolator(Alpha Alpha, TransformGroup target)
Khi to i tng ni suy t l bin i nt TransformGroup ch
gia hai gi tr Alpha xc nh, s dng i tng Alpha v mt ma trn
ng nht cho trc, vi t l phng b nht minimum scale = 0.1f v t l
phng ln nht maximum scale = 1.0f.
ScaleInterpolator(Alpha Alpha, TransformGroup target,
Transform3D axisOfScale,
float minimumScale, float maximumScale)

http://tailieuhay.com

509

Lp trnh ha trn Java 2D v 3D


Khi to i tng scaleInterpolator bin i thnh phn t l nt
TransformGroup ch gia hai gi tr t l (minimumScale v
MaximumScale).
Cc phng thc khc:
void setAxisOfScale(Transform3D axisOfScale)
Thit lp bin i AxisOfScale cho i tng ni suy Interpolator
hin thi.
void setMaximumScale(float scale)
Thit lp t l phng ln nht maximumScale cho i tng
Interpolator hin thi.
void setMinimumScale(float scale)
Thit lp t l phng nh nht minimumScale cho i tng
Interpolator hin thi.
void setTarget(TransformGroup target)
Thit lp i tng TransformGroup cho i tng Interpolator
hin thi.
SwitchValueInterpolator
i tng SwitchValueInterpolator khng ni suy gia cc gi tr nh
cc i tng Interpolator khc. N ch la chn mt trong cc con ca
i tng Switch. Gi tr ngng chuyn ti mt con khc c xc
nh bng cch chia on [0.0, 1.0] cho s con m i tng Switch c.
Ch rng, i tng Interpolator khng t ng cp nht khi s
con ca i tng Switch thay i. Cc gi tr chuyn i (switching
value) c xc nh ngay khi to i tng SwitchValueInterpolator.
Nn nu ban u i tng Switch khng c con, hoc khi s con ca n
thay i sau khi i tng Interpolator c to th s cc con trong
i tng Interpolator phi c cp nht. im thun li khi s dng
i tng ny l ngi lp trnh c th xc nh mt tp con cc ch mc

http://tailieuhay.com

510

Lp trnh ha trn Java 2D v 3D


i tng Interpolator s dng. Tp con ny b gii hn bi tp cc
ch mc tun t.
Cc phng thc khi to:
SwitchValueInterpolator(Alpha Alpha, Switch target)
Khi to i tng hnh vi SwitchValueInterpolator bin i ch mc
con ca nt Switch ch trong khong t 0 n n-1, trong , n l s con
ca nt Switch ch.
SwitchValueInterpolator(Alpha Alpha, Switch target,
int firstChildIndex, int lastChildIndex)
Khi to i tng hnh vi SwitchValueInterpolator bin i ch mc
con ca nt Switch ch gia hai gi tr firstChildIndex v lastChildIndex
cho trc.
Cc phng thc khc:
void setFirstChildIndex(int firstIndex)
Thit lp ch mc con u tin firstChildIndex ca i tng
Interpolator hin thi.
void setLastChildIndex(int lastIndex)
Thit lp ch mc con cui lastChildIndex ca i tng Interpolator
hin thi.
void setTarget(Switch target)
Thit lp i tng Switch ch cho i tng Interpolator hin
thi.
Trong cc tham s ca phng thc khi to SwitchValueInterpolator
c i tng Switch. Vy Switch l g?
Switch
Lp Switch k tha t lp Group v l cha ca 0 hay nhiu nhnh con
th khung cnh. i tng Switch la chn mt trong cc con ca n
biu din. N nh ngha mt gi tr la chn (switch value) c th

http://tailieuhay.com

511

Lp trnh ha trn Java 2D v 3D


chn 1 hoc chn 0 hay nhiu con ca n v nh s dng mt mt n
xc nh xem con no c biu din. i tng Switch c th s dng
c lp khng cn i tng Interpolator hay LOD .
Cc phng thc khi to:
Switch()
Khi to mt nt Switch vi cc tham s mc nh.
Switch(int whichChild)
Khi to v gn gi tr ban u cho mt nt Switch s dng ch mc
la chn con thch hp.
CHILD_ALL

- ch th tt c cc con c biu din

CHILD_MASK

- s dng mt n childMask (kiu BitSet) la

chn con thch hp


CHILD_NONE

- khng c con no c biu din

Switch(int whichChild, java.util.BitSet childMask)


Khi to v gn gi tr u cho mt nt Switch s dng ch mc la
chn v mt n cho trc.
Cc phng thc khc:
void setChildMask(java.util.BitSet childMask)
Thit lp mt n la chn con.
void setWhichChild(int child)
Thit lp ch mc la chn con xc nh con no c biu din.
Kh nng c th thit lp cho Switch:
ALLOW_SWITCH_READ | WRITE
Ch nh rng nt Switch ny cho php c la chn nt con, cc gi
tr mt n v cc con hin thi ca n.
TransparencyInterpolator
Lp TransparencyInterpolator nh ngha i tng hnh vi bin i
mc trong sut ca i tng ch thuc lp TransparencyAttributes

http://tailieuhay.com

512

Lp trnh ha trn Java 2D v 3D


bng cch ni suy tuyn tnh gia mt cp gi tr trong sut cho trc
(s dng gi tr sinh bi i tng Alpha cho trc). Nhiu hn mt i
tng trc quan c th chia s mt i tng TransparencyAttributes, v
vy mt i tng TransparencyAttributes c kh nng tc ng cng lc
n nhiu i tng trc quan khc nhau. Ch rng cc ch trong
sut khc nhau c th nh hng n cht lng biu din v s hin din
ca cc i tng trc quan.
Cc phng thc khi to:
TransparencyInterpolator(Alpha Alpha,
TransparencyAttributes target)
Khi to i tng ni suy trong sut vi i tng ch cho
trc, trong sut ti thiu l 0.0f v ti a l 1.0f.
TransparencyInterpolator(Alpha Alpha,
TransparencyAttributes target,
float minimumTransparency,
float maximumTransparency)
Khi to i tng ni suy trong sut bin i trong sut cht
liu ca i tng ch gia hai gi tr minimumTransparency v
maximumTransparency.
Cc phng thc khc:
void setMaximumTransparency(float transparency)
Thit lp gi tr maximumTransparency cho i tng Interpolator
hin thi.
void setMinimumTransparency(float transparency)
Thit lp gi tr minimumTransparency cho i tng Interpolator
hin thi.
void setTarget(TransparencyAttributes target)
Thit lp i tng ch TransparencyAttributes cho i tng
Interpolator hin thi.
http://tailieuhay.com

513

Lp trnh ha trn Java 2D v 3D


Cc lp i tng ni suy ng:
Path Interpolator (ni suy ng) khc vi cc lp ni suy khc
ch, n c th cha hai hay nhiu hn hai gi tr ni suy. Path
Interpolator

cung cp cc kh nng ni suy v tr (Position

Interpolation), ni suy quay (Rotation Interpolation); va ni suy v tr,


va ni suy quay; hoc va ni suy v tr, ni suy quay v ni suy t l
(Scale Interpolation). ch ca i tng ni suy l mt i tng
TransformGroup, i tng ny thay i v tr, hng, v t l thch hp
cho cc i tng con ca n.
Mt i tng Path Interpolator cha mt tp cc gi tr, hay cc
im mt, c s dng theo tng cp ni suy. Gi tr Alpha c vai
tr xc nh gi tr hai im no s c s dng. Gi tr cc im ny
nm trong khong t 0.0 ti 1.0, bao gm c hai u mt, tng ng vi
khong gi tr ca i tng Alpha. im mt u tin phi c gi tr l
0.0, cn im mt cui cng phi c gi tr l 1.0. Cc mt cn li c
lu tr theo trt t gi tr tng dn trong i tng ni suy ng.
Cc gi tr ca mt im mt l tng ng vi cc gi tr tham s bin
(v d nh v tr hay gc quay) c s dng trong php ni suy.Vi mi
im mt th c mt gi tr tham s xc nh lm i din. im mt c
gi tr ln nht bng hoc nh hn gi tr Alpha v gi tr ca im mt
tip theo s c s dng. Cc im mt c xc nh theo mt trt t,
theo , khi gi tr Alpha thay i, cc im mt s c s dng theo
tng cp k nhau.
Pha bn tri ca hnh 5-11 biu din cc gi tr im mt cho mt i
tng Path Interpolator ni suy v tr. Vi mc ch minh ha, chng ti
ch xt v tr trong khng gian 2 chiu. Phn gia ca hnh nh x v tr
ca i tng trc quan vi cc gi tr Alpha t 0.0 ti 1.0. Pha bn phi
l cc gi tr im mt c s dng tng ng vi cc gi tr Alpha khc

http://tailieuhay.com

514

Lp trnh ha trn Java 2D v 3D


nhau ca v d ny. Kt hp cc gi tr im mt v tham s Alpha s xc
nh hot nh.

Hnh 5-11. Quan h gia gi tr cc im mt v gi tr Alpha cho v


tr trong khng gian 2 chiu
V d s dng PathInterpolator
S dng i tng ni suy ng tun theo cng thc s dng cc i
tng ni suy khc. S khc bit l s lng bin c s dng khi
to i tng ni suy ng. Cng thc s dng c th tm tt trong hnh
sau:
1. to i tng ch vi kh nng thch hp
2. to i tng Alpha

3. to cc mng im mt v cc gi tr khc
4. to i tng ni suy ng tham chiu n i tng Alpha, i

tng ch, v mng ca cc gi tr thit lp


5. thm danh gii cho i tng ni suy
6. thm i tng ni suy ng vo th khung cnh
Hnh 5-12. Cng thc s dng i tng ni suy ng
Chng

trnh

RotPosPathApp.java

dng

tng

RotPosPathInterpolator to hot nh cho mt khi hp ColorCube qua


mt tp cc gi tr v tr v quay. i tng RotPosPathInterpolator cha
tp cc gi tr quay (mng Quat4f), v tr (mng Point3f), v cc gi tr
im mt (mng gi tr thc). Chi tit ca v d ny xin xem thm phn
ph lc.
http://tailieuhay.com

515

Lp trnh ha trn Java 2D v 3D

public BranchGroup createSceneGraph() {


// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
Alpha alpha = new Alpha(-1, 10000);
TransformGroup

target

new

new

TransformGroup();
Transform3D

axisOfRotPos

Transform3D();
float[] knots = {0.0f, 0.1f, 0.2f, 0.3f,
0.4f, 0.6f, 0.8f, 0.9f, 1.0f};
Quat4f[] quats = new Quat4f[9];
Point3f[] positions = new Point3f[9];
target.setCapability(TransformGroup.ALLOW
_TRANSFORM_WRITE);
AxisAngle4f

axis

new

AxisAngle4f(1.0f,0.0f,0.0f,0.0f);
axisOfRotPos.set(axis);
quats[0] = new Quat4f(0.0f, 1.0f, 1.0f,
0.0f);
quats[1] = new Quat4f(1.0f, 0.0f, 0.0f,
0.0f);
quats[2] = new Quat4f(0.0f, 1.0f, 0.0f,
0.0f);

http://tailieuhay.com

516

Lp trnh ha trn Java 2D v 3D


quats[3] = new Quat4f(0.0f, 1.0f, 1.0f,
0.0f);
quats[4] = new Quat4f(0.0f, 0.0f, 1.0f,
0.0f);
quats[5] = new Quat4f(0.0f, 1.0f, 1.0f,
0.0f);
quats[6] = new Quat4f(1.0f, 1.0f, 0.0f,
0.0f);
quats[7] = new Quat4f(1.0f, 0.0f, 0.0f,
0.0f);
quats[8] = quats[0];
positions[0]= new Point3f(

0.0f,

0.0f,

positions[1]= new Point3f(

1.0f, -1.0f,

-1.0f);
-2.0f);
positions[2]= new Point3f( -1.0f,

1.0f,

positions[3]= new Point3f(

0.0f,

-3.0f);
2.0f,

-4.0f);
positions[4]= new Point3f( -2.0f, -1.0f,
-5.0f);
positions[5]= new Point3f(

3.0f,

1.0f,

positions[6]= new Point3f( -3.0f,

0.0f,

-6.0f);
-7.0f);
positions[7]= new Point3f(

2.0f, -1.0f,

-4.0f);
positions[8]= positions[0];

http://tailieuhay.com

517

Lp trnh ha trn Java 2D v 3D

RotPosPathInterpolator rotPosPath = new


RotPosPathInterpolator(
alpha, target, axisOfRotPos,
knots, quats, positions);
rotPosPath.setSchedulingBounds(new
BoundingSphere());

objRoot.addChild(target);
objRoot.addChild(rotPosPath);
target.addChild(new ColorCube(0.4));
Background background = new Background();
background.setColor(1.0f, 1.0f, 1.0f);
background.setApplicationBounds(new
BoundingSphere());
objRoot.addChild(background);
PointArray point_geom = new PointArray(9,
GeometryArray.COORDINATES);
point_geom.setCoordinates(0, positions);
Appearance

points_appear

new

Appearance();
ColoringAttributes points_coloring = new
ColoringAttributes();
points_coloring.setColor(1.0f, 0.0f,
0.0f);

http://tailieuhay.com

518

Lp trnh ha trn Java 2D v 3D


points_appear.setColoringAttributes(point
s_coloring);
PointAttributes points_points = new
PointAttributes(4.0f, true);
points_appear.setPointAttributes(points_p
oints);
Shape3D points = new Shape3D(point_geom,
points_appear);
objRoot.addChild(points);
objRoot.compile();
return objRoot;
}

//

end

of

CreateSceneGraph

method

of

RotPosPathApp
on m trn c trch khng ton vn t phng thc
createSceneGraph trong chng trnh RotPosPathApp.java bn c c
hnh dung s qua v cch s dng mt i tng ni suy ng:
RotPosPathInterpolator. Cc bc thc hin c nh s t 1-6 tng
ng vi cc bc trong cng thc.
Hnh 5-13 l mt cnh trong chng trnh RotPosPathApp, vi cc
im mu biu din v tr ca 9 im mt. im u tin c dng 2
ln, nn trong hnh, chng ta ch thy c 8 im.

http://tailieuhay.com

519

Lp trnh ha trn Java 2D v 3D

Hnh 5-13. Mt cnh trong chng trnh RotPosPathApp


Khi chng trnh RotPosPathApp c thc hin, khi hp
ColorCube di chuyn t v tr im mt ny n v tr ca im mt khc,
ng thi t quay n c cc im mt khc nhau. Ging nh tt c
cc i tng ni suy khc, hot nh kt qu ph thuc vo s kt hp
gia cc gi tr i tng ni suy vi cc tham s Alpha c s dng.
Nh ni bn trn, lp PathInterpolator c rt nhiu cc lp con
khc nhau. Ngoi cc lp con trong ht nhn ca Java 3D, cn c mt cp
cc lp lin quan trong gi tin ch. Lp TCBPathSplineInterpolator l
mt lp tng t vi lp PathInterpolator. Lp ny c mt lp con nm
trong gi tin ch (tham kho hnh 5-8 hnh dung c quan h gia
cc lp ni suy).
Trong chng trnh RotPosPathApp, hot nh xut hin khng t
nhin ch yu l do s kt hp v tr cc im mt c chn. Khi khi
hp ColorCube di chuyn n mi v tr im mt xc nh, th ngay lp
tc chuyn ng ca n thay i n c im mt tip theo. Di
chuyn nh vy khng t nhin do trong th gii thc, chuyn ng ca
tt c cc vt u c tnh nht nh.

http://tailieuhay.com

520

Lp trnh ha trn Java 2D v 3D


TCBPathSplineInterpolator l mt tin ch cung cp cc hnh vi v
chc nng tng t lp PathInterpolator, nhng lm trn ng i ca
i tng thnh mt ng cong da trn v tr cc im mt. ng
cong ny bt chc chuyn ng ca i tng trong th gii thc. Trong
chuyn ng ny, i tng trc quan c th khng i qua ton b hoc
khng h i qua bt c im mt no. Chng trnh v d,
SplineAnim.java, bn c c th tm trong a chng trnh km theo.

PathInterpolator
PathInterpolator l mt lp tru tng cung cp giao din v chc
nng c bn cho cc lp con ca n. Cc i tng PathInterpolator lu
tr cc gi tr im mt v tnh ton ch mc ca cc gi tr ny s
dng

da

trn

gi

tr

Alpha

thi

gian

hin

thi

(currentInterpolationValue). Tham s currentInterpolationValue c tnh


ton bng cch ni suy tuyn tnh trong chui cc im mt c nh
ngha trc (s dng gi tr sinh bi i tng Alpha xc nh). im
mt u tin phi c gi tr l 0.0 v im mt cui cng phi c gi tr l
1.0. im mt trung gian vi ch mc k phi c gi tr ln hn gi tr ca
bt c im mt no c ch mc nh hn k.
Mt s phng thc cung cp bi lp PathInterpolator:
int getArrayLengths()
Tr v di ca mng cc im mt
void setKnot(int index, float knot)
Thit lp im mt ti ch mc xc nh bi index cho i tng
Interpolator hin thi.
void setKnots(float [] knots)
Thit lp (thay th) tt c cc im mt cho i tng Interpolator
hin thi.

http://tailieuhay.com

521

Lp trnh ha trn Java 2D v 3D


RotPosPathInterpolator
RotPosPathInterpolator l mt lp i tng hnh vi, bin i thnh
phn quay v tnh tin ca i tng ch thuc lp TransformGroup
bng cch ni suy tuyn tnh gia chui cc cp im mt/v tr v im
mt/hng, s dng gi tr sinh bi i tng Alpha xc nh. V tr v
hng ni suy c s dng sinh mt dch chuyn trong h ta a
phng ca i tng Interpolator ny. Xt v mt giao din lp trnh
ng dng th phng thc khi to l quan trng nht i vi lp i
tng ny. Trong phng thc khi to, tt c cc gi tr v i tng lin
quan u phi c xc nh. Ch rng mi mng tham s phi c cng
di trong i tng khi to hin ti v cc i tng PathInterpolator
khc trong chng trnh.
RotPosPathInterpolator(Alpha Alpha, TransformGroup target,
Transform3D axisOfRotPos, float[] knots, Quat4f[] quats,
Point3f[] positions)
Khi to i tng Interpolator mi bin i chuyn ng quay v
tnh tin ca i tng ch TransformGroup.
Mt s phng thc cung cp bi lp RotPosPathInterpolator:
void getPositions(Point3f[] positions)
Sao chp cc gi tr v tr ca i tng Interpolator hin thi vo
mng positions. Mng positions phi ln cha d liu.
void getQuats(Quat4f[] quats)
Sao chp gi tr cc quantenion ca i tng Interpolator hin thi
vo mng quats. Mng quats phi ln cha d liu.
void setAxisOfRotPos(Transform3D axisOfRotPos)
Thit lp trc ca git tr RotPos cho i tng Interpolator hin
thi.
void setPosition(int index, Point3f position)

http://tailieuhay.com

522

Lp trnh ha trn Java 2D v 3D


Thit lp v tr ti ch mc xc nh cho i tng Interpolator hin
thi.
void setQuat(int index, Quat4f quat)
Thit lp quantenion ti ch mc xc nh cho i tng Interpolator
hin thi.
void setTarget(TransformGroup target)
Thit lp i tng ch TransformGroup cho i tng Interpolator
hin thi.
Lp Billboard :
Thut ng Billboard c s dng trong ha my tnh m
ch cng ngh quay t ng mt i tng trc quan 2 chiu sao cho n
lun i mt vi ngi quan st. S pht sinh lp hnh vi Billboard xut
pht t tng s dng cc b mt n gin thay th cho cho cc hnh
khi phc tp. Hnh vi Billboard thng thng c dng cho mc ch
ny, ngoi ra, n cn c dng cho cc mc ch khc, v d nh lm
cho dng vn bn c th c nhn thy t mi gc trong mi trng
o. Trong Java 3D, cng ngh Billboard c ci t bi mt lp con
ca lp hnh vi Behavior, v vy, ngi ta vn hay dng thut ng hnh
vi Billboard ch cng ngh ny.
Mt v d kinh in s dng hnh vi behavior l ng dng biu din
cy ci di dng hnh 2 chiu. Tt nhin, nu ci cy ch gi mt hng
c nh th khi gc nhn thay i, ngi quan st s pht hin ra hnh dng
2 chiu ca cy. Nhng nu ci cy t nh hng li sao cho lun i
mt vi ngi quan st th n dng nh c dng 3 chiu. Hiu qu ca
hiu ng ny cng cao nu ci cy nm hnh nn ca khung cnh
hoc l nm pha ng xa so vi v tr quan st.
Billboard lm vic c vi hnh nh cy ci bi cy ci c dng
gn ging nhau khi nhn t ng trc, ng sau hay t bt c gc nhn

http://tailieuhay.com

523

Lp trnh ha trn Java 2D v 3D


no. Billboard lm cho i tng trc quan xut hin hon ton ging
nhau t bt c gc nhn no, nn n rt thch hp s dng cng vi nh 2
chiu to i tng 3 chiu c dng hnh hc i xng qua trc y nh
cc ta nh hnh tr, thp nc, hay bt k i tng hnh tr no. i
tng Billboard cn c th s dng cho cc i tng 3 chiu khng c
dng i xng khi chng c quan st t mt khong cch ln che
du dng 2 chiu.
Hnh 5-14 biu din mt phn ca th khung cnh c xy dng
s dng nt Billboard . Thng thng hai nt TransformGroup c
s dng. Nt TransformGroup pha trn c dng nh v tr i
tng trc quan v c th l tnh. Nt TransformGroup pha di c
dng nh hng i tng v c thao tc bi i tng Billboard .
Chi tit vic lp trnh s c trnh by trong phn di y.
S dng i tng Billboard
Vic s dng i tng Billboard tng t vic s dng i tng
Interpolator , ngoi tr rng khng cn dng i tng Alpha iu
khin hot nh. Hot nh ca i tng Billboard c iu khin bi v
tr tng i ca ngi quan st trong th gii o. Hnh 5-15 biu din
cc bc s dng Billboard .

Hnh 5-14. Biu th khung cnh s dng i tng Billboard


http://tailieuhay.com

524

Lp trnh ha trn Java 2D v 3D


1. to i tng ch vi kh nng ALLOW_TRANSFORM_WRITE
2. to i tng Billboard

tham chiu n i tng ch

TransformGroup
3. thm danh gii lm vic cho i tng Billboard

4. lp ghp th
Hnh 5-15. Cng thc s dng i tng Billboard to hot nh
Cc li thng gp khi s dng Billboard
Mc d vic s dng i tng Billboard khng h phc tp, nhng
cng c hai li lp trnh thng gp sau. Li th nht xy ra do i tng
ch TransformGroup thit lp li hon ton gi tr ca n mi khi c
cp nht. Do , i tng TransformGroup ny khng th s dng
nh v i tng trc quan. Nu dng i tng ch nh v, hiu ng
Billboard vn hot ng, tuy nhin, trong ln cp nht quay u tin,
thng tin v tr ca i tng ch s b mt v i tng trc quan s
c hin th ti v tr ban u.
Nu

tng

ch

khng

thit

lp

thuc

tnh

ALLOW_TRANSFORM_WRITE khi chng trnh c thc thi s pht


sinh li runtime. Nu danh gii lm vic khng c thit lp hay thit
lp khng chnh xc th i tng Billboard s khng iu khin c
i tng trc quan. Danh gii lm vic thng thng c xc nh bi
i tng BoundingSphere vi phm vi lm vic ln bao gm i
tng trc quan.
C mt gii hn khi s dng lp Billboard : trong cc ng dng vi
nhiu hn mt quan st, mi i tng Billboard ch iu khin hot nh
chnh xc cho ch mt quan st. Vi mt vi ng dng th kh nng cung
cp ca Billboard l m bo, cn vi cc ng dng khc, c im ny
l mt gii hn ln. Java3D API phin bn 1.2 gii thiu lp
OrientedShape3D vt qua gii hn ny. i tng OrientedShape3D
cung cp cc chc nng ging vi chc nng ca i tng Billboard
http://tailieuhay.com

525

Lp trnh ha trn Java 2D v 3D


nhng c thm kh nng x l nhiu quan st cng mt lc. Billboard
quay quanh mt trc hoc mt im. Trong trng hp s dng khc, i
tng Billboard iu khin mt i tng TransformGroup sao cho trc
z dng ca i tng TransformGroup v cc con ca n lun i din
vi ngi quan st. Do Billboard hng trc z+ ca i tng ch v
pha ngi quan st nn n khng th dng quay vt th quanh trc z.
V l do ny, nu mt trc quay ca i tng c xc nh l (0, 0, z)
th n gin Billboard khng lm g c.
Chng trnh v d s dng Billboard
Chng trnh v d BillboardApp to mt th gii o vi cy ci s
dng k thut Billboard . Mc d cy ci trong chng trnh ny c to
bi cc hnh th (hnh tam gic phng) nhng chng khng h hin th
nh cc i tng 2 chiu.
Hai i tng TransformGroup c s dng cho mi cy trong v d
ny. Mt i tng TransformGroup, TGT, n gin ch dch cc cy
thnh ta v tr trong ng dng. Gi tr ca TGT khng b thay i
trong thi gian thc thi ca ng dng. i tng TransformGroup th
hai, TGR, iu khin hot ng quay ca cy. TGR l i tng ch ca
Billboard .
public

BranchGroup

createSceneGraph(SimpleUniverse su) {
// Create the root of the branch graph
TransformGroup vpTrans = null;
BranchGroup objRoot = new BranchGroup();
Vector3f translate = new Vector3f();

http://tailieuhay.com

526

Lp trnh ha trn Java 2D v 3D


Transform3D T3D = new Transform3D();
TransformGroup TGT = null;
TransformGroup TGR = null;
Billboard billboard = null;
BoundingSphere

bSphere

new

BoundingSphere();
objRoot.addChild(createLand());
SharedGroup share = new SharedGroup();
share.addChild(createTree());
float[][]

position

0.0f,

0.0f,

-3.0f }, { 6.0f, 0.0f, 0.0f },


{ 6.0f, 0.0f, 6.0f }, { 3.0f,
0.0f, -10.0f },
{

13.0f,

0.0f,

-30.0f

},

-13.0f, 0.0f, 30.0f },


{

-13.0f,

0.0f,

23.0f

},

{ 13.0f, 0.0f, 3.0f } };


for (int i = 0; i < position.length; i+
+) {
translate.set(position[i]);
T3D.setTranslation(translate);
TGT = new TransformGroup(T3D);
TGR = new TransformGroup();

http://tailieuhay.com

527

Lp trnh ha trn Java 2D v 3D

TGR.setCapability(TransformGroup.ALLOW_TRANSFORM_
WRITE);
billboard = new Billboard(TGR);
billboard.setSchedulingBounds(bSphere);
//
billboard.setAlignmentMode(Billboard.ROTATE_ABOUT
_POINT);
objRoot.addChild(TGT);
objRoot.addChild(billboard);
TGT.addChild(TGR);
TGR.addChild(new Link(share));
}
vpTrans

su.getViewingPlatform().getViewPlatformTransform(
);
translate.set(0.0f, 0.3f, 0.0f);
T3D.setTranslation(translate);
vpTrans.setTransform(T3D);
KeyNavigatorBehavior

keyNavBeh

new

KeyNavigatorBehavior(vpTrans);
keyNavBeh
.setSchedulingBounds(new
BoundingSphere(new Point3d(), 1000.0));
objRoot.addChild(keyNavBeh);
Background

background

new

Background();

http://tailieuhay.com

528

Lp trnh ha trn Java 2D v 3D


background.setColor(0.3f, 0.3f, 1.0f);
background.setApplicationBounds(new
BoundingSphere());
objRoot.addChild(background);
// Let Java 3D perform optimizations on
this scene graph.
objRoot.compile();
return objRoot;
}

//

end

BillboardAppon

of
m

CreateSceneGraph
trn

trch

method

of

phng

thc

createSenceGraph ca chng trnh BillboardApp.java vi cc k hiu


nh du tng ng vi cc bc thc hin c lit k trong hnh 5-15.

Hnh 5-16. Biu th s dng i tng Billboard

trong

BillboardApp.java
Hnh 5-17 hin th mt cnh sinh bi chng trnh v d BillboardApp.

http://tailieuhay.com

529

Lp trnh ha trn Java 2D v 3D

Hnh 5-17. Mt nh ca BillboardApp vi tt c cy 2 chiu u


hng v pha ngi quan st

BillboardApp.java cung cp

KeyNavigatorBehavior cho php ngi dng di chuyn xung quanh v


quan st cc cy t cc v tr v hng nhn khc nhau. Xin xem li phn
4.4.2 ca chng 4 bit thm chi tit v lp i tng ny.
Giao din lp trnh ng dng ca Billboard (Billboard
API)
Trong v d BillboardApp pha trn, i tng Billboard hot ng
vi ch mc nh l quay i tng trc quan xung quanh trc y. Nn,
nu cc cy trong v d ny c quan st t pha trn hay t pha di,
dng 2 chiu ca n s b l.
Mt ch thay th l quay i tng trc quan quanh mt im.
Trong ch ny, hnh nh 2 chiu c iu khin quay quanh 1 im,
do , i tng trc quan lun c quan st trc din t bt c v tr
quan st no. Mt ng dng d thy l biu din mt trng hay cc vt th
hnh cu khong cch xa di dng mt hnh trn.

http://tailieuhay.com

530

Lp trnh ha trn Java 2D v 3D


Cc phng thc khi to ca Billboard
Billboard
Khi to mt Billboard

()
vi tham s mc nh: mode =

ROTATE_ABOUT_AXIS, axis = (0, 1, 0).


Billboard (TransformGroup tg)
Khi to mt i tng Billboard vi cc tham s mc nh hot
ng trn i tng TransformGroup xc nh.
Billboard (TransformGroup tg, int mode, Vector3f axis)
Khi to i tng Billboard vi trc quay v ch hot ng xc
nh iu khin i tng TransformGroup xc nh.
Billboard (TransformGroup tg, int mode, Point3f point)
Khi to i tng Billboard vi tm quay v ch xc nh, hot
ng trn i tng ch TransformGroup xc nh.
Mt vi phng thc khc cung cp bi lp Billboard :
void setAlignmentAxis(Vector3f axis)
Thit lp trc canh chnh.
void setAlignmentAxis(float x, float y, float z)
Thit lp trc canh chnh.
void setAlignmentMode(int mode)
Thit lp ch canh chnh, trong mode c th l
ROTATE_ABOUT_AXIS

- Ch nh quay xung quanh mt

trc xc nh
ROTATE_ABOUT_POINT - Ch nh quay xung quanh mt im
xc nh v ch nh rng trc Y ca i tng con phi ph hp vi trc
Y ca i tng c quan st
void setRotationPoint(Point3f point)
Thit lp tm quay
void setRotationPoint(float x, float y, float z)
Thit lp tm quay
http://tailieuhay.com

531

Lp trnh ha trn Java 2D v 3D


void setTarget(TransformGroup tg)
Thit lp i tng ch TransformGroup cho i tng Billboard
hin thi.
OrientedShape3D
i tng OrientedShape3D c s dng thc hin cc chc
nng ging nh i tng Billboard trong mc trc. im khc bit
ch yu gia hai lp i tng nh c nhc n phn trn l ch
OrientedShape3D c kh nng lm vic vi nhiu hn mt quan st cn
Billboard th khng, cng nh kh nng chia s s dng ch c
OrientedShape3D.
i tng OrientedShape3D cng yu cu s dng t m hn.
OrientedShape3D khng hiu chnh i tng ch TransformGroup, m
m kh nng ny cho m chng trnh thc hin. OrientedShape3D
khng phi l mt i tng hnh vi do , ngi lp trnh cng khng
cn quan tm n gii hn hot ng.
Vi so snh trn th d thy OrientedShape3D l s la chn hin
nhin cho cc ng dng dng hiu ng Billboard . Nguyn nhn duy nht
khng loi b lp Billboard khi Java3D API chnh l kh nng
tng thch ngc vi cc ng dng ang tn ti.
i tng OrientedShape3D quay xung quanh mt trc hoc mt tm.
Trong c hai trng hp, i tng OrientedShape3D t nh hng bn
thn n sao cho trc z+ ca cc con ca n lun i din vi ngi quan
st. Do OrientedShape3D hng trc z+ ca cc vt th v pha ngi
quan st, nn khng c ngha g nu quay vt th quanh trc z. V l do
ny nn trc quay khng c song song vi trc z, c ngha l, trc quay
khng c nh ngha l (0, 0, z) vi bt c gi tr no ca z. Nu mt
trc song song vi z c ch nh, OrientedShape3D n gin s khng

http://tailieuhay.com

532

Lp trnh ha trn Java 2D v 3D


lm g c. Lc coi nh l i tng TransformGroup c thit lp ma
trn ng nht.
Khng c gii hn cho gi tr c s dng lm tm quay. Nu ch
biu din c thit lp l ROTATE_ABOUT_POINT th vt th s
quay xung quanh mt im xc nh.
Giao din lp trnh ng dng ca OrientedShape3D
Giao din lp trnh ng dng ca OrientedShape3D l tng t vi
giao din lp trnh ca lp Billboard , ngoi ra, cng c vi im khc
bit. S khc bit pht sinh ch yu do s khc nhau v cu trc phn cp
lp i tng. OrientedShape3D k tha t lp Shape3D, trong khi ,
Billboard li k tha t Behavior.
Danh sch cc phng thc khi to ca OrientedShape3D khng
nhiu nh ca lp Shape. V d nh khng c phng thc khi to vi
ch mt tham s Geometry. Trong trng hp ny, cc phng thc khi
to khng k tha lp c s. Mt ng dng c th s dng phng thc
khi to khng tham s v mt vi phng thc khc to ra i tng
OrientedShape3D cn thit.
Cc phng thc khi to:
OrientedShape3D()
Khi to i tng OrientedShape3D vi cc tham s mc nh
OrientedShape3D(Geometry geometry, Appearance appearance,
int mode, Point3f point)
Khi to i tng OrientedShape3D vi thnh phn hnh hc, thnh
phn xut hin, ch v tm quay xc nh.
OrientedShape3D(Geometry geometry, Appearance appearance,
int mode, Vector3f axis)
Khi to i tng OrientedShape3D vi thnh phn hnh hc, thnh
phn xut hin, ch v trc quay xc nh.

http://tailieuhay.com

533

Lp trnh ha trn Java 2D v 3D


Mt s phng thc khc cung cp bi OrientedShape3D:
void setAlignmentAxis(float x, float y, float z)
void setAlignmentAxis(Vector3f axis)
void setAlignmentMode(int mode)
void setRotationPoint(float x, float y, float z)
void setRotationPoint(Point3f point)
Cc phng thc ny c cc tham s v chc nng ging vi cc phng
thc cng tn ca Billboard . Xem chi tit phn Giao din lp trnh
ng dng ca Billboard .
Cc kh nng c th thit lp cho OrientedShape3D:
ALLOW_AXIS_READ | WRITE
Cho php c (ghi) thng tin trc canh chnh.
ALLOW_MODE_READ | WRITE
Cho php c (ghi) thng tin ch canh chnh.
ALLOW_POINT_READ | WRITE
Cho php c (ghi) thng tin tm quay.
V d s dng OrientedShape3D
Vic s dng OrientedShape3D rt d dng, bt c ch no s dng
i tng Shape3D u c th thay th n gin bng i tng
OrientedShape3D.
Xt chng trnh v d OrientedShape3DApp.java. ng dng ny to
mt phong cnh o vi cc cy Billboard 2 chiu. Mi cy l mt con
ca mt i tng OrientedShape3D, i tng ny to hiu ng
Billboard cho cy.
1. public BranchGroup createSceneGraph(SimpleUniverse su) {
2. // Create the root of the branch graph
3. BranchGroup objRoot = new BranchGroup();

http://tailieuhay.com

534

Lp trnh ha trn Java 2D v 3D


4.
5. Vector3f translate = new Vector3f();
6. Transform3D T3D = new Transform3D();
7. TransformGroup positionTG = null;
8. OrientedShape3D orientedShape3D = null;
9.
10. Geometry treeGeom = createTree();
11.
12. //specify the position of the trees
13. float[][] position = {{ 0.0f, 0.0f, -2.0f},
14. {-13.0f, 0.0f, 23.0f},
15. { 1.0f, 0.0f, -3.5f}};
16.
17. // for the positions in the array create a OS3D
18. for (int i = 0; i < position.length; i++){
19. translate.set(position[i]);
20. T3D.setTranslation(translate);
21. positionTG = new TransformGroup(T3D);
22.
23. orientedShape3D = new OrientedShape3D();
24. orientedShape3D.addGeometry(treeGeom);
25.
26. objRoot.addChild(positionTG);
27. positionTG.addChild(orientedShape3D);
28. }
on m trn c trch t phng thc createSceneGraph ca
chng trnh OrientedShape3DApp.java. C th nhn thy tnh d dng
ca OrientedShape3D so vi Billboard .
http://tailieuhay.com

535

Lp trnh ha trn Java 2D v 3D


Hot nh mc chi tit (Level Of Detail Animations)
Mc chi tit (Level Of Detail LOD ) l mt thut ng ch k thut
bin i lng chi tit trong mt i tng trc quan da trn mt vi gi
tr ca th gii o. ng dng thng gp ca k thut ny l thay i mc
chi tit ca i tng da trn khong cch i vi ngi quan st. Khi
khong cch ti i tng trc quan cng tng th cng t chi tit ca i
tng c hin th. Do vy, vic gim phc tp ca i tng c
th khng nh hng n kt qu hin th. Vic gim bt lng chi tit
ca i tng khi chng khong cch xa so vi ngi quan st s lm
gim khi lng tnh ton t trt. Nu k thut ny c p dng tt s
c th tit kim c ng k s lng cng thc tnh ton m vn khng
lm mt i ni dung ca vt th.
Lp DistanceLOD cung cp i tng hnh vi LOD da trn khong
cch ca vt th i vi ngi quan st. Mt ng dng khc ca LOD c
th l thay i lng chi tit da trn tc t trt (hay tc hin th,
c tnh bng s khung hnh / giy) gi t l khung hnh l thp nht;
tc ca vt th, hay mc chi tit c th c iu khin vi cc
thit lp ca ngi dng.
Mi i tng LOD c mt hoc nhiu hn cc i tng Switch
ng vai tr i tng ch. i tng Switch l mt nhm c bit bao
gm khng, mt hoc nhiu hn cc con ca chng trong th khung
cnh c dng hin th. Trong trng hp s dng DistanceLOD,
vic la chn con ca i tng ch Switch c iu khin bi khong
cch ca i tng DistanceLOD i vi ngi quan st, da trn mt tp
cc ngng khong cch.
Ngng khong cch c xc nh trong mt mng bt u vi
khong cch xa nht, khi , con u tin ca i tng ch s c s
dng. Con u tin ca i tng ch thng thng l i tng trc
quan chi tit nht. Khi khong cch ca i tng DistanceLOD i vi
http://tailieuhay.com

536

Lp trnh ha trn Java 2D v 3D


ngi quan st ln hn ngng th nht, con th hai ca i tng switch
s c s dng. Cc ngng khong cch sau phi ln hn ngng
khong cch trc v xc nh khong cch m con tip theo ca i
tng ch c s dng. Do , s lng con ca i tng ch l
nhiu hn s ngng khong cch.
Nu c nhiu hn mt i tng Switch c thm vo vi t cch l
ch ca i tng LOD , cc i tng ch Switch s c s dng
song song. C ngha l cc con ca cc i tng ch Switch c cng ch
mc s c la chn ng thi. Theo cch lm ny, i tng trc quan
phc tp c th c biu din bi nhiu i tng hnh hc l con ca
cc i tng Switch khc nhau.
S dng i tng DistanceLOD
Vic s dng i tng DistanceLOD tng t vic s dng i
tng ni suy Interpolator , ngoi tr vic khng c i tng Alpha
no cn s dng iu khin hot nh. Hot nh ca i tng LOD
c iu khin bi khong cch tng i ca n i vi ngi quan st
trong th gii o, theo cch ny, vic s dng i tng DistanceLOD
ging vi vic s dng i tng Billboard . S dng i tng
DistanceLOD cng cn phi thit lp cc ngng khong cch. Hnh 5-18
biu din cc bc s dng DistanceLOD.
1. to

cc

tng

Switch

ch

vi

kh

nng

ALLOW_SWITCH_WRITE
2. to danh sch mng cc ngng khong cch cho i tng
DistanceLOD
3. to i tng DistanceLOD s dng mng cc ngng khong
cch
4. thit lp i tng Switch ch cho i tng DistanceLOD

http://tailieuhay.com

537

Lp trnh ha trn Java 2D v 3D


5. thit lp gii hn hot ng cho i tng DistanceLOD
6. lp ghp th khung cnh, bao gm c vic thm cc con cho
cc i tng Switch
Hnh 5-18. Cng thc s dng DistanceLOD to hot nh
Cc li thng gp khi s dng LOD
Mc d vic s dng i tng LOD khng phi l phc tp, nhng
cng c hai li lp trnh thng gp sau. Li thng xy ra nht l khng
gp i tng Switch ch vo th khung cnh. Thit lp i tng
Switch l ch ca i tng DistanceLOD khng t ng gp n vo
th khung cnh.
Nu kh nng ALLOW_SWITCH_WRITE khng c thit lp cho
i tng Switch ch th khi chng trnh c thc thi s pht sinh li
runtime. Cn na, nu gii hn hot ng khng c thit lp, hoc thit
lp khng chnh xc th LOD khng iu khin c i tng trc
quan. Gii hn hot ng thng thng c quy nh bi mt i tng
BoundingSphere vi bn knh ln iu khin c i tng trc
quan. Tng t nh cc i tng hnh vi khc, nu khng gp LOD
vo th khung cnh th chng trnh cng s khng bo li.
C mt gii hn m lp LOD khng vt qua c chnh l s lng
quan st m chng trnh c th lm vic c. Nu chng trnh c
nhiu hn mt quan st, LOD ch c th iu khin hot nh chnh xc
cho ch mt trong s cc quan st .
V d s dng DistanceLOD
on m sau c trch t phng thc createSceneGraph trong
chng trnh DistanceLODApp. Chi tit v chng trnh ny, xin xem

http://tailieuhay.com

538

Lp trnh ha trn Java 2D v 3D


thm phn ph lc v a chng trnh km theo. on m ny c
nh s tng ng vi cc bc trong cng thc s dng hnh 5-18.
public BranchGroup createSceneGraph() {
BranchGroup objRoot = new BranchGroup();
BoundingSphere

bounds

new

BoundingSphere();
// create target TransformGroup with
Capabilities
TransformGroup

objMove

new

TransformGroup();
objMove.setCapability(TransformGroup.ALLO
W_TRANSFORM_WRITE);
// create Alpha
Alpha alpha = new Alpha (-1,
Alpha.INCREASING_ENABLE
+ Alpha.DECREASING_ENABLE,
0, 0, 5000, 1000, 1000,
5000, 1000, 1000);
// specify the axis of translation
AxisAngle4f

axisOfTra

new

AxisAngle4f(0.0f,1.0f,0.0f,(float)Math.PI/-2.0f);
Transform3D axisT3D = new Transform3D();
axisT3D.set(axisOfTra);
// create position interpolator

http://tailieuhay.com

539

Lp trnh ha trn Java 2D v 3D


PositionInterpolator posInt
= new PositionInterpolator (alpha,
objMove, axisT3D, 0.0f, -35.0f);
posInt.setSchedulingBounds(bounds);
// create DistanceLOD target object
Switch targetSwitch = new Switch();
targetSwitch.setCapability(Switch.ALLOW_S
WITCH_WRITE);
// add visual objects of various levels
of detail to the target switch
Appearance

sphereAppearA

new

ColoringAttributes sphereCAa =

new

Appearance();
ColoringAttributes();
sphereCAa.setColor(0.1f, 0.8f, 0.1f);
sphereAppearA.setColoringAttributes(spher
eCAa);
Appearance

sphereAppearB

new

ColoringAttributes sphereCAb =

new

Appearance();
ColoringAttributes();
sphereCAb.setColor(0.8f, 0.1f, 0.1f);
sphereAppearB.setColoringAttributes(spher
eCAb);

http://tailieuhay.com

540

Lp trnh ha trn Java 2D v 3D


targetSwitch.addChild(new Sphere(.40f, 0,
25, sphereAppearA));
targetSwitch.addChild(new Sphere(.40f, 0,
15, sphereAppearB));
targetSwitch.addChild(new Sphere(.40f, 0,
10, sphereAppearA));
targetSwitch.addChild(new Sphere(.40f, 0,
4, sphereAppearB));
// create DistanceLOD object
float[] distances = { 5.0f, 10.0f,
20.0f};
DistanceLOD

dLOD

new

DistanceLOD(distances, new Point3f());


dLOD.addSwitch(targetSwitch);
dLOD.setSchedulingBounds(bounds);
if((targetSwitch.numChildren()-1) !=
dLOD.numDistances()){
System.out.println("DistanceLOD
not initialized properly");
System.out.println(targetSwitch.n
umChildren());
System.out.println(dLOD.numDistan
ces());
}
// assemble scene graph

http://tailieuhay.com

541

Lp trnh ha trn Java 2D v 3D


objRoot.addChild(objMove);

// target

TG of position interp to move vo


objRoot.addChild(posInt);

// add

position interpolator
objMove.addChild(dLOD);

// make

the bounds move with visual object


objMove.addChild(targetSwitch);// must
add target switch to scene graph too

// show a level 3 object up close for


comparison
Transform3D t3d = new Transform3D();
t3d.set(new Vector3f(0.6f, 0.0f, 0.0f));
TransformGroup

tga

new

TransformGroup(t3d);
objRoot.addChild(tga);
tga.addChild(new Sphere(.40f, 0,

4,

sphereAppearB));
// show a level 0 object at a distance
for comparison
t3d.set(new

Vector3f(-5.0f,

0.0f,

-35.0f));
TransformGroup

tgb

new

tgb.addChild(new Sphere(.40f, 0,

25,

TransformGroup(t3d);
objRoot.addChild(tgb);
sphereAppearA));

http://tailieuhay.com

542

Lp trnh ha trn Java 2D v 3D

// a white background is better for


printing images in tutorial
Background background = new Background();
background.setColor(1.0f, 1.0f, 1.0f);
background.setApplicationBounds(new
BoundingSphere());
objRoot.addChild(background);
// Let Java 3D perform optimizations on this
scene graph.
objRoot.compile();
return objRoot;
}

//

end

of

CreateSceneGraph

method

of

DistanceLODApp
Hnh 5-19 biu din biu th khung cnh c to ra trong v d
trn. Ch rng, i tng Switch ch va l con ca i tng
TransformGroup va c tham chiu n bi i tng DistanceLOD.
C hai quan h ny u cn c xc lp.

http://tailieuhay.com

543

Lp trnh ha trn Java 2D v 3D

Hnh 5-19. Mt phn biu th khung cnh cho chng trnh


DistanceLODApp
Hnh 5-20 l hai cnh c sinh t chng trnh DistanceLODApp.
Mi nh ny c 2 khi cu tnh v mt khi cu dch chuyn (trong hnh
bn phi, khi cu bn tri nht b che khut). Khi cu dch chuyn
c biu din bng mt i tng DistanceLOD vi 4 khi cu c
phc tp hnh hc khc nhau. Khi cu nh mu xanh l khi cu chi tit
nht c s dng bi i tng DistanceLOD khong cch cc i.
Khi cu ln mu l khi cu km chi tit nht ca i tng
DistanceLOD v khong cch cc tiu. Hai khi cu ny c hin th
lm mc so snh.
Trong chng trnh ny, i tng DistanceLOD c biu din bi cc
khi cu c mu sc khc nhau minh ha qu trnh chuyn i.
Mt i tng ni suy v tr PositionInterpolator c s dng
dch chuyn i tng DistanceLOD theo hng vung gc vi mn
hnh. Khi i tng DistanceLOD dch chuyn ra xa ngi quan st, n
s chuyn i tng trc quan hin th. Nu khng s dng cc khi

http://tailieuhay.com

544

Lp trnh ha trn Java 2D v 3D


cu c mu sc khc nhau s rt kh khn nhn bit khi no th i
tng trc quan c chuyn.

Hnh 5-20. Hai cnh c sinh ra t DistanceLODApp.


Giao din lp trnh ng dng DistanceLOD API
DistanceLOD nh ngha mt nt i tng hnh vi LOD

da

khong cch, hot ng trn mt nt nhm Switch la chn mt trong


s cc con ca nt Switch da vo khong cch ca nt i tng
LOD so vi ngi quan st. Mt mng n gi tr khong cch n iu
tng, c xc nh sao cho thnh phn u tin distances[0] tng ng
vi mc chi tit cao nht v thnh phn cui cng distances[n-1] tng
ng vi mc chi tit thp nht. Da vo khong cch thc t ngi quan
st n nt DistanceLOD, n gi tr khong cch [0, n-1] la chn n+1
mc chi tit [0, n]. Nu gi khong cch t ngi quan st n nt LOD
th phng trnh xc nh mc chi tit (con ca nt Switch) c la
chn l:
0

nu d <= distances[0]

1. i nu distances[i-1] < d <= distances[i]


2. n nu d > distances[n-1]

http://tailieuhay.com

545

Lp trnh ha trn Java 2D v 3D


Ch rng c v tr v mng cc gi tr khong cch u c xc
nh trong h ta a phng ca nt hin thi.
Cc phng thc khi to:
DistanceLOD()
Khi to v khi gn cho nt DistanceLOD gi tr mc nh.
DistanceLOD(float[] distances)
Khi to v gn gi tr ban u cho nt DistanceLOD vi mng cc
gi tr khong cch xc nh v v tr mc nh (0, 0, 0).
DistanceLOD(float[] distances, Point3f position)
Khi to v khi gn cho nt DistanceLOD vi mng cc gi tr
khong cch v v tr xc nh.
Mt s phng thc cung cp bi DistanceLOD:
int numDistances()
Tr v s lng cc ngng khong cch.
void setDistance(int whichDistance, double distance)
Thit lp ngng khong cch LOD xc nh.
void setPosition(Point3f position)
Thit lp v tr ca nt LOD .
Morph
Cc lp ni suy thay i cc thuc tnh trc quan khc nhau trong th
gii o. Tuy nhin, khng c lp ni suy no cung cp cc kh nng thay
i hnh dng hnh hc ca cc i tng trc quan. Kh nng ny do lp
Morph cung cp. i tng Morph to hnh dng cho mt i tng
trc quan thng qua vic ni suy t mt tp cc i tng
GeometryArray. Theo c im ny, lp Morph ging vi cc lp ni
suy. Tuy nhin, Morph khng phi l lp ni suy, thm ch, n cn
khng k tha lp hnh vi Behavior. Lp Morph m rng t lp Node.

http://tailieuhay.com

546

Lp trnh ha trn Java 2D v 3D


Trong chng 4, chng ta lm quen vi phng thc
processStimulus ca i tng Behavior thc hin cc thay i i vi
th khung cnh thc hay i vi cc i tng trong th khung cnh
thc. Do khng c lp hnh vi chuyn bit s dng vi i tng Morph
, cc ng dng Morph phi t xy dng lp hnh vi ring. Lp Morph
c coi nh mt lp hot nh hay lp tng tc ph thuc vo s m
phng hnh vi tng tc vi i tng Morph .
i tng Morph c th c s dng bin kim t thp thnh
hnh khi hp, mo thnh ch, hoc bin i bt k hnh dng hnh hc
no thnh mt dng hnh hc khc. Hn ch duy nht l cc i tng
hnh hc s dng cho vic ni suy phi cng thuc mt lp v l lp con
ca lp GeometryArray, vi cng s lng cc nh. Hn ch v s lng
nh khng phi l hn ch ln ca Morph , trong a chng trnh km
theo, bn c c th thy chng trnh Pyramid2Cube.java, bin mt km
t thp thnh hnh hp.
i tng Morph cng c th c s dng to hot nh cho cc
i tng trc quan (v d: lm cho mt ngi i li c, hay lm cho
bn tay c th cm nm c vt dng). Chng trnh v d to hot
nh cho bn tay, Morphing.java cng c th tm thy trong a chng
trnh km theo. Chng trnh v d th 3, lm cho mt dng hnh que i
li c s c trnh by chi tit trong phn sau.
S dng i tng Morph
hiu c cch s dng i tng Morph , trc ht, cn phi
bit cc thc i tng Morph lm vic. Morph khng qu phc tp.
i tng Morph lu tr mt mng cc i tng GeometryArray vi
mi i tng nh ngha c t hnh hc hon chnh cho mt i tng
trc quan. Cc i tng GeometryArray c th c coi nh l cc

http://tailieuhay.com

547

Lp trnh ha trn Java 2D v 3D


khung nh chnh trong hot nh, hay chnh xc hn, l cc hng s trong
phng trnh tnh ton to ra mt i tng GeometryArray mi.
Ngoi mng cc i tng GeometryArray, mt i tng Morph
cn c mt mng cc trng s, y chnh l cc bin s trong phng
trnh. S dng cc i tng GeometryArray cng vi cc trng s, i
tng Morph khi to mt i tng mng hnh hc s dng gi tr
trng s trung bnh ca ta , mu sc, cung cp bi i tng
GeometryArray. Thay i cc trng s s lm thay i hnh dng hnh
hc.
1. to mt mng cc i tng GeometryArray
2. to

mt

tng

Morph

vi

kh

nng

ALLOW_WEIGHTS_WRITE
3. lp ghp th khung cnh, bao gm c vic thm cc con cho i
tng ch Switch
Hnh 5-21. Cng thc s dng i tng Morph
Nh trnh by, s dng i tng Morph khng kh, tuy nhin,
cc bc ny ng cho c hot nh v tng tc. Hot nh v tng tc
c cung cp thng qua mt i tng hnh vi. Do , s dng i
tng Morph thng c ngha l vit mt lp hnh vi. Cch vit lp
hnh vi c trnh by trong phn 4.2.1, nn y khng ni chi tit.
Tt nhin, Morph hon ton c th s dng m khng cn i tng
hnh vi, nhng n s khng th to ra c hot nh.
V d s dng Morph
Chng trnh Morph ny s dng mt i tng hnh vi ty chnh
sinh hot nh. Bc u tin trong qu trnh pht trin s l xy dng
lp hnh vi ny.

http://tailieuhay.com

548

Lp trnh ha trn Java 2D v 3D


Trong i tng hnh vi c s dng to hot nh cho i tng
Morph , phng thc processStimlus thay i trng s ca i tng
Morph . Trong v d ny processStimulus thit lp cc gi tr trng s
da vo gi tr Alpha ca mt i tng Alpha. Hot ng ny xy ra ti
mi khung nh c t trt khi iu kin kch hot c tha mn.
on m sau l on m xy dng i tng hnh vi ty bin trong
chng trnh MorphApp.
public class MorphBehavior extends Behavior{
private Morph targetMorph;
private Alpha alpha;
// the following two members are here
for effciency (no memory burn)
private double[] weights = {0, 0, 0, 0};
private WakeupCondition trigger = new
WakeupOnElapsedFrames(0);
// create MorphBehavior
MorphBehavior(Morph targetMorph, Alpha
alpha){
this.targetMorph = targetMorph;
this.alpha = alpha;
}
public void initialize(){
// set initial wakeup condition
this.wakeupOn(trigger);
}

http://tailieuhay.com

549

Lp trnh ha trn Java 2D v 3D


public void processStimulus(Enumeration
criteria){
// don't need to decode event since
there is only one trigger
// do what is necessary
weights[0] = 0;
weights[1] = 0;
weights[2] = 0;
weights[3] = 0;
float

alphaValue

4f

alpha.value() - 0.00001f;
int alphaIndex = (int) alphaValue;
weights[alphaIndex] = (double)
alphaValue - (double)alphaIndex;
if(alphaIndex < 3)
weights[alphaIndex + 1] = 1.0 weights[alphaIndex];
else
weights[0]

1.0

weights[alphaIndex];
targetMorph.setWeights(weights);
// set next wakeup condition
this.wakeupOn(trigger);
}
} // end of class MorphBehavior

http://tailieuhay.com

550

Lp trnh ha trn Java 2D v 3D


Lp MorphBehavior to khung hot nh chnh bng cch s dng cc
i tng GeometryArray hai ln ti mt thi im theo mt qu trnh c
tnh tun hon. Lp ny thch hp cho tt c cc hot nh s dng 4
khung nh chnh v c th thay i d dng khp vi s lng khung
nh chnh khc nhau.
Vi lp hnh vi ty chnh va vit, mi vic cn li ch l to khung
nh chnh s dng cho hot nh. Hnh 5-22 biu din cc hnh v tay
c s dng lm khung nh chnh cho chng trnh v d. Mun xy
dng cc khung nh p hn, c th s dng cc gi 3D.
Cc hnh c mu en trng ging nh l hai khung hnh chnh, mi
ci c lp li mt ln, nhng thc t, chng l bn khung hnh chnh
ring bit. S khc nhau l th t cc nh c xc nh.
on m sau c trch t phng thc createSceneGraph ca
chng trnh MorphApp.java vi cc s nh du cc bc c ch ra
trong hnh 5-21. Trong phng thc ny, mt i tng MorphBehavior,
mt i tng Alpha v mt i tng Morph c to ra, ri c gp
vo th khung cnh. Cc i tng khung nh chnh GeometryArray
c to ra bi mt s phng thc khc. Ton b chng trnh c th
tm thy trong a chng trnh km theo.

Hnh 5-22. Cc hnh khung nh chnh ca MorphApp vi ng qu o


ca mt nh (ng m)
public BranchGroup createSceneGraph() {

http://tailieuhay.com

551

Lp trnh ha trn Java 2D v 3D


// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
Transform3D t3d = new Transform3D();
t3d.set(new Vector3f(0f, -0.5f, 0f));
TransformGroup

translate

new

TransformGroup(t3d);
// create GeometryArray[] (array of
GeometryArray objects)
GeometryArray[]

geomArray

new

GeometryArray[4];
geomArray[0] = createGeomArray0();
geomArray[1] = createGeomArray1();
geomArray[2] = createGeomArray2();
geomArray[3] = createGeomArray3();
// create morph object
Morph morphObj = new Morph(geomArray);
morphObj.setCapability(Morph.ALLOW_WEIGH
TS_WRITE);
// create alpha object
Alpha alpha = new Alpha(-1, 1, 0, 0,
2000, 100, 0, 0, 0, 0);
// create morph driving behavior
MorphBehavior

morphBehav

new

MorphBehavior(morphObj, alpha);

http://tailieuhay.com

552

Lp trnh ha trn Java 2D v 3D


morphBehav.setSchedulingBounds(new
BoundingSphere());
//assemble scene graph
objRoot.addChild(translate);
translate.addChild(morphObj);
objRoot.addChild(morphBehav);
Background

background

new

Background();
background.setColor(1f, 1f, 1f);
background.setApplicationBounds(new
BoundingSphere());
objRoot.addChild(background);
// Let Java 3D perform optimizations on this
scene graph.
objRoot.compile();
return objRoot;
} // end of CreateSceneGraph method of
MorphApp
Mt ch th v rt ra t v d trn l nhiu hot nh khc nhau c
th c to ra, s dng chnh cc khung hnh chnh c xy dng
trn, vi cc lp hnh vi khc nhau. Hnh 5-23 biu din mt cnh sinh ra
bi Morph3DApp. Trong chng trnh ny, 3 lp hnh vi khc nhau to
hot nh da trn mt s hoc tt c i tng GeometryArray ca
MorphApp. Chng c gi ln lt (t tri qua phi) l In Place,
Tango, v Broken.
http://tailieuhay.com

553

Lp trnh ha trn Java 2D v 3D

Hnh 5-23. Mt cnh trong chng trnh Morph3App

Giao din lp trnh ng dng Morph API


Cc phng thc khi to:
Morph (GeometryArray[] geometryArrays)
Khi to v khi gn gi tr cho i tng Morph vi mt mng i
tng GeometryArray xc nh v mt i tng null thuc kiu
Appearance.
Morph (GeometryArray[] geometryArrays, Appearance appearance)
Khi to v khi gn gi tr cho i tng Morph vi mt mng i
tng GeometryArray v mt i tng Appearance xc nh.
Mt s phng thc khc cung cp bi Morph :
void setAppearance(Appearance appearance)
Thit lp thnh phn hin th b ngoi cho nt Morph .
void setGeometryArrays(GeometryArray[] geometryArrays)
Thit lp thnh phn geometryArrays cho nt Morph .
void setAppearanceOverrideEnable(boolean flag)
Thit lp c c nt l AlternateAppearance lm b ngoi hin th
cho nt Morph .
http://tailieuhay.com

554

Lp trnh ha trn Java 2D v 3D


void setWeights(double[] weights)
Thit lp vector trng s Morph cho nt Morph hin thi.
Cc kh nng c th thit lp cho Morph :
ALLOW_APPEARANCE_READ | WRITE
Xc nh rng nt hin thi cho php c (ghi) thng tin
appearance ca n.
ALLOW_GEOMETRY_ARRAY_READ | WRITE
Xc nh rng nt hin thi cho php c (ghi) thng tin dng hnh
hc ca n.
ALLOW_WEIGHTS_READ | WRITE
Xc nh rng nt hin thi cho php c (ghi) vector trng s
Morph ca n.
Giao din GeometryUpdater
Trong cc phn trn, hot nh c to ra ch yu bng cch di
chuyn cc khi hnh hnh hc, ch khng thay i hay to ra hnh mi.
Ngoi tr Morph to ra hnh ni suy t cc hnh cho trc. Java 3D API
gii thiu giao din GeometryUpdater, giao din ny cng vi
BY_REFERENCE geometry (chng 2) cho php thay i hnh dng
hnh hc trong thi gian thc thi chng trnh.
Vi giao din GeometryUpdater, ngi lp trnh ng dng c th to
ra bt c loi hot nh no ph thuc vo vic thay i thng tin v dng
hnh hc, k c cc hot nh s dng k thut Billboard , level of detail v
Morph . Giao din GeometryUpdater c tnh mm do cao, cho php
ngi lp trnh to c nhiu hiu ng hn so vi cc k thut trn.
Cc ng dng c th s dng GeometryUpdater bao gm cc k thut
hot nh chun nh kin to cc h ng, cc h phn t; sinh bng m t
ng hay cc hiu ng c bit nh chp Do GeometryUpdater cho

http://tailieuhay.com

555

Lp trnh ha trn Java 2D v 3D


php truy cp n d liu tng nh ca i tng hnh hc nn kh nng
to hot nh l khng c gii hn.
Mc d c th hiu chnh d liu i tng hnh hc BY_REFERENCE
m khng cn s dng i tng GeometryUpdater, nhng cch lm ny
cho kt qu hoc l khng th d on c hoc l khng n nh.
S dng GeometryUpdater
s dng c i tng GeometryUpdater cho cc ng dng hnh
hc ng, trc ht cn to i tng hnh hc BY_REFERENCE vi cc
kh nng thch hp, to mt lp GeometryUpdater v ly ra mt i
tng thuc lp , ri to mt lp hnh vi ty bin v cng ly ra mt
i tng thuc lp . Cng vic ny khng qu phc tp nh nhn nhn
ban u.
Cng vic to i tng hnh hc BY_REFERENCE khng lm g
nhiu hn ngoi vic to ra mt i tng hnh hc khc. i tng
GeometryUpdater c nhim v hiu chnh i tng hnh hc khi c
gi. i tng hnh vi lp lch gi i tng GeometryUpdater trong ng
dng.
Chng ta xem xt qua hai phng thc quan trng ca giao din
GeometryUpdater. Hai phng thc ny c cng tn l updateData().
Phng thc updateData() th nht phi c ci t chi tit trong lp
nh ngha GeometryUpdater trong ng dng. Phng thc updateData()
th hai l phng thc ca GeometryArray, phng thc ny s gi
phng thc c ci t trong lp GeometryUpdater.
void updateData(Geometry geometry)
Cp nht d liu hnh hc c th truy cp bi tham chiu.
void updateData(GeometryUpdater updater)

http://tailieuhay.com

556

Lp trnh ha trn Java 2D v 3D


Phng thc ny gi phng thc updateData ca i tng
GeometryUpdater xc nh ng b ha cp nht d liu i tng
hnh hc c tham chiu bi i tng GeometryArray hin thi.
Chng trnh v d h thng phn t i phun nc s
dng GeometryUpdater
Cc h thng phn t thng thng c s dng m hnh nc,
khi, pho hoa v cc hin tng ging dng lng khc. Trong mt h
thng phn t, c hai tham s thit k c bn: cc phn t s c dng nh
th no, v tr v hng ca n s c cp nht ra sao. Cc phn t thng
thng c biu din di dng im hoc ng, tuy nhin, cc dng
hnh hc khc cng c th c s dng. Vic cp nht chuyn ng c
th m phng c hnh vi t nhin ca cc i tng (c th hn l m
phng cc nh lut vt l) hay cc chuyn ng mong mun khc. Thng
thng, mt vi phn ca m chng trnh s c thnh phn ngu nhin
trnh cho cc phn t hot ng hon ton ging nhau.
Trong chng trnh v d, cc ht nc c biu din di dng cc
on thng nh vi chuyn ng tun theo cc quy lut vt l (c th l
chng c gia tc bi trng trng). Mi on thng c xc nh bi
2 im.
Hnh 5-24 l mt chui cc nh thu c t chng trnh v d
ParticleApp. nh pha bn tri l i nc trc khi cc phn t nc
c khi to. nh gia l khi ct nc c khi to trong i
phun. Trong nh ny, c tt c khong 300 phn t hot ng. Hnh ngoi
cng bn phi l nh i phun khi hot ng mt khong thi gian.
Trong hnh ny c khong 500 phn t nc hot ng.

http://tailieuhay.com

557

Lp trnh ha trn Java 2D v 3D

Hnh 5-24. Chui hnh nh thu t chng trnh ParticleApp


Trong chng trnh ParticleApp.java, c i phun c quay quanh
trc th hin tnh 3 chiu t nhin ca hot nh. Lp hnh vi tu bin
Behavior v lp GeometryUpdater l cc lp trong ca lp Fountain. C
th dng mt vi cch khc thit k hot nh nh trn. Tuy nhin, s
dng cc lp ny nh l lp trong s bin Fountain tr thnh mt i
tng ho hot nh hon chnh. Hn na, do c hai lp Behavior v
Geometry u ch c s dng cho ring ng dng ny, nn chng c l
do g cho php chng c s dng bi cc lp khc bn ngoi
Fountain.
Cc on m sau tng ng nh ngha cc i tng hnh hc, hnh
vi v geometryUpdater cho ng dng ParticleApp. Ba on m ny l
thnh phn chnh to nn hot nh trong ParticleApp.
on m u tin a ra nh ngha cho lp Fountain. C th, n nh
ngha mt vi trng v to ra i tng hnh hc c dng biu din
nc.
Ba trng (hay 3 thuc tnh) c nh ngha gn th

. Trng

waterLines v baseElevation c s dng trong mt vi phng thc


khc nhau nn chng c khai bo l cc thuc tnh ca lp Fountain.
waterLines l mt tham chiu n i tng hnh hc LineArray, i
tng hnh hc ca phn t nc. baseElevation l gi tr to y ca

http://tailieuhay.com

558

Lp trnh ha trn Java 2D v 3D


chn i phun. Trng thuc tnh th 3 gi mt tham chiu n i tng
WaterUpdater c to ra ti y vi mc ch l khng lm trn b nh.
Phng thc th nht ca lp Fountain l createWaterGeometry().
Phng thc ny c nh ngha mt bin nguyn N

, N l s lng cc

phn t nc (s cc on thng ca LineArray) c dng biu din


nc. Gi tr 1400 c gn cho N trong on m khng c g c bit
ngoi tr vic n lm cho hot nh trng c v hp l hn. Gn nh bt
c gi tr no cng c th gn cho N. Cng nhiu phn t c s dng
to hot nh th thi gian xy dng mt khung hnh hin th cng ln.
Trong phng thc createWaterGeometry(), i tng LineArray
c to ra trn dng m gn nhn

. S lng cc nh l N*2, bi mi

phn t (mi on thng) cn mt nh bt u v mt nh kt thc. Ch


rng nh dng nh bao gm c BY_REFERENCE.
Cc phn t nc c to hot nh bng cch thay i gi tr to
nh cho cc on thng tng ng. Vic ny ch c th thc hin c
nu kh nng thch hp c thit lp. Dng m dn nhn

u tin thit

lp kh nng cho php ghi d liu nh. Kh nng ny cn phi c thit


lp cho bt c ng dng no s dng GeometryUpdater. Trong hu ht
cc ng dng s dng GeometryUpdater, kh nng c cng cn phi
c thit lp. ng dng ny i hi nh vy. Dng m dn nhn

th 2

c nhim v thit lp kh nng c d liu gi tr nh.


Ph thuc ng dng v cch i tng GeometryUpdater c thit
k, thng tin dng hnh hc nht nh ngoi d liu nh c th cn
thit lp i tng Geometry. V d, nu i tng GeometryUpdater
khng bit c s nh c s dng th gi tr ny phi c c t
i tng Geometry c truyn cho n. Tt nhin, thng tin ny ch
c th c c nu kh nng thch hp c thit lp. Dng m tip sau
hai dng m gn nhn

chu trch nhim thit lp kh nng c s lng

nh.
http://tailieuhay.com

559

Lp trnh ha trn Java 2D v 3D


Cc dng m cn li trong on m sau khi to to cho N nh. Mi
nh c khi to to (0, baseElevation, 0), do ban u, khng c
phn t no c nhn thy.
public class Fountain extends BranchGroup {
protected LineArray waterLines = null;
protected float baseElevation = -0.45f;
protected

GeometryUpdater

geometryUpdater

new WaterUpdater();
Geometry createWaterGeometry() {
int N = 1400; // number of 'drops'
waterLines

new

LineArray(N

2,

LineArray.COORDINATES
| LineArray.BY_REFERENCE);

waterLines.setCapability(GeometryArray.ALLOW_REF_
DATA_WRITE);

waterLines.setCapability(GeometryArray.ALLOW_REF_
DATA_READ);

http://tailieuhay.com

560

Lp trnh ha trn Java 2D v 3D

waterLines.setCapability(GeometryArray.ALLOW_COUN
T_READ);
float[] coordinates = new float[N * 3 *
2];
int p;
for (p = 0; p < N; p += 2) { // for each
particle
coordinates[p * 3 + 0] = 0.0f;
coordinates[p

1]

4]

baseElevation;
coordinates[p * 3 + 2] = 0.0f;
coordinates[p * 3 + 3] = 0.0f;
coordinates[p

baseElevation;
coordinates[p * 3 + 5] = 0.0f;
}
waterLines.setCoordRefFloat(coordinates);
//

the

following

statements

would

be

redundant
// waterLines.setInitialCoordIndex(0);
// waterLines.setValidVertexCount(N*2);
return waterLines;
}

http://tailieuhay.com

561

Lp trnh ha trn Java 2D v 3D

abstract

class

UpdateWaterBehavior

extends

Behavior {
WakeupOnElapsedFrames w = null;
public UpdateWaterBehavior() {
w = new WakeupOnElapsedFrames(0);
}
public void initialize() {
wakeupOn(w);
}
public

void

processStimulus(Enumeration

critiria) {
waterLines.updateData(geometryUpdater);
wakeupOn(w);
} // end processStimulus
} // end class UpdateWaterBehavior
public

class

WaterUpdater

implements

GeometryUpdater {
Random random;
public WaterUpdater() {

http://tailieuhay.com

562

Lp trnh ha trn Java 2D v 3D


random = new Random();
}
public

void

updateData(Geometry

geometry) {
GeometryArray

geometryArray

(GeometryArray) geometry;
float[]

coords

geometryArray.getCoordRefFloat();
int

geometryArray.getValidVertexCount();
int i;
for (i = 0; i < N; i += 2) { // for
each particle
if

(coords[i

1]

>

baseElevation) { // update active


// particles
coords[i

0]

+=

coords[i * 3 + 0] - coords[i * 3 + 3]; // x1


coords[i

1]

+=

coords[i * 3 + 1] - coords[i * 3 + 4]
- 0.01f; // y1
coords[i

2]

+=

coords[i * 3 + 2] - coords[i * 3 + 5]; // z1


coords[i

3]

(coords[i * 3 + 0] + coords[i * 3 + 3]) / 2; //


x2

http://tailieuhay.com

563

Lp trnh ha trn Java 2D v 3D


coords[i

4]

(coords[i * 3 + 1] + coords[i * 3 + 4] + 0.01f) /


2;// y2
coords[i

5]

(coords[i * 3 + 2] + coords[i * 3 + 5]) / 2; //


z2
if

(coords[i

1]

<

baseElevation) { // if particle
// below base
coords[i

0]

coords[i

1]

coords[i

2]

coords[i

3]

coords[i

4]

coords[i

5]

0.0f; // x1
baseElevation; // y1
0.0f; // z1
0.0f; // x2
baseElevation; // y2
0.0f; // z2
}
} else { // an inactive particle
if

(random.nextFloat()

>

0.8) { // randomly start a drop


coords[i

0]

0.03f * (random.nextFloat() - 0.5f); // x1

http://tailieuhay.com

564

Lp trnh ha trn Java 2D v 3D


coords[i

1]

2]

0.14f * random.nextFloat()
+
baseElevation; // y1
coords[i

0.03f * (random.nextFloat() - 0.5f); // z1


} // end if
} // end if-else
} // end for loop
}
}
}
on m sau nh ngha lp UpdateWaterBehavior, mt lp m rng
t lp Behavior. y l on m d nht trong ng dng
GeometryUpdater. Lp Behavior iu khin hot nh bng cch gi
phng thc updateGeometry ca i tng hnh hc c to hot nh
khi phng thc processStimulus ca n c gi.
nh ngha lp UpdateWaterBehavior bao gm trng w mt tham
chiu n i tng WakeupOnElasedFrames - c s dng kch
hot i tng hnh vi. i tng WakeupOnElasedFrames c to
trong phng thc khi to ca UpdateWaterBehavior bt u t dng
m

dn

nhn

Phng

thc

UpdateWaterBehavior, bt u t dng m

initialize()

ca

lp

, thit lp iu kin nh

thc ban u cho i tng hnh vi.


Phng thc processStimulus(), bt u t dng m gn nhn

, nh

ngha cc hnh ng ca i tng hnh vi p ng li cc s kin nh


thc n. Trong trng hp ny, phng thc updateData() c gi v
truyn tham s geometryUpdater cho waterLines.

http://tailieuhay.com

565

Lp trnh ha trn Java 2D v 3D


abstract

class

UpdateWaterBehavior

extends

Behavior {
WakeupOnElapsedFrames w = null;
public UpdateWaterBehavior() {
w = new WakeupOnElapsedFrames(0);
}
public void initialize() {
wakeupOn(w);
}
public

void

processStimulus(Enumeration

critiria) {
waterLines.updateData(geometryUpdater);
wakeupOn(w);
} // end processStimulus
} // end class UpdateWaterBehavior
on m sau nh ngha lp GeometryUpdater. GeometryUpdater
dch chuyn cc phn t nc bng cch thay i d liu ta ca
chng.
Lp GeometryUpdater trong ng dng ny c mt hm khi to v
mt phng thc. Trong hm khi to, nhn

, mt i tng Random

c to ra s dng trong phng thc thng duy nht ca lp,


phng thc updateData().

http://tailieuhay.com

566

Lp trnh ha trn Java 2D v 3D


Phng thc updateData(), nhn

, to hot nh cho cc phn t

nc. Thng thng, khng phi tt c cc phn t u hot ng ti


cng mt thi im. Phn t no khng hot ng s c ta y trng vi
ta y ca chn i phun (baseElevation). Nu mt phn t c ta y
bng vi baseElevation, n c coi l khng hot ng v v th, phn t
ny khng di chuyn. Ban u, tt c cc phn t nc u khng hot
ng.
Xt h phn t ny mt thi gian ngn sau khi khi ng, khi ny,
c mt vi phn t hot ng, s cn li th cha. Mi ln updateData()
c gi, tin trnh hot nh s thu thp thng tin lin quan v i tng
hnh hc cp nht. Trn dng m

, tham s Geometry c p kiu

thnh GeometryArray. Trn dng m

, mt tham chiu n d liu ta

nh c ly ra. Dng

thu thp s lng nh.

Ch rng, ng dng ny c th chy hiu qu hn bng cch tnh


ton cc thng tin ny mt ln ri lu tr n trong cc trng ca i
tng. Tuy nhin, hiu qu t c cng ch hn ch v lm cho on
m khng s dng li c. Lp Geometry ny c th c s dng cho
i phun vi cc kch thc khc nhau.
Khi c nhng bc chun b thch hp, phng thc updateData() xt
mi phn t ti mt thi im no trong vng lp

. Vi mi phn t

hot ng (xc nh bng cch so snh ta y ca n vi


baseElevation), chng trnh s tnh ton chuyn ng cong dng parabol
ca n. Ta nh u tin ca mt phn t c gn cc gi tr thch
hp m hnh chuyn ng, sau , ta c ca nh th nht s c
gn cho nh th hai.
Cu lnh if trn dng

kim tra xem phn t vt qua

baseElevation hay cha. Nu iu kin ny tha mn, phn t s


ngng hot ng bi chng trnh cp nht gi tr ta c hai nh ca
n v gi tr ban u, gi tr xc nh phn t khng hot ng.
http://tailieuhay.com

567

Lp trnh ha trn Java 2D v 3D


Mt phn cc phn t khng hot ng, phn else ca iu kin trn dng
, c ngu nhin khi to bi iu kin trn dng

. Trong v d ny,

mt lng trung bnh khong 20% cc phn t khng hot ng s c


khi to.
public

class

WaterUpdater

implements

GeometryUpdater {
Random random;
public WaterUpdater() {
random = new Random();
}
public

void

updateData(Geometry

geometry) {
GeometryArray

geometryArray

coords

(GeometryArray) geometry;
float[]

geometryArray.getCoordRefFloat();
int

geometryArray.getValidVertexCount();
int i;
for (i = 0; i < N; i += 2) { // for
each particle
if

(coords[i

1]

>

baseElevation) { // update active

http://tailieuhay.com

568

Lp trnh ha trn Java 2D v 3D

// particles
coords[i

0]

+=

coords[i * 3 + 0] - coords[i * 3 + 3]; // x1


coords[i

1]

+=

coords[i * 3 + 1] - coords[i * 3 + 4]
- 0.01f; // y1
coords[i

2]

+=

coords[i * 3 + 2] - coords[i * 3 + 5]; // z1


coords[i

3]

(coords[i * 3 + 0] + coords[i * 3 + 3]) / 2; //


x2
coords[i
(coords[i

1]

coords[i

3
*

+
3

4]
+

4]

=
+

0.01f) / 2;// y2
coords[i

5]

(coords[i * 3 + 2] + coords[i * 3 + 5]) / 2; //


z2
if

(coords[i

1]

<

coords[i

0]

coords[i

1]

coords[i

2]

baseElevation) { // if particle
// below base
0.0f; // x1
baseElevation; // y1
0.0f; // z1

http://tailieuhay.com

569

Lp trnh ha trn Java 2D v 3D


coords[i

3]

coords[i

4]

coords[i

5]

0.0f; // x2
baseElevation; // y2
0.0f; // z2
}
}

else

//

an

inactive

particle
if

(random.nextFloat()

>

0.8) { // randomly start a drop


coords[i

0]

0.03f * (random.nextFloat() - 0.5f); // x1


coords[i

1]

2]

0.14f * random.nextFloat()
+
baseElevation; // y1
coords[i

0.03f * (random.nextFloat() - 0.5f); // z1


} // end if
} // end if-else
} // end for loop
}
}
Ct nc trong hot nh trng s p hn nu cc on thng biu
din mi phn t loi b c rng ca. Vic ny c th thc hin c
bng

cch

thm

tng

LineAttributes

vi

setLineAntialiasedEnable(true) vo thnh phn Appearance ca phn t

http://tailieuhay.com

570

Lp trnh ha trn Java 2D v 3D


nc. Tuy nhin, lu rng, vic lm ny c th phi tr gi bi tc
x l hot nh.

http://tailieuhay.com

571

Lp trnh ha trn Java 2D v 3D


Ti liu tham kho
Trong qu trnh lm cun tutorial v lp trnh ha trong Java 2D
& 3D chng em c tham kho cc ti liu sau:
1. Slide bi ging K thut ha v hin thc o ca ThS.L Tn
Hng.
2. The Java Tutorial, 2nd Volume. Available online at:
http://java.sun.com/docs/books/tutorial/2d/index.html
3. The 2D Text Tutorial. Available online from the Java Developer
Connection:
http://developer.java.sun.com/developer/onlineTraining/Graphics/2
DText/
3. The Java 2D Sample Programs. Available online at:
http://java.sun.com/products/java-media/2D/samples/index.html
4. The Java 2D Demo. Available from the Java 2D website:
http://java.sun.com/products/java-media/2D/index.html
5. The Java 3D document at:
http://java.sun.com/developer/onlineTraining/java3d/

http://tailieuhay.com

572

You might also like