You are on page 1of 571

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......................51 2.4 Rendering Graphics Primitives.......................................................................53 2.4.1 Drawing a Shape......................................................................................53 2.4.2 Filling a Shape.........................................................................................55 1

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


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

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


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

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


1.9.1 nh ngha cc hnh vi animation.........................................................240 1.9.2 Cc hm bin i v thi gian: nh x mt hnh vi vi thi gian........241 1.9.3 Lp danh mc cc vng.........................................................................242 1.9.4 V d v hnh vi: HelloJava3Dc ...........................................................243 1.9.5 Php bin hnh v kt hp cc hnh vi .V d: HelloJava3Dd .............246 CHNG 2............................................................................................................251 To cc hnh............................................................................................................251 2.1 H ta th gii o.....................................................................................251 2.2 Visual Object Definition Basics...................................................................252 2.2.1 An Instance of Shape3D Defines a Visual Object................................252 2.2.2 Node Components..................................................................................254 2.2.3 Defining Visual Object Classes.............................................................255 2.3 Cc lp tin ch hnh hc .............................................................................256 2.3.1 Box.........................................................................................................257 2.3.2 Cone ......................................................................................................259 2.3.3 Cylinder.................................................................................................259 2.3.4 Sphere....................................................................................................260 2.3.5 More About Geometric Primitives........................................................261 2.3.6 ColorCube .............................................................................................261 2.3.7 Example: Creating a Simple Yo-Yo From Two Cones ........................261 2.4 Cc lp ton hc...........................................................................................267 2.4.1 Point Classes .............................................................................................271 2.4.2 Color Classes.........................................................................................272 2.4.3 Vector Classes........................................................................................274 2.4.4 TexCoord Classes..................................................................................275 2.5 Cc lp hnh hc...........................................................................................276 2.5.1 GeometryArray Class ...........................................................................277 2.5.2 Subclasses of GeometryArray ..............................................................284 2.5.3 Subclasses of GeometryStripArray........................................................286 2.5.4 Subclasses of IndexedGeometryArray...................................................293 2.5.5 Axis.java is an Example of IndexedGeometryArray ............................296 2.6 Appearance and Attributes............................................................................296 2.6.1 Appearance NodeComponent................................................................298 2.6.2 Sharing NodeComponent Objects ........................................................298 2.6.3 Attribute Classes ...................................................................................299 2.6.4 Example: Back Face Culling ................................................................310 2.7 Bounds and Scope ........................................................................................320 2.7.1 Bounds Node Components ...................................................................321 2.7.2 BoundingLeafa Node ............................................................................325 2.7.3 Scope......................................................................................................327 2.8 Hnh hc nng cao........................................................................................329 2.8.1 Multiple Geometries in a Single Shape3D ...........................................329 2.8.2 GeometryArray .....................................................................................332 2.8.4 AlternateAppearance <new in 1.2> ......................................................340 2.9 Clipping Ct xn........................................................................................343 2.9.1 View Defines a Frustum........................................................................343 2.9.2 Clip Node ..............................................................................................345 2.9.4 ModelClip Example ..............................................................................346 CHNG 3............................................................................................................350 TO NI DUNG....................................................................................................350 4

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


3.1 Ni dung chnh..............................................................................................350 3.1.1 GeometryInfo.........................................................................................351 3.2.1 Mt v d n gin v GeometryInfo........................................................351 3.2.2 S dng GeometryInfo..........................................................................352 3.2.3 Mt s lp thng dng c lin quan n GeometryInfo........................353 Loaders................................................................................................................358 Mt v d n gin s dng leader.................................................................359 Cc loader ph bin...........................................................................................360 3.3.3 Giao din ca gi Loader v lp c s...............................................361 Vit mt loader...................................................................................................365 Cng vic ca mt loader...............................................................................365 Hm to lp Loader........................................................................................366 Vit mt File Loader n gin........................................................................368 Text2D................................................................................................................379 3.5.1 V d Text2D n gin..........................................................................380 3.5.2 Lp Text2D............................................................................................380 Text3D................................................................................................................382 Mt v d Text3D...........................................................................................382 Nhng lp lin quan to ra i tng Text3D...........................................384 Nn khng gian ha ......................................................................................391 Mt v d background.....................................................................................391 Lp Background.............................................................................................392 CHNG 4............................................................................................................396 TNG TC.........................................................................................................396 4.1 Hnh vi: C s ca tng tc v hot hnh...................................................397 4.1.1 ng dng ca hnh vi............................................................................397 4.1.2 Tng quan lp Behaviour......................................................................399 4.2 C bn v hnh vi.........................................................................................399 4.2.1 Vit mt lp Behaviour.........................................................................400 4.2.2 S dng mt lp Behaviour...................................................................405 4.2.3 Cc hm API trong lp Behaviour.........................................................409 4.3 iu kin kch hot: Cch kch hot cc hnh vi..........................................412 4.3.1 iu kin kch hot................................................................................413 4.3.2 WakeupCriterion....................................................................................414 4.3.3 Quy nh lp WakeupCriterion.............................................................414 4.3.4 Thnh phn ca WakeupCondition .......................................................430 4.4 Lp Behaviour tin ch x l bn phm........................................................432 4.4.1 Mt v d n gin.................................................................................433 4.4.2 Lp KeyNavigatorBehaviour v KeyNavigator..................................435 4.5 Lp tin ch tng tc vi chut...................................................................437 4.5.1 S dng lp MouseBehaviour ..............................................................437 4.5.2 Mouse Behaviour Foundation................................................................442 4.5.3 Cc lp MouseBehaviour .....................................................................444 4.5.4 Mouse Navigation..................................................................................447 4.6 Picking Object...............................................................................................450 4.6.1 Using Picking Utility Classes................................................................454 4.6.2 Cc hm API c bn trong cc lp Picking ..........................................458 4.6.3 Cc lp picking......................................................................................467 4.6.4 Cc lp Picking Behavior .....................................................................471 CHNG 5............................................................................................................474 5

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D


Hot Hnh................................................................................................................474 Animation - Hot hnh:.......................................................................................476 i tng Interpolator v Alpha vi hot nh da thi gian.............................477 Alpha...................................................................................................................477 S dng cc i tng Interpolator v Alpha:...................................................480 V d s dng lp Alpha v RotationInterpolator:.............................................480 Alpha API:..........................................................................................................486 Cc lp hnh vi Interpolator :.............................................................................489 Core Interpolator API:.......................................................................................504 Cc lp i tng ni suy ng:......................................................................513 Lp Billboard :........................................................................................................522 S dng i tng Billboard .............................................................................523 Chng trnh v d s dng Billboard ...............................................................525 Giao din lp trnh ng dng ca Billboard (Billboard API)...........................529 OrientedShape3D................................................................................................531 Giao din lp trnh ng dng ca OrientedShape3D..........................................532 V d s dng OrientedShape3D........................................................................533 Hot nh mc chi tit (Level Of Detail Animations).........................................535 S dng i tng DistanceLOD.......................................................................536 Cc li thng gp khi s dng LOD ............................................................537 V d s dng DistanceLOD..............................................................................537 Giao din lp trnh ng dng DistanceLOD API...............................................544 Morph .................................................................................................................545 S dng i tng Morph ..................................................................................546 V d s dng Morph .........................................................................................547 Giao din lp trnh ng dng Morph API..........................................................553 Giao din GeometryUpdater...................................................................................554 S dng GeometryUpdater.................................................................................555 Chng trnh v d h thng phn t i phun nc s dng GeometryUpdater ............................................................................................................................556

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
http://tailieuhay.com 6

Lp trnh ha trn Java 2D v 3D ca 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. x

(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 b c 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 i tng GraphicsConfiguration.Mt i 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 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: cc phn

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 t 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 (java.awt.geom) M t Miu t mt php bin i 2D affine ,m thc hin 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 t c to ra tu i 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 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: non-zero translation from its

AffineTransform

aT

g2d.getTransform();

g2d.transform(...); g2d.draw(...); g2d.setTransform(aT);

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 Graphics2D bng cch gi cho ng cnh ca i tng phng 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:

qualityHints

new

RenderingHints(RenderingHints.KEY_ANTiALiAS iNG, RenderingHints.VALUE_ANTiALiAS_ON); qualityHints.put(RenderingHints.KEY_RENDERi NG, RenderingHints.VALUE_RENDER_QUALiTY); g2.setRenderingHints(qualityHints); 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.

wideStroke

new

BasicStroke(12.0f);

g2.setStroke(wideStroke); 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:

roundStroke

new

BasicStroke(4.0f,

BasicStroke.CAP_ROUND, BasicStroke.JOiN_ROUND); g2.setStroke(roundStroke); 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

fot la

dash1[] bs

= =

{00} 1.f; new BasicStroke(5.0f,

BasicStroke

BasicStroke.CAP_BUTT, BasicStroke.JOiN_MiTER, 00) .f; g2.setStroke(bs); Line2D 10.0f, ln ie 100.0f, = new Line2D.Float(20.0f, 10.0f, dash1,

10.0f);

g2.draw(line); fot] la[ 4. , 0f bs dash2 2. , 0f = = {.f 60, 4.0 f, 2 f, .0

40} .f; new BasicStroke(5.0f,

BasicStroke.CAP_BUTT, BasicStroke.JOiN_MiTER, 00) .f; g2.setStroke(bs); g2.draw(line) 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
http://tailieuhay.com 43

10.0f,

dash2,

Lp trnh ha trn Java 2D v 3D

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: 1. Khi to i tng GradientPaint . 2. Gi phng thc Graphics2D.setPaint. 3. Khi to i tng Shape.

http://tailieuhay.com

44

Lp trnh ha trn Java 2D v 3D

Trong v d sau y, mt hnh ch nht c t vi mu dt n gin t mt i tng buffered image.

GradientPaint GradientPaint(50.0f, 50.0f, 250.0f,

gp 50.0f,

= Color.blue

new

Color.green);

g2.setPaint(gp); g2 ill ct( , .f Re 50 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. // of Create size a buffered bi = = new image texture patch 5,

//5x5 Bufferedimage(5,

Bufferedimage Graphics2D big

Bufferedimage.TYPE_iNT_RGB); bi.createGraphics(); big.setColor(Color.green);


http://tailieuhay.com 45

Lp trnh ha trn Java 2D v 3D big.fillRect(0,0,5,5); big.setColor(Color.lightGray); big.fillOval(0,0,5,5); // Create image r = tp new = Rectangle(0,0,5,5); new paint a to the graphics filled a texture paint from the buffered Rectangle

TexturePaint // // with } Add the

TexturePaint(bi,r,TexturePaint.NEAREST_NEiGHBOR); texture and context. g2.setPaint(tp); Create the render rectangle 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. 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.

public

void

paint(Graphics

g)

http://tailieuhay.com

46

Lp trnh ha trn Java 2D v 3D Graphics2D g2 = (Graphics2D) g;

// it n it n // the

The w h

width = =

and

height

of

the

canvas

getSize().width; getSize().height; an elpe lis path e = new and use i t as

Create clipping

Ellipse2D

Ellipse2D.Float(w/4.0f,h/4.0f, w/2.0f,h/2.0f); g2.setClip(e);

//

Fl il

the the

canvas. ci lp

Only i s

the

area

within

rendered

g2.setColor(Color.cyan); g2 ill ct( 0,w ); .f Re 0, ,h

// i t //

Change to the the

the

clipping

path, of and

setting

intersection current ci lp

new

rectangle. Rectangle r = new

Rectangle(w/4+10,h/4+10,w/2-20,h/2-20); g.lpr; 2ci()

//

Fl il the

the new

canvas. ci lp

Only

the

area

within // i s

rendered

http://tailieuhay.com

47

Lp trnh ha trn Java 2D v 3D g2.setColor(Color.magenta); g2 ill ct( 0,w ); .f Re 0, ,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
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

http://tailieuhay.com

48

Lp trnh ha trn Java 2D v 3D 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.

AffineTransform Rectangle2D

aT

= rect

g2.getTransform(); = new

Rectangle2D.Float(1.0,1.0,2.0,3.0); AffineTransform rotate45 =

AffineTransform.getRotateinstance(Math.Pi /4.0,0.0,0.0) g2.transform(rotate45); g2.draw(rect); g2.setTransform(aT);

Cn trong v d ny,mt i tng AffineTransform c s dng quay cc cu text xung quang mt im trung tm.

//

Define

the

rendering at

transform = new

AffineTransform AffineTransform(); // make // Apply room a for

translation the t t ex .

transform

to

rotated

http://tailieuhay.com

49

Lp trnh ha trn Java 2D v 3D at.setToTranslation(400.0, g2.transform(at); // Create the a text / of angles i < 4; i++) 00) .f; { 20; .) the string rotation transform to 400.0);

rotate

at.setToRotation(Math.Pi // Render at four 90 i copies degree = 0;

a a Jv for

(n it

g2.drawString(Java, g2.transform(at); }

0.0f ,

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:

AffineTransform

rotate45

AffineTransform.getRotateinstance(Math.Pi /4.0,0.0,0.0) g2.drawimage(myimage, rotate45);

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


http://tailieuhay.com 50

Lp trnh ha trn Java 2D v 3D 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 ER); 2. Gi phng thc setComposite thm i 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 ac =AlphaComposite.getinstance(AlphaComposite.SRC_OV

http://tailieuhay.com

51

Lp trnh ha trn Java 2D v 3D 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 ER, .5f);

ac

=AlphaComposite.getinstance(AlphaComposite.SRC_OV

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.

public

void g2

paint(Graphics = (Graphics2D)

g) g;

Graphics2D

g2.setColor(Color.red);

g2.translate(100,50); // radians=degree * pie / 180

g2.rotate((45*java.lang.Math.Pi)/180); g2.fillRect(0,0,100,100); g2.setTransform(new set // to identity a new ac alpha = composite AffineTransform()); //

Create

AlphaComposite

http://tailieuhay.com

52

Lp trnh ha trn Java 2D v 3D AlphaComposite.getinstance(AlphaComposite.SR C_OVER,0.5f); g2.setComposite(ac); g2.setColor(Color.green); g2.fillRect(50,0,100,100); g2.setColor(Color.blue); g2.fillRect(125,75,100,100); g2.setColor(Color.yellow); g2.fillRect(50,125,100,100); g2.setColor(Color.pink); g2.fillRect(-25,75,100,100); }

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 . 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.

http://tailieuhay.com

53

Lp trnh ha trn Java 2D v 3D 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 .

public

void g2

paint(Graphics = (Graphics2D)

g) g;

Graphics2D

//

create

and

set

the

stroke

g2.setStroke(new // Create a

BasicStroke(4.0f)); star using a general path

object

http://tailieuhay.com

54

Lp trnh ha trn Java 2D v 3D GeneralPath p = new

GeneralPath(GeneralPath.NON_ZERO); p.moveTo(p.lineTo(+ p.lineTo(p.lineTo(+ p.lineTo(+ 100.0f, 100.0f, 50.0f, 0. 0f, 50.0f, + + 25.0f); 25.0f); 100.0f); 100.0f); 100.0f);

p.closePath();

//

translate

origin

towards

center

of

canvas g2.translate(100.0f,

100.0f);

//

render

the

sa' trs

path

g2.draw(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 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 s dng Graphics2D.setColor hay Graphics2D.setPaint.
http://tailieuhay.com 55

Lp trnh ha trn Java 2D v 3D 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.

public

void g2

paint(Graphics = (Graphics2D)

g) g;

Graphics2D

g2.setPaint(Color.green); Rectangle2D r2 = new

Rectangle2D.Float(25,25,150,150);

g.ilr) 2fl(2; } 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
http://tailieuhay.com 56

Lp trnh ha trn Java 2D v 3D 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 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:

http://tailieuhay.com

57

Lp trnh ha trn Java 2D v 3D

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. 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 g) c;

new

Frame(GraphicsConfiguration

Rectangle
http://tailieuhay.com

bounds

gc.getBounds();
58

Lp trnh ha trn Java 2D v 3D f.setLocation(10 bounds.y); + bounds.x, 10 +

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.

Rectangle Rectangle();

virtualBounds

new

GraphicsEnvironment

ge

GraphicsEnvironment.getLocalGraphicsEnviron ment(); GraphicsDevice[] ge.getScreenDevices(); for +) (n it { gd = g[] sj; gc = j = 0; j < gs.length; j+ gs =

GraphicsDevice

GraphicsConfiguration[] gd.getConfigurations();

http://tailieuhay.com

59

Lp trnh ha trn Java 2D v 3D for +) (n it { = i = 0; i < gc.length; i+

virtualBounds virtualBounds.union(gc[i].getBounds()); } }

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.

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

http://tailieuhay.com

60

Lp trnh ha trn Java 2D v 3D /* * 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 { /** * */ 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;

http://tailieuhay.com

61

Lp trnh ha trn Java 2D v 3D

public void init() { GridBagLayout GridBagLayout(); getContentPane().setLayout(layOut); GridBagConstraints GridBagConstraints(); c.weightx = 1.0; c.fill = GridBagConstraints.BOTH; primLabel = new JLabel(); primLabel.setText("Hnh gc"); Font newFont = getFont().deriveFont(1); primLabel.setFont(newFont); c = new layOut = new

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");


http://tailieuhay.com 62

Lp trnh ha trn Java 2D v 3D 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); =

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);

http://tailieuhay.com

63

Lp trnh ha trn Java 2D v 3D GridBagConstraints GridBagConstraints(); ls.weightx = 1.0; ls.fill = GridBagConstraints.BOTH; primitive = new JComboBox(new Object[] { "Hnh ch nht", "Hnh elip", "Vn bn" }); primitive.additemListener(this); newFont = newFont.deriveFont(0, 14.0f); primitive.setFont(newFont); layOut.setConstraints(primitive, ls); getContentPane().add(primitive); line = new JComboBox(new Object[] ls = new

{ "Mnh", "m", "Nt t" }); line.additemListener(this); line.setFont(newFont); layOut.setConstraints(line, ls); getContentPane().add(line); paint = new JComboBox(new Object[]

{ "ng nht", "T loang", "polka" }); paint.additemListener(this); paint.setFont(newFont); layOut.setConstraints(paint, ls); getContentPane().add(paint); ls.gridwidth GridBagConstraints.RELATiVE; =

http://tailieuhay.com

64

Lp trnh ha trn Java 2D v 3D 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; 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 GridBagConstraints(); button.gridwidth GridBagConstraints.REMAiNDER; redraw = new JButton("V li"); redraw.addActionListener(this); redraw.setFont(newFont); layOut.setConstraints(redraw, button); getContentPane().add(redraw); GridBagConstraints GridBagConstraints(); tP = new = button = new =

http://tailieuhay.com

65

Lp trnh ha trn Java 2D v 3D 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); 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; } =

http://tailieuhay.com

66

Lp trnh ha trn Java 2D v 3D JFrame chuyn i"); frame.addWindowListener(new WindowAdapter() { public windowClosing(WindowEvent e) { System.exit(0); } }); JApplet applet = new Transform(); void frame = new JFrame("Cc php

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;

http://tailieuhay.com

67

Lp trnh ha trn Java 2D v 3D

Shape shapes[] = new Shape[3]; Bufferedimage bi; boolean firstTime = true; public TransPanel() { setBackground(Color.white); shapes[0] 100); shapes[1] 0.0, 100.0, 100.0); TextLayout 1, AffineTransform AffineTransform(); textAt.translate(0, 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; (float) textTl 76), textAt = = new new new TextLayout("Brother Hood", new Font("Tomaha", FontRenderContext(null, false, false)); = new Ellipse2D.Double(0.0, = new Rectangle(0, 0, 100,

http://tailieuhay.com

68

Lp trnh ha trn Java 2D v 3D case 1: at.rotate(Math.toRadians(45)); break; case 2: at.scale(0.5, 0.5); break; 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 = "Nhp mt hnh c s ban u, kiu ng,kiu v, php bin i,"; TextLayout thisTl = new TextLayout(instruct, new Font("Helvetica",

http://tailieuhay.com

69

Lp trnh ha trn Java 2D v 3D 0, g2.getFontRenderContext()); float float width height = = (float) (float) thisTl.getBounds().getWidth(); thisTl.getBounds().getHeight(); thisTl.draw(g2, w / 2 - width / 2, 15); instruct = "v cc phng thc to bng sau nhn 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(); 10),

http://tailieuhay.com

70

Lp trnh ha trn Java 2D v 3D switch (Transform.line.getSelectedindex()) { case 0: g2.setStroke(new BasicStroke(3.0f)); break; 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,

http://tailieuhay.com

71

Lp trnh ha trn Java 2D v 3D h, Color.blue, false)); break; case 2: Bufferedimage Bufferedimage(15, 15, Bufferedimage.TYPE_iNT_RGB); Graphics2D 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. buffig = buffi = new

http://tailieuhay.com

72

Lp trnh ha trn Java 2D v 3D AffineTransform g2.getTransform(); AffineTransform AffineTransform(); 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); toCenterAt = new saveXform =

http://tailieuhay.com

73

Lp trnh ha trn Java 2D v 3D g2.setTransform(saveXform); } } } Kt qu sau khi chy chng trnh :

http://tailieuhay.com

74

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 75

Lp trnh ha trn Java 2D v 3D Giao din PathIterator Shape (java.awt) M t nh ngha cc phng thc cho vic phc hI cc phn t t mt ng dn. Cung cp mt tp cc phng thc cho vic miu t 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 e CubicCurve2D.Float Implements: Shape Miu t cc on ng cong tham s bc ba 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 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.
76

CubicCurve2D.Doubl Lp thc thi:Shape.

and

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D

Ellipse2D Ellipse2D.Double Ellipse2D.Float

M rng: RectangularShape Miu t vic nh ngha ng e-lip bng cc 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 Line2D.Double Line2D.Float ng thng v cc ng bc hai v bc ba Thc thi i tng Shape. Miu t mt on thng trong khng gian ta (x,y) .c thc thi xc nh cc ng thng vi chnh xc float v double:: Line2D.Float Point2D Point2D.Double Point2D.Float QuadCurve2D QuadCurve2D.Doubl e QuadCurve2D.Float v Line2D.Double. Mt im miu t mt v tr trong khng gian ta (x,y).c thc thi xc inh cc im vi chnh xc float v double: Point2D.Float v Point2D.Double. Thc thi i tng Shape. Miu t mt on ng cong tham s bc hai trong khng gian ta (x,y).c thc thi xc nh cc ng bc hai vi chnh xc float Rectangle2D v double: QuadCurve2D.Float v QuadCurve2D.Double. M rng: RectangularShape
77

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D Rectangle2D.Double Rectangle2D.Float Miu t mt hnh ch nht c nh ngha bi 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 ouble oat bin. M rng: RectangularShape c nh ngha bng mt v tr (x, y),mt kch gc cung. c thc thi xc inh cc hnh ch nht c gc trn vi chnh xc float v double: RoundRectangle2D.Float RoundRectangle2D.Double. v v

RoundRectangle2D.D Miu t mt hnh ch nht cc gc c lm trn RoundRectangle2D.Fl thc (w x h),v chiu rng v chiu cao ca

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.
78

http://tailieuhay.com

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 java.awt.geom 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, 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. 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: The Java2D API cn cung cp mt kiu shape c bit h tr cho vic xy dng din tch hnh

http://tailieuhay.com

79

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 */ import java.awt.*;


http://tailieuhay.com 80

Lp trnh ha trn Java 2D v 3D

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 GridBagLayout(); getContentPane().setLayout(layOut); GridBagConstraints GridBagConstraints(); l.weightx = 1.0; l = new layOut = new

http://tailieuhay.com

81

Lp trnh ha trn Java 2D v 3D l.fill = GridBagConstraints.BOTH; l.gridwidth GridBagConstraints.RELATiVE; alphaLabel = new JLabel(); alphaLabel.setText("Cng mu"); 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); GridBagConstraints GridBagConstraints(); a.gridwidth GridBagConstraints.RELATiVE; a.weightx = 1.0;
http://tailieuhay.com 82

new =

Lp trnh ha trn Java 2D v 3D 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); getContentPane().add(rules); GridBagConstraints GridBagConstraints(); fC.fill = GridBagConstraints.BOTH; fC.weightx = 1.0; fC = new =

http://tailieuhay.com

83

Lp trnh ha trn Java 2D v 3D 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() return; } Object choice = e.getSource(); if (choice == alphas) { alpha alphas.getSelecteditem(); } else { rule = rules.getSelectedindex(); } comp.changeRule(alpha, rule); } public static void main(String s[]) { JFrame f = new JFrame("Kt hp"); f.addWindowListener(new WindowAdapter() { = (String) != itemEvent.SELECTED) { =

http://tailieuhay.com

84

Lp trnh ha trn Java 2D v 3D public 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 = void

AlphaComposite.getinstance(AlphaComposite.SRC); float alpha = 1.0f; public CompPanel() { } public void changeRule(String a, int rule) { alpha = Float.valueOf(a).floatValue(); ac repaint(); } = AlphaComposite.getinstance(getRule(rule), alpha);

http://tailieuhay.com

85

Lp trnh ha trn Java 2D v 3D

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: alphaComp = AlphaComposite.SRC_OVER; break; case 6: alphaComp = AlphaComposite.SRC_OUT; break; case 7: alphaComp = AlphaComposite.CLEAR; break; } return alphaComp;

http://tailieuhay.com

86

Lp trnh ha trn Java 2D v 3D } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; Dimension d = getSize(); int w = d.width; int h = d.height; Bufferedimage Bufferedimage(w, h, Bufferedimage.TYPE_iNT_ARGB); Graphics2D buffimg.createGraphics(); g2.setColor(Color.white); g2.fillRect(0, 0, d.width, d.height); int rectx = w / 4; int recty = h / 4; gbi.setColor(new Color(0.0f, 0.0f, 1.0f, 1.0f)); gbi.fill(new 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, Rectangle2D.Double(rectx, gbi = buffimg = new

http://tailieuhay.com

87

Lp trnh ha trn Java 2D v 3D 150, 100)); g2.drawimage(buffimg, null, 0, 0); } } Kt qu ca chng trnh :

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:

http://tailieuhay.com

88

Lp trnh ha trn Java 2D v 3D

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 */ 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; 1.0 27/03/06

http://tailieuhay.com

89

Lp trnh ha trn Java 2D v 3D

/* * Chuong trinh nay ve mot qua le,su dung phuong thuc ket hop giua cac */ @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(); 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(); vung.

http://tailieuhay.com

90

Lp trnh ha trn Java 2D v 3D int w = d.width; int h = d.height; double ew = w / 2; double eh = h / 2; g2.setColor(Color.green); leaf.setFrame(ew 15.0); leaf1 = new Area(leaf); leaf.setFrame(ew 30.0); leaf2 = new Area(leaf); leaf1.intersect(leaf2); g2.fill(leaf1); leaf.setFrame(ew 15.0); leaf1 = new Area(leaf); 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 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 70.0); 19, eh 20, 40.0, + 3, eh 47, 50.0, + 1, eh 29, 15.0, 14, eh 47, 30.0, 16, eh 29, 15.0,

http://tailieuhay.com

91

Lp trnh ha trn Java 2D v 3D 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 windowClosing(WindowEvent e) { System.exit(0); } }); 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: void

http://tailieuhay.com

92

Lp trnh ha trn Java 2D v 3D

http://tailieuhay.com

93

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 r OpenType 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 ng c th truy cp n cc thit k iu khin. Miu t cc font kiu m(Open Type)v kiu thc(True
94

http://tailieuhay.com

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 (java.awt) M t Miu t mt th hin ca b mt font(font face) 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 GlyphJustificationInfo kiu font v cc ng nt ca n. ng gi thng tin cn thit cho cc php o vn 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 thc thi bi v ShapGaphicAttribute

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 95

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 TextLayout rendering). Miu t thng tin hit test cho cc k t trong mt 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 96

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 c 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

97

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 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. descender n nh ca dng tip theo.

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

98

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

99

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

100

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 101

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

102

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

103

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

104

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

105

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

106

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

107

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

108

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

109

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

110

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

111

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

Angled Carets

http://tailieuhay.com

112

Lp trnh ha trn Java 2D v 3D Cn c vo khong trng c 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

113

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 if { Shape[] // ... insertionOffset } = newinsertionOffset; draw caretShapes carets = layout.getCaretShapes(newinsertionOffset); newinsertionOffset != =

layout.getNextRightHit(insertionOffset); (newinsertionOffset null)

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, hit.getinsertindex(); y);

insertindex

http://tailieuhay.com

114

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 hit2);

highlightRegion

layout.getLogicalHighlightShape(hit1, graphics.setColor(HiGHLiGHT_COLOR); graphics.fill(highlightRegion); graphics.drawString(layout, 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. 0, 0);

http://tailieuhay.com

115

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

116

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; import javax.swing.JApplet;
http://tailieuhay.com 117

Lp trnh ha trn Java 2D v 3D 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 /** * */ private static final long serialVersionUiD = 5469031020823166920L; JLabel fontLabel, sizeLabel, styleLabel; FontPanel fontC; JComboBox fonts, sizes, styles; int index = 0; String fontchoice = "La chn Font"; int stChoice = 0; class FontSelection extends JApplet

implements itemListener {

http://tailieuhay.com

118

Lp trnh ha trn Java 2D v 3D 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 1)); sizePanel.setLayout(new 1)); stylePanel.setLayout(new 1)); sizeAndStylePanel.setLayout(new BorderLayout()); topPanel.add(BorderLayout.WEST, fontPanel); sizeAndStylePanel.add(BorderLayout.WEST, sizePanel); GridLayout(2, GridLayout(2, GridLayout(2,

http://tailieuhay.com

119

Lp trnh ha trn Java 2D v 3D 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"); styleLabel.setFont(newFont);

styleLabel.setHorizontalAlignment(JLabel.CENTER);

http://tailieuhay.com

120

Lp trnh ha trn Java 2D v 3D stylePanel.add(styleLabel); GraphicsEnvironment 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[] gEnv =

{ "10", "12", "14", "16", "18" }); sizes.setMaximumRowCount(9); sizes.additemListener(this); sizePanel.add(sizes); styles = new JComboBox(new Object[]

{ "PLAiN", "BOLD", "iTALiC", "BOLD & iTALiC" }); styles.setMaximumRowCount(9); styles.additemListener(this); sizes.setMaximumRowCount(9);

http://tailieuhay.com

121

Lp trnh ha trn Java 2D v 3D stylePanel.add(styles); fontC = new FontPanel(); fontC.setBackground(Color.white); getContentPane().add(BorderLayout.CENTER, fontC); } public void itemStateChanged(itemEvent e) { if (e.getStateChange() return; } Object list = e.getSource(); if (list == fonts) { fontchoice fonts.getSelecteditem(); } else if (list == styles) { index = styles.getSelectedindex(); stChoice = index; } else { siChoice sizes.getSelecteditem(); } fontC.changeFont(fontchoice, siChoice); } stChoice, = (String) = (String) != itemEvent.SELECTED) {

http://tailieuhay.com

122

Lp trnh ha trn Java 2D v 3D public static void main(String s[]) { JFrame f = new JFrame("Chn kiu Font"); f.addWindowListener(new WindowAdapter() { public windowClosing(WindowEvent e) { System.exit(0); } }); JApplet FontSelection(); f.getContentPane().add(fontSelection, BorderLayout.CENTER); fontSelection.init(); f.setSize(new Dimension(550, 250)); f.setVisible(true); } } class FontPanel extends JPanel { /** * */ private static final long serialVersionUiD = 7850814263388447528L; Font thisFont; public FontPanel() { fontSelection = new void

http://tailieuhay.com

123

Lp trnh ha trn Java 2D v 3D thisFont = new Font("Arial", Font.PLAiN, 10); } public 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); String change = "Chn Font ,c ch v kiu ch."; FontMetrics g2.getFontMetrics(); int width = metrics.stringWidth(change); int height = metrics.getHeight(); g2.drawString(change, w / 2 - width / 2, h / 2 - height / 2); } } metrics = void changeFont(String f, int st,

http://tailieuhay.com

124

Lp trnh ha trn Java 2D v 3D

Kt qu ca chng trnh:

http://tailieuhay.com

125

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

126

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 RasterOp AffineTransformOp, ColorConvertOp, ConvolveOp, LookupOp v RescaleOp. nh ngha cc thao tc vo ra n thc hin trn cc i tng Raster c ci t bi AffineTransformOp, RescaleOp. RenderedImage nh ngha giao thc cho cc i tng cha hoc c th sn sinh d liu nh trong kiu WritableRenderedImag e 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. BandCombineOp, ColorConvertOp, ConvolveOp, LookupOp v

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

127

Lp trnh ha trn Java 2D v 3D Mt Bufferedimage c mt ColorModel v mt ByteLookupTable DataBuffer DataBufferByte Raster d liu nh. M rng LookupTable Mt LookupTable cha cc bye d liu. Bao bc mt hay nhiu cc mng d liu cha d 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 n tc ng n gi tr liu v cc im bin ca LookupTable

ca im trong b lc ConvolveOP M rng Object Mt bng nh x cc gi tr t d liu im n 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 v mt SampleModel. M rng LookupTable Mt bng tham chiu cha cc d liu s nguyn short M rng Raster Mt Raster c th chnh sa.
128

Raster

ShortLookupTable

WritableRaster

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D

5.1.3 image Operation Classes Clases Description AffineTransformOp 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 n /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 129

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 (Final)

ComponentSampleModel

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

130

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 SampleModel n ca mt DataBuffer. 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. SinglePixelPackedSampleMode M rng SampleModel l 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 , 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)

ComponentColorModel

http://tailieuhay.com

131

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 nh mt ColorModel mc nh c tr v bi ColorModel.getRGBdefault DirectColorModel. PackedColorModel 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 m mt im. rng DirectColorModel indexColorModel

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 x l nh. M rng RuntimException.
132

RasterFormatException
http://tailieuhay.com

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 133

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 134

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

135

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 g) int int if {

Graphics2D g2 = = == =

createDemoGraphics2D(Graphics null;

Graphics2D width height (offimg ||

getSize().width; getSize().height; null != || offimg.getWidth() {


136

!=

width

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

height)

Lp trnh ha trn Java 2D v 3D offimg height); } if g2 } // .. clear height); canvas .. g2.clearRect(0, 0, (offimg = != null) { = (Bufferedimage) createimage(width,

offimg.createGraphics();

g2.setBackground(getBackground());

width, 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

137

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 138

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

139

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 g2 dim update(Graphics = = g){ Graphics2D Dimension int int area bi big = = w h = = = (Graphics2D)g; getSize();

if(firstTime){ dim.width; dim.height; new Rectangle(dim); h);

(Bufferedimage)createimage(w, bi.createGraphics();

http://tailieuhay.com

140

Lp trnh ha trn Java 2D v 3D rect.setLocation(w/2-50, big.setStroke(new firstTime } // Clears the rectangle 0, that was previously = false; h/2-25);

BasicStroke(8.0f));

drawn. big.setColor(Color.white); big.clearRect(0, // Draws and area.width, the area.height); positioned buffer.

fills to

newly the

rectangle big.draw(rect); big.fill(rect); // Draws the

big.setPaint(strokePolka); big.setPaint(fillPolka);

buffered 0, 0,

image this);

to

the

screen.

g2.drawimage(bi, }

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

141

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 if <=

void

paint(Graphics <= 0

g) ||

{ getSize().height

(getSize().width 0)

return; Graphics2D if } } Chng trnh v d:


http://tailieuhay.com 142

g2 !=

(Graphics2D) null && 0,

g; {

(offimg

isShowing()) 0, this);

g2.drawimage(offimg,

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 f = new Frame("BufferedShapeMover"); f.addWindowListener(new WindowAdapter() { public windowClosing(WindowEvent e) { System.exit(0); } }); Applet applet = new BufferedShapeMover(); f.add("Center", applet); void

http://tailieuhay.com

143

Lp trnh ha trn Java 2D v 3D applet.init(); f.pack(); f.setSize(new Dimension(550, 250)); f.show(); } } class BSMCanvas extends Canvas implements

MouseListener, MouseMotionListener { Rectangle 50); Bufferedimage bi; Graphics2D big; int last_x, last_y; boolean firstTime = true; TexturePaint fillPolka, strokePolka; Rectangle area; boolean pressOut = false; public BSMCanvas() { rect = new Rectangle(0, 0, 100,

http://tailieuhay.com

144

Lp trnh ha trn Java 2D v 3D 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(); } public void mousePressed(MouseEvent e) { last_x = rect.x - e.getX();

http://tailieuhay.com

145

Lp trnh ha trn Java 2D v 3D last_y = rect.y - e.getY(); if (rect.contains(e.getX(), e.getY())) { updateLocation(e); } else { BufferedShapeMover.label .setText("u tr ln hnh ch nht v ko."); pressOut = true; } } public void mouseDragged(MouseEvent e) { if (!pressOut) { updateLocation(e); } else { BufferedShapeMover.label .setText("u tr ln hnh ch nht v ko."); } } public void mouseReleased(MouseEvent e) { if (rect.contains(e.getX(), e.getY())) { updateLocation(e); } else { BufferedShapeMover.label tin t con tin t con

http://tailieuhay.com

146

Lp trnh ha trn Java 2D v 3D .setText("u 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 last_y + e.getY()); if (checkRect()) { BufferedShapeMover.label.setText("Hnh nht v tr : " + rect.getY()); } else { rect.getX() + "" + ch + e.getX(), tin t con

http://tailieuhay.com

147

Lp trnh ha trn Java 2D v 3D BufferedShapeMover.label .setText("ng 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)); firstTime = false; } c gng a

http://tailieuhay.com

148

Lp trnh ha trn Java 2D v 3D big.setColor(Color.white); big.clearRect(0, 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 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) { new_x = -1; } if ((rect.y + 50) > area.height) { (area.contains(rect.x, rect.y, 100, 0, area.width,

http://tailieuhay.com

149

Lp trnh ha trn Java 2D v 3D 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. 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.

http://tailieuhay.com

150

Lp trnh ha trn Java 2D v 3D 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 t 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. 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
http://tailieuhay.com 151

Lp trnh ha trn Java 2D v 3D 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. 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.

http://tailieuhay.com

152

Lp trnh ha trn Java 2D v 3D 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 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.
http://tailieuhay.com 153

Lp trnh ha trn Java 2D v 3D 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. 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.

http://tailieuhay.com

154

Lp trnh ha trn Java 2D v 3D 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

155

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 Kernel kernel = new =

bimg Kernel(3, new

= 3,

new elements);

Bufferedimage(bw,bh,Bufferedimage.TYPE_iNT_RGB); ConvolveOp cop 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.

Hnh 5-5

X l Lookup-Table

on code sau demo thao tc Lookup-table:


http://tailieuhay.com 156

Lp trnh ha trn Java 2D v 3D

byte for }

reverse[] (int j=0;

new

byte[256]; j++){

j<200;

reverse[j]=(byte)(256-j); ByteLookupTable 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. blut=new ByteLookupTable(0,

Hnh 5-6

Rescaling

on Code di y minh ho rescaling:


http://tailieuhay.com 157

Lp trnh ha trn Java 2D v 3D RescaleOp 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 rop = new RescaleOp(1.5f, 1.0f,

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 float[] 2D // for } array fill (i = the 0; = array i < with 9; nine { equal elements weight = 1.0f/9.0f; = new float[9]; // create elements

i++)

elements[i]

weight;

http://tailieuhay.com

158

Lp trnh ha trn Java 2D v 3D // to use the a array Kernel myKernel = new Kernel(3, = 3, new of elements as argument

create

private public

Kernel

elements); ConvolveOp simpleBlur ConvolveOp(myKernel); // of blur sourceimage Bufferedimage destimage) // the image and destimage are instances

simpleBlur.filter(sourceimage,

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. 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.

http://tailieuhay.com

159

Lp trnh ha trn Java 2D v 3D 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 o (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.

Hnh 5-8

Sharpening with Convolution

on code di y minh ho sharpening vi float[] elements = { 0.0f, -1.0f, 0.0f,


160

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D -1.0f, 0.0f, ... Kernel kernel = new = Kernel(3,3,elements); new ConvolveOp(kernel, 5.f, -1.0f, -1.0f, 0.0f };

ConvolveOp null);

cop

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

http://tailieuhay.com

161

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

162

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 ICC_ProfileRGB Format Specification. Extends: ICC_Profile 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

163

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

164

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

165

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 166

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 l 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 c gi l 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

167

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

168

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 169

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

170

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

171

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 interface to interact with a PrinterJob. Describes the size and orientation of a page to be
172

PageFormat

http://tailieuhay.com

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 PrinterJob PageFormat. Describes the physical characteristics of a piece of 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

173

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

174

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 ,
175

http://tailieuhay.com

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 176

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

177

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

178

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

179

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

180

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 public {
181

java.awt.*; class

import

java.awt.print.*; implements Printable

SimplePrint

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D private static Font fnt = new

Font("Helvetica",Font.PLAiN,24); public { // Get a PrinterJob job the up = PrinterJob.getPrinterJob(); Printable the is an instance box of if PrinterJob // // { // try catch { } System.exit(0); } public int { // pageindex 1 to 0 5. to 4 corresponds to page numbers throws int print(Graphics g, PageFormat pf, /* Print { the job } */ } if the user didn't cancel printing job.print(); (Exception handle e) Specify Put static void main(String[] args)

SimplePrint job.setPrintable(new (job.printDialog())

SimplePrint());

dialog

exception

pageindex) PrinterException

http://tailieuhay.com

182

Lp trnh ha trn Java 2D v 3D if (pageindex >= 5) return

Printable.NO_SUCH_PAGE; g.setFont(fnt); g.setColor(Color.green); g.drawString("Page 100); return } } Printable.PAGE_EXiSTS; " + (pageindex+1), 100,

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 public Printable { private static Font fnt = new Font("Helvetica",Font.PLAiN,24); private 100f, Paint pnt = new GradientPaint(100f, java.awt.*; class import java.awt.print.*; implements

SimplePrint2D

Color.red,
183

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D 136f, public { // // Get a PrinterJob job the = PrinterJob.getPrinterJob(); Printable is an instance of PrinterJob Specify 100f, static Color.green, void true); args)

main(String[]

SimplePrint2D job.setPrintable(new // if { // try catch */ } System.exit(0); } public int { // if pageindex 1 to 0 5. >= 5) return to 4 corresponds to page numbers throws int print(Graphics g, PageFormat pf, } Print { the job } { /* handle exception if the user didn't cancel printing job.print(); (Exception e) Put up the SimplePrint2D()); box dialog

(job.printDialog())

pageindex) PrinterException

(pageindex

Printable.NO_SUCH_PAGE;

http://tailieuhay.com

184

Lp trnh ha trn Java 2D v 3D Graphics2D // // Use Use the the g2 = font (Graphics2D) defined color + g;

above defined above 100f,

g2.setFont(fnt); gradient " g2.setPaint(pnt); g2.drawString("Page 100f); return } } Printable.PAGE_EXiSTS; (pageindex+1),

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 import import java.awt.*; java.awt.print.*; java.io.*;

http://tailieuhay.com

185

Lp trnh ha trn Java 2D v 3D

public { public { // // Get

class static a

PrintListing void main(String[] args)

PrinterJob job user = PrinterJob.getPrinterJob(); for page pf the Printable is also an instance format (e.g., = of

PrinterJob Ask

portrait/landscape) PageFormat // // Specify job.pageDialog(job.defaultPage()); PrintListingPainter; provide given

PageFormat job.setPrintable(new PrintListingPainter(args[0]), // // if { // try catch */ } System.exit(0); } } Print { the job } { /* handle exception if the user didn't cancel printing job.print(); (Exception e) Print Put up 1 copy the dialog box job.setCopies(1); (job.printDialog()) pf);

http://tailieuhay.com

186

Lp trnh ha trn Java 2D v 3D } class { private private private private private private public { fileName try{ // raf } catch } } public int { try { throws int print(Graphics g, PageFormat pf, (Exception e) { rememberedEOF = true; Open = file new RandomAccessFile(file, "r"); = file; RandomAccessFile String Font int long 10); rememberedPageindex rememberedEOF = = -1; = -1; false; file) rememberedFilePointer fileName; fnt = new Font("Helvetica", raf; PrintListingPainter implements Printable

Font.PLAiN,

boolean

PrintListingPainter(String

pageindex) PrinterException

http://tailieuhay.com

187

Lp trnh ha trn Java 2D v 3D // if { // // done if // } else raf.seek(rememberedFilePointer); g.setColor(Color.black); g.setFont(fnt); int int // " // y + x, as y); lines as will fit in Generate += 36; (y + 12 < pf.getimageableY() many x y = = (int) (int) line " + fileName + ", page: pf.getimageableX() pf.getimageableY() + + 10; 12; Save (rememberedEOF) current position = in input return file Printable.NO_SUCH_PAGE; rememberedFilePointer raf.getFilePointer(); First if time we've = visited EOF on this page page, rememberedPageindex encountered pageindex; previous For catching != iOException rememberedPageindex)

(pageindex

Title

g.drawString("File: (pageindex+1), imageable while { String if line == = area

+pf.getimageableHeight()) raf.readLine(); null)

(line

http://tailieuhay.com

188

Lp trnh ha trn Java 2D v 3D { rememberedEOF break; } g.drawString(line, y } return } catch } } Giao din ca chng trnh: (Exception e) { return Printable.NO_SUCH_PAGE;} Printable.PAGE_EXiSTS; += 12; x, y); = true;

http://tailieuhay.com

189

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 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.

http://tailieuhay.com

190

Lp trnh ha trn Java 2D v 3D 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. import import public Printable { private public { // // Book Get Set bk a up = PrinterJob job a new = book Book(); PrinterJob.getPrinterJob(); PrinterJob static static void Font fnt = args) new Font("Helvetica",Font.PLAiN,24); main(String[] java.awt.*; java.awt.print.*; class SimplePrintBook implements

http://tailieuhay.com

191

Lp trnh ha trn Java 2D v 3D bk.append(new job.defaultPage(), // // if { // try catch */ } System.exit(0); } public int { g.setFont(fnt); g.setColor(Color.green); g.drawString("Page 100); return } } Giao din ca chng trnh:
192

SimplePrintBook(), 5); to the box PrinterJob book the

Pass Put

the up

job.setPageable(bk); dialog (job.printDialog()) Print { } the job } { /* handle exception if the user didn't

cancel

printing job.print(); (Exception e)

int

print(Graphics

g,

PageFormat

pf,

pageindex) PrinterException

throws

"

(pageindex+1),

100,

Printable.PAGE_EXiSTS;

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D

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. import import public { public { // // Get a PrinterJob job a pfl a new = = book Book();
193

java.awt.*; java.awt.print.*; class static PrintBook void main(String[] args)

PrinterJob Create PageFormat // Book Set bk up =

PrinterJob.getPrinterJob(); page format job.defaultPage();

landscape

pfl.setOrientation(PageFormat.LANDSCAPE);

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D bk.append(new bk.append(new job.defaultPage(), // // if { // try catch */ } System.exit(0); } } class { Font fnt = 72); print(Graphics g, PageFormat pf, new Font("Helvetica-Bold", Font.PLAiN, public int { g.setFont(fnt); g.setColor(Color.black); throws int PaintCover implements Printable } Print { the job } { /* handle exception if the user didn't cancel printing job.print(); (Exception e) Pass Put the up book the job.setPageable(bk); dialog box (job.printDialog()) 2); to the PrinterJob PaintCover(), pfl); PaintContent(),

pageindex) PrinterException

http://tailieuhay.com

194

Lp trnh ha trn Java 2D v 3D

int

yc

(int)

(pf.getimageableY() inc.", 72,

pf.getimageableHeight()/2); g.drawString("Widgets, return } } class { public int { Graphics2D int int int // for for { if else useRed (useRed = 1 == 0) g.setColor(Color.red); g.setColor(Color.green); useRed; useRed xo yo = = g2 = = 0; pf.getimageableX(); pf.getimageableY(); with & x y green = x = y += += 0; 36) 0; 36) y+28 < x+28 < circles or squares, (Graphics2D) g; throws int print(Graphics g, PageFormat pf, pageindex) PrinterException PaintContent implements Printable yc+36); Printable.PAGE_EXiSTS;

(int) (int) page red

Fill

alternating (int (int

pf.getimageableWidth(); pf.getimageableHeight();

http://tailieuhay.com

195

Lp trnh ha trn Java 2D v 3D if else } return } Giao din cua chng trnh: Printable.PAGE_EXiSTS; (pageindex 28, % 2 == 0) g.drawRect(xo+x+4, 28, 28);

yo+y+4,

28); yo+y+4,

g.drawOval(xo+x+4,

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.*;

http://tailieuhay.com

196

Lp trnh ha trn Java 2D v 3D import java.awt.print.*; public class ShapesPrint extends JPanel

implements Printable, ActionListener { final static Color bg = Color.white; final static Color fg = Color.black; 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");

http://tailieuhay.com

197

Lp trnh ha trn Java 2D v 3D public ShapesPrint() { setBackground(bg); button.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getSource() instanceof JButton) { PrinterJob 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; printJob =

http://tailieuhay.com

198

Lp trnh ha trn Java 2D v 3D int gridHeight = 300 / 2; int rowspacing = 5; int columnspacing = 7; int columnspacing; int rectHeight = gridHeight - rowspacing; 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 x += gridWidth; g2.setStroke(stroke); g2.draw(new Rectangle2D.Double(x, y, rectWidth, rectHeight)); x += gridWidth; g2.setStroke(dashed); g2 .draw(new RoundRectangle2D.Double(x, rectHeight, 10, 10)); x += gridWidth; g2.setStroke(wideStroke); g2.draw(new Arc2D.Double(x, y, rectWidth, rectHeight, 90, 135, y, rectWidth, Line2D.Double(x, y + rectHeight - 1, x + rectWidth, y)); rectWidth = gridWidth -

http://tailieuhay.com

199

Lp trnh ha trn Java 2D v 3D Arc2D.OPEN)); x += gridWidth; g2.setStroke(stroke); g2.draw(new rectWidth, rectHeight)); x += gridWidth; 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 }; Ellipse2D.Double(x, y,

http://tailieuhay.com

200

Lp trnh ha trn Java 2D v 3D GeneralPath polyline = new

GeneralPath(GeneralPath.WiND_EVEN_ODD, x2Points.length); polyline.moveTo(x2Points[0], y2Points[0]); 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, rectHeight, 10, 10)); g2.setPaint(fg); x += gridWidth; y, rectWidth,

http://tailieuhay.com

201

Lp trnh ha trn Java 2D v 3D g2.setPaint(red); g2.fill(new Arc2D.Double(x, y, rectWidth, rectHeight, 90, 135, Arc2D.OPEN)); g2.setPaint(fg); x += gridWidth; redtowhite = new GradientPaint(x, y, red, x + rectWidth, y, white); g2.setPaint(redtowhite); g2.fill(new 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]); } ; Ellipse2D.Double(x, y,

http://tailieuhay.com

202

Lp trnh ha trn Java 2D v 3D filledPolygon.closePath(); g2.setPaint(red); g2.fill(filledPolygon); g2.setPaint(fg); g2.draw(filledPolygon); } 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 windowClosing(WindowEvent e) { System.exit(0); } public void windowClosed(WindowEvent e) { System.exit(0); } }; JFrame f = new JFrame(); void

http://tailieuhay.com

203

Lp trnh ha trn Java 2D v 3D f.addWindowListener(l); JPanel panel = new JPanel(); panel.add(button); 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

204

Lp trnh ha trn Java 2D v 3D

http://tailieuhay.com

205

Lp trnh ha trn Java 2D v 3D

Phn 2 Lp trnh ha vi Java 3D

http://tailieuhay.com

206

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

207

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 208

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 209

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 210

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

211

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

212

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

213

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 214

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

215

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 216

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

217

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 218

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 c 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 219

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

220

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

221

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

222

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(); // Utility class SimpleUniverse is a Convenience

http://tailieuhay.com

223

Lp trnh ha trn Java 2D v 3D SimpleUniverse SimpleUniverse(canvas3D); // This will move the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU = new

simpleU.getViewingPlatform().setNominalViewingTra nsform(); 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

224

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 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); t java.lang.Runnable, java.applet.AppletStub, v java.applet.AppletContext.

http://tailieuhay.com

225

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

226

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. simpleU.getViewingPlatform().setNominalViewingTransform();

http://tailieuhay.com

227

Lp trnh ha trn Java 2D v 3D 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

228

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

229

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 y

http://tailieuhay.com

230

Lp trnh ha trn Java 2D v 3D 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. TransformGroup Constructors

http://tailieuhay.com

231

Lp trnh ha trn Java 2D v 3D 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) ColorCube

http://tailieuhay.com

232

Lp trnh ha trn Java 2D v 3D 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. public BranchGroup createSceneGraph() {

http://tailieuhay.com

233

Lp trnh ha trn Java 2D v 3D // 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 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. objRotate = new

http://tailieuhay.com

234

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 235

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

236

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

237

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 i tng TransformGroup cng nh vy. i 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 238

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

239

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 240

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 241

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 c 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 242

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

243

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 3 l to i tng thm vo. i 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 TransformGroup(); objSpin.setCapability(TransformGroup.ALL OW_TRANSFORM_WRITE);
http://tailieuhay.com 244

objSpin

new

Lp trnh ha trn Java 2D v 3D 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 BoundingSphere(); rotator.setSchedulingBounds(bounds); objSpin.addChild(rotator); bounds = new

http://tailieuhay.com

245

Lp trnh ha trn Java 2D v 3D 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

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

http://tailieuhay.com

246

Lp trnh ha trn Java 2D v 3D 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 TransformGroup(rotate); // // // runtime. Create the transform Enable code the can group node and objRotate = new

initialize it to the identity. our TRANSFORM_WRITE modify it at capability so that behavior Add it to the objSpin = new

// root of the subgraph. TransformGroup TransformGroup();

http://tailieuhay.com

247

Lp trnh ha trn Java 2D v 3D objSpin.setCapability(TransformGroup.ALLOW_TRANSF ORM_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, Math.PI*2.0f); // a bounding sphere specifies a region a behavior is active // create a sphere centered at the origin with radius of 1 (float)

http://tailieuhay.com

248

Lp trnh ha trn Java 2D v 3D BoundingSphere bounds = new BoundingSphere(); rotator.setSchedulingBounds(bounds); objSpin.addChild(rotator); return objRoot; } // end of CreateSceneGraph method of HelloJava3Dd

Kt qu

http://tailieuhay.com

249

Lp trnh ha trn Java 2D v 3D

http://tailieuhay.com

250

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

251

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

252

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
253

http://tailieuhay.com

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

254

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

255

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

256

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 257

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 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. m rng t Primitive, mt lp khc trong gi com.sun.j3d.utils.Geometry

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

258

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

259

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

260

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 261

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 262

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

263

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. // ////////////////////////////////////// //// // // appearance // yoyoGeometry // the appearance is created in method yoyoAppearance // public ConeYoyo() { yoyoBG = new BranchGroup(); Appearance app = new Appearance(); // rotate object has composited = = new new the geometry is created in method create Shape3D with geometry and

transformation matrix Transform3D Transform3D(); Transform3D Transform3D();


264

rotate translate

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D

translate.set(new 0.0f, 0.0f)); TransformGroup TransformGroup(translate);

Vector3f(0.1f, yoyoTGT1 = new

yoyoBG.addChild(yoyoTGT1); rotate.rotZ(Math.PI / 2.0d); TransformGroup TransformGroup(rotate); Cone cone1 = new Cone(0.6f, 0.2f); cone1.setAppearance(app); yoyoTGR1.addChild(cone1); yoyoTGT1.addChild(yoyoTGR1); translate.set(new 0.0f, 0.0f)); TransformGroup TransformGroup(translate); yoyoBG.addChild(yoyoTGT2); rotate.rotZ(-Math.PI / 2.0d); TransformGroup TransformGroup(rotate); Cone cone2 = new Cone(0.6f, 0.2f); cone2.setAppearance(app); yoyoTGR2.addChild(cone2); yoyoTGT2.addChild(yoyoTGR2); yoyoTGR2 = new yoyoTGT2 = new Vector3f(-0.1f, yoyoTGR1 = new

http://tailieuhay.com

265

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 ny trnh
http://tailieuhay.com 266

Lp trnh ha trn Java 2D v 3D 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

267

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

268

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)

http://tailieuhay.com

269

Lp trnh ha trn Java 2D v 3D Khi to v thit lp i tng Tuple vi ta (x,y). 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)

http://tailieuhay.com

270

Lp trnh ha trn Java 2D v 3D Lp gi tr ca tuple ny ti vertor khc ca t1 v t2 (this = t1 - t2). 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.
http://tailieuhay.com 271

Lp trnh ha trn Java 2D v 3D float distanceSquared(Point3f p1) 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 Color3f(1.0f,0.0f,0.0f); public static final Color3f green Color3f(0.0f,1.0f,0.0f); public static final Color3f blue Color3f(0.0f,0.0f,1.0f);
272

= new = new = new

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D public static final Color3f yellow Color3f(1.0f,1.0f,0.0f); public static final Color3f cyan 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 Color3f(1.0f,1.0f,1.0f); public static final Color3f black Color3f(0.0f,0.0f,0.0f); } = new = new = new = new

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

273

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

274

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

275

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

276

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 OR

http://tailieuhay.com

277

Lp trnh ha trn Java 2D v 3D 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: GeometryArray Methods (partial list)

http://tailieuhay.com

278

Lp trnh ha trn Java 2D v 3D 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

279

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 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.
http://tailieuhay.com 280

Lp trnh ha trn Java 2D v 3D

// ////////////////////////////////////// //// // // create axis subgraph // public Axis() { axisBG = new BranchGroup(); // create line for X axis LineArray axisXLines = new LineArray(2, LineArray.COORDINATES); axisBG.addChild(new Shape3D(axisXLines)); axisXLines.setCoordinate(0, Point3f(-1.0f, 0.0f, 0.0f)); axisXLines.setCoordinate(1, Point3f(1.0f, 0.0f, 0.0f)); Color3f 0.0f, 0.0f); Color3f 1.0f, 0.0f); Color3f 0.0f, 1.0f); // create line for Y axis blue = new Color3f(0.0f, green = new Color3f(0.0f, red = new Color3f(1.0f, new new

http://tailieuhay.com

281

Lp trnh ha trn Java 2D v 3D LineArray axisYLines = new

LineArray(2, LineArray.COORDINATES | LineArray.COLOR_3); axisBG.addChild(new Shape3D(axisYLines)); axisYLines.setCoordinate(0, Point3f(0.0f, -1.0f, 0.0f)); axisYLines.setCoordinate(1, 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 new new

LineArray(10, LineArray.COORDINATES | LineArray.COLOR_3); axisBG.addChild(new Shape3D(axisZLines)); axisZLines.setCoordinate(0, z1); axisZLines.setCoordinate(1, z2); axisZLines.setCoordinate(2, z2);

http://tailieuhay.com

282

Lp trnh ha trn Java 2D v 3D axisZLines.setCoordinate(3, Point3f(0.1f, 0.1f, 0.9f)); axisZLines.setCoordinate(4, z2); axisZLines.setCoordinate(5, Point3f(-0.1f, 0.1f, 0.9f)); axisZLines.setCoordinate(6, z2); axisZLines.setCoordinate(7, Point3f(0.1f, -0.1f, 0.9f)); axisZLines.setCoordinate(8, z2); axisZLines.setCoordinate(9, 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 nhau ti mi nh th cc mu s mn dn gia cc nh s dng php nh bng Gouraud.
http://tailieuhay.com 283

new

new

new

new

Lp trnh ha trn Java 2D v 3D

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

284

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

285

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 c bn ( ghp l to ng cha v b ca mt ) tha k. GeometryStripArray lp 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 i tng c th duy tr nhiu mnh. GeometryStripArray c 2 phng thc thng s dng n l getNumStrips() v getStripVertexCounts(). GeometryStripArray Subclass Constructors

http://tailieuhay.com

286

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 stripVertexCounts[]) TriangleFanArray(int 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. vtxCount, int vertexFormat, int vtxCount, int vertexFormat, int

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

287

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

288

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 289

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

290

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 291

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

292

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

293

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 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) vertexCount, int vertexFormat, int

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. IndexedGeometryStripArray(int stripVertexCounts[]) IndexedLineStripArray(int vc, int vf, int ic, int stripVertexCounts[]) vc, int vf, int ic, int

http://tailieuhay.com

294

Lp trnh ha trn Java 2D v 3D 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. 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.

http://tailieuhay.com

295

Lp trnh ha trn Java 2D v 3D 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

296

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 n s dng phng thc Appearance.setColoringAttributes().

Trn th khung cnh

http://tailieuhay.com

297

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.

Vic chia s ny gip cho vic dng hnh nhanh hn, hiu qu cng cao.
298

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D 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

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.

http://tailieuhay.com

299

Lp trnh ha trn Java 2D v 3D 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 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)

http://tailieuhay.com

300

Lp trnh ha trn Java 2D v 3D 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.

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.

http://tailieuhay.com

301

Lp trnh ha trn Java 2D v 3D 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 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()

http://tailieuhay.com

302

Lp trnh ha trn Java 2D v 3D 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 polygonOffset) To i tng thnh phn vi gi tr cho trc ca gic li PolygonAttributes(int 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, int cullFace, float float boolean backFaceNormalFlip, polygonMode, int cullFace, float polygonMode, int cullFace, 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 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.

http://tailieuhay.com

303

Lp trnh ha trn Java 2D v 3D 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. (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)

http://tailieuhay.com

304

Lp trnh ha trn Java 2D v 3D shadeModel or NICEST. l mt trong cc hng: SHADE_GOURAUD,

SHADE_FLAT, FASTEST,

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> 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)

http://tailieuhay.com

305

Lp trnh ha trn Java 2D v 3D 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 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.

http://tailieuhay.com

306

Lp trnh ha trn Java 2D v 3D RenderingAttributes(boolean depthBufferWriteEnable, 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, alphaTestFunction, boolean visible, boolean ignoreVertexColors, boolean GeometryOpEnable, int GeometryOp) <new in 1.2> To mt i tng RenderingAttributes vi gi tr cho trc. depthBufferEnable, float alphaTestValue, boolean int depthBufferEnable, float alphaTestValue, boolean int

RenderingAttributes Methods void setDepthBufferEnable(boolean state) 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)

http://tailieuhay.com

307

Lp trnh ha trn Java 2D v 3D 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> 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
http://tailieuhay.com

Parameter

Default Value
308

Lp trnh ha trn Java 2D v 3D

ColoringAttributes

color shade model

white (1, 1, 1) SHADE_GOURAUD 1.0 PATTERN_SOLID false 1.0 false CULL_BACK false POLYGON_FILL 0.0 0.0 true true ALWAYS 0.0 true false false ROP_COPY REPLACE black (0, 0, 0, 0) identity NICEST null
309

LineAttributes

line width line pattern line antialiasing enable

PointAttributes

point size point antialiasing enable

PolygonAttributes

cull face backFaceNormalFlip polygon mode polygonOffset polygonOffsetFactor

RenderingAttributes

depthBufferEnable depthBufferWriteEnable alphaTestFunction alphaTestValue visible ignoreVertexColors GeometryOpEnable GeometryOp

TextureAttributes

textureMode textureBlendColor transform perspectiveCorrectionMod e

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D textureColorTable TransparencyAttributes transparencyMode transparencyValue srcBlendFunction dstBlendFunction NONE 0.0 SRC_BLEND_ALPHA

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

310

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

311

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 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; | blue = new Color3f(0.0f,

http://tailieuhay.com

312

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, 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 new Point3d(0.7 * Math.sin(a) -0.3 * Math.sin(a), 0.7 * Math.cos(a))); twistStrip.setColor(v, blue); twistStrip.setColor(v blue); } return twistStrip; } // create Appearance for Twist Strip // // // this twist method strip. creates The the default line of Appearance for the commented code containting + 1, Math.cos(a) 0.2 * 0.2 * Math.cos(a), + 1, new

http://tailieuhay.com

313

Lp trnh ha trn Java 2D v 3D // the setCullFace will fix the problem of half of the // Twisted Strip disappearing. Appearance createAppearance() { Appearance Appearance(); PolygonAttributes PolygonAttributes(); // polyAttrib.setCullFace(PolygonAttributes.CULL_NON E); twistAppear.setPolygonAttributes(polyAttrib); return twistAppear; } } // end of class Twist // ////////////////////////////////////////// ///// // // create scene graph branch group // public BranchGroup createSceneGraph() { polyAttrib = new twistAppear = new

http://tailieuhay.com

314

Lp trnh ha trn Java 2D v 3D BranchGroup BranchGroup(); // Create the transform group node and initialize it to the // identity. Add it to the root of the subgraph. TransformGroup TransformGroup(); objSpin = new contentRoot = new

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 315

Lp trnh ha trn Java 2D v 3D PolygonAttributes PolygonAttributes(); polyAttrib = new

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 16000); RotationInterpolator objSpin); // a bounding sphere specifies a region a behavior is active // create a sphere centered at the origin with radius of 1 BoundingSphere BoundingSphere(); bounds = new rotator = new rotationAlpha = new Alpha(-1,

RotationInterpolator(rotationAlpha,

http://tailieuhay.com

316

Lp trnh ha trn Java 2D v 3D 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(); // Utility class SimpleUniverse is a Convenience

http://tailieuhay.com

317

Lp trnh ha trn Java 2D v 3D SimpleUniverse SimpleUniverse(canvas3D); // This will move the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU = new

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 with the Java 3D API\""); System.out.println(" (section 2.6)"); System.out.println("This demonstrates back face culling."); System.out.print("In visual objects rotate, "); this program two program \"Getting Started

http://tailieuhay.com

318

Lp trnh ha trn Java 2D v 3D System.out.println("one wireframe and one solid surface."); System.out.print("The visible only when components"); System.out.println(" of the surface are culled."); Frame frame = new MainFrame(new wire frame is

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

319

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

320

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

321

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) To v nh gi tr cho mt BoundingSphere vi bn knh v tm cho trc

http://tailieuhay.com

322

Lp trnh ha trn Java 2D v 3D 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) Lp mt hnh hp bao vi mt mng cc i tng bao.

http://tailieuhay.com

323

Lp trnh ha trn Java 2D v 3D 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) To mt BoundingPolytope ngoi tip mt mt bao cho trc. BoundingPolytope(Bounds[] boundsObjects)

http://tailieuhay.com

324

Lp trnh ha trn Java 2D v 3D 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

325

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

326

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 mt nt ta gi nt c phm vi quan st ton cu. iu c ngha l
http://tailieuhay.com 327

Lp trnh ha trn Java 2D v 3D 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

328

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 329

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

330

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

331

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. 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.

http://tailieuhay.com

332

Lp trnh ha trn Java 2D v 3D 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() { BranchGroup BranchGroup(); contentRoot = new

http://tailieuhay.com

333

Lp trnh ha trn Java 2D v 3D // Create the transform group node and initialize it to the // identity. Add it to the root of the subgraph. TransformGroup TransformGroup(); objSpin = new

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. PolygonAttributes PolygonAttributes(); polyAttrib = new

http://tailieuhay.com

334

Lp trnh ha trn Java 2D v 3D

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 16000); RotationInterpolator objSpin); // a bounding sphere specifies a region a behavior is active // create a sphere centered at the origin with radius of 1 BoundingSphere BoundingSphere(); rotator.setSchedulingBounds(bounds); objSpin.addChild(rotator); bounds = new rotator = new rotationAlpha = new Alpha(-1,

RotationInterpolator(rotationAlpha,

http://tailieuhay.com

335

Lp trnh ha trn Java 2D v 3D // 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 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
http://tailieuhay.com 336

Lp trnh ha trn Java 2D v 3D 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. 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.

http://tailieuhay.com

337

Lp trnh ha trn Java 2D v 3D 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> 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.

http://tailieuhay.com

338

Lp trnh ha trn Java 2D v 3D

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. 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.

http://tailieuhay.com

339

Lp trnh ha trn Java 2D v 3D 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 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 AlternateAppearance theo vo mnh. th ng qun lp thm c khung cnh,

appearanceOverrideEnable trn i tng Shape3D.


http://tailieuhay.com 340

Lp trnh ha trn Java 2D v 3D 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> 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.

http://tailieuhay.com

341

Lp trnh ha trn Java 2D v 3D 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. 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

http://tailieuhay.com

342

Lp trnh ha trn Java 2D v 3D 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

343

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) Lp trng ngang m hnh quan st dng radians.
http://tailieuhay.com 344

Lp trnh ha trn Java 2D v 3D

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

345

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

346

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

347

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

348

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

349

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

350

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,
351

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
352

http://tailieuhay.com

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

353

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 din) QUAD_ARRAY TRIANGLE_ARRAY TRIANGLE_FAN_ARRAY tng vi mi tam gic ri : T din : Tam gic : Mng StripCounts cho bit s nh : a gic, cc a gic 2 chiu,3 chiu(a

http://tailieuhay.com

354

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

355

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

356

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 l 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

357

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

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
http://tailieuhay.com 358

Lp trnh ha trn Java 2D v 3D 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 Gi: com.sun.j3d.loaders Thc thi: Loader

http://tailieuhay.com

359

Lp trnh ha trn Java 2D v 3D 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 3DS COB DEM DXF IOB LWS NFF OBJ PDB PLAY SLD VRT VTK M t 3D-Studio Caligari trueSpace Digital Elevation Map AutoCAD Drawing Interchange File Imagine Lightwave Scene Format WorldToolKit NFF Format Wavefront Protein Data Bank PLAY Solid World Superscape VRT Visual Toolkit

http://tailieuhay.com

360

Lp trnh ha trn Java 2D v 3D WRL Virtual language Reality Modeling

3.3.3

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

361

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) Phng thc ny thiit lp ng dn c s cho cc file c dng trong phng thc load(String)

http://tailieuhay.com

362

Lp trnh ha trn Java 2D v 3D 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. LoaderBase() Khi to i tng Loader vi c gii tr mc nh

http://tailieuhay.com

363

Lp trnh ha trn Java 2D v 3D 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() Behavior[] getBehaviorNodes() java.lang.String getDescription()

http://tailieuhay.com

364

Lp trnh ha trn Java 2D v 3D 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 Lm mn i tng hnh hc

http://tailieuhay.com

365

Lp trnh ha trn Java 2D v 3D 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/leve l Tokenizer Chc nng Chuyn cc k t thnh cc

http://tailieuhay.com

366

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

367

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

368

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 tokenizer Object scene file Thc thi QuadFileParser SimpleQuadObject cha QuadFileParser SimpleQuadScene tha k lp SimpleQuadObject SimpleQuadFileLoader tha k 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

369

Lp trnh ha trn Java 2D v 3D Phng thc Void setup() boolean getToken() Nhim v/hot ng Ch ra cc tham s cho tokenizer, hm ny c gi trong hm to Phng thc ly ra token tip theo, phng thc s dng hm lp cc token ra nextToken()ca Void printToken() StreamTokenizer In gi tr ca

System.out, dng trng qu trnh g QuadFileParser(Reade r r) li Hm to gi phng thc setup v 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

370

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 371

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 Boolean readVertex(QuadFileParser st) Nhim v c nh, mi nh bao gm ta x,y,z hay cc thng tin khc v mu sc, b Boolean readQuad(QuadFileParser st) mt c cc t din bng cch c cc nh t file QUAD

http://tailieuhay.com

372

Lp trnh ha trn Java 2D v 3D Void readQuadFile(QuadFileParserst) c file QUAD xc nhn 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 373

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 374

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 375

Lp trnh ha trn Java 2D v 3D vo khung cnh ha

Point3f[] in) Scene load(Reader reader)

Chuyn i mt ArrayList thnh thc makeScene() to ra cc i tng hnh hc 1.Khi to a mt i tng QuadFileParser 2.Gi QuadFileLoad(scene) 3.Gi makeScene()

objectToPoint3fArray(ArrayList mt mng Point3f, dng phng

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.
376

http://tailieuhay.com

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 377

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

378

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

379

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 380

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 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) text, Color3f color, java.lang.String

http://tailieuhay.com

381

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

382

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

383

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

384

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

385

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

386

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

387

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. Tr v i tng Java2D Font c s dng to ra i tng Font3D

http://tailieuhay.com

388

Lp trnh ha trn Java 2D v 3D 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 s u 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 conjunction with a Font2D object. The extrusion path defines the edge contour of 3D text. This contour is

http://tailieuhay.com

389

Lp trnh ha trn Java 2D v 3D 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

390

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.
391

http://tailieuhay.com

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 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. BoundingSphere(new

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

392

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 393

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

394

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

395

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

396

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 Ngi dng S chm va i quan tng thay Tng tc

Geometry

SceneGraph Vie w dng Di chuyn tng Th hin hin


397

ng dng c ng th trc i i trc c th tng i quan xut

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D hng hay v tr thay i b trong cc va nhng noi trong chm thay i trong va chm Thi gian Khung nhn Hot hnh Bng Hot hnh Hot hnh Hot cc va chm

Tn cc chi ng tit (LOD) c th

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

398

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 Behaviour. ca ring mnh v mt v s dng lp

http://tailieuhay.com

399

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

400

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 401

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 WakeuponCondition cn thit gii m i tng

http://tailieuhay.com

402

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(); 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)); } // called by Java 3D when appropriate Transform3D rotation = new

stimulus occurs

http://tailieuhay.com

403

Lp trnh ha trn Java 2D v 3D public 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

void

processStimulus(Enumeration

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 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.

http://tailieuhay.com

404

Lp trnh ha trn Java 2D v 3D 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 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

http://tailieuhay.com

405

Lp trnh ha trn Java 2D v 3D 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 TransformGroup(); objRotate = new

objRotate.setCapability(TransformGroup.ALLOW_TRAN SFORM_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. objRoot.compile(); return objRoot; }

http://tailieuhay.com

406

Lp trnh ha trn Java 2D v 3D

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. Trong th khung cnh to bi SimpleBehaviourApp, i tng SimpleBehaviour v i tng ColorCube khong nm trong cng mt h ta a phng.
http://tailieuhay.com 407

Lp trnh ha trn Java 2D v 3D 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

408

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. 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.

http://tailieuhay.com

409

Lp trnh ha trn Java 2D v 3D 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. M trong nhng iu kin wakeup l WakeupOnBehaviorPost. i tng Behaviour c th s dng phng 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.

http://tailieuhay.com

410

Lp trnh ha trn Java 2D v 3D 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. void postId(int postId) Post the specified Id. void processStimulus(java.util.Enumeration criteria)
http://tailieuhay.com 411

Lp trnh ha trn Java 2D v 3D 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 c s tru tng WakeupCriterion, cc lp cn li kt hp nhiU iu kin wakeup trong mt iu kin wakeup duy nht.

http://tailieuhay.com

412

Lp trnh ha trn Java 2D v 3D

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 The WakeupCondition abstract class is the base for all wakeup classes. It provides the following two methods. Enumeration allElements()

http://tailieuhay.com

413

Lp trnh ha trn Java 2D v 3D 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 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.

http://tailieuhay.com

414

Lp trnh ha trn Java 2D v 3D 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. WakeupOnActivation() Constructs a new WakeupOnActivation criterion. WakeupOnAWTEvent
http://tailieuhay.com 415

Lp trnh ha trn Java 2D v 3D 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, MouseEvent.MOUSE_CLICKED, MouseEvent.MOUSE_PRESSED, 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. MouseEvent.MOUSE_RELEASED, KeyEvent.KEY_RELEASED,

WakeupOnAWTEvent Method Summary AWTEvent[] getAWTEvent()

http://tailieuhay.com

416

Lp trnh ha trn Java 2D v 3D 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, phng thc xc nh r cc triggering post can thit cho s kin trigger.

http://tailieuhay.com

417

Lp trnh ha trn Java 2D v 3D 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 pairPostCondition; private WakeupCriterion wakeupNextFrame; private AWTEventCondition;
http://tailieuhay.com 418

WakeupCriterion

WakeupCriterion

Lp trnh ha trn Java 2D v 3D

private Transform3D();

Transform3D

t3D

new

private Matrix3d rotMat = new Matrix3d(); private double doorAngle; OpenBehavior(TransformGroup targetTG) { this.targetTG = targetTG; AWTEventCondition wakeupNextFrame WakeupOnElapsedFrames(0); } public { pairPostCondition } public void initialize() { this.wakeupOn(AWTEventCondition); doorAngle = 0.0; } = new WakeupOnBehaviorPost(behaviorObject, 1); void = = new new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);

setBehaviorObjectPartner(Behavior behaviorObject)

http://tailieuhay.com

419

Lp trnh ha trn Java 2D v 3D public criteria) { if (criteria.nextElement().equals(pairPostCondition) ) { System.out.println("ready 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; // portion of transform targetTG.getTransform(t3D); t3D.getRotationScale(rotMat); // doorAngle // (clobber any previous yrotation, x and z scale) rotMat.m00 Math.cos(doorAngle); rotMat.m22 = rotMat.m00; = set y-axis rotation to get rotation and scale to void processStimulus(Enumeration

http://tailieuhay.com

420

Lp trnh ha trn Java 2D v 3D rotMat.m02 Math.sin(doorAngle); rotMat.m20 = -rotMat.m02; t3D.setRotation(rotMat); targetTG.setTransform(t3D); this.wakeupOn(wakeupNextFrame); } else { // finished opening is door, signal other behavior System.out.println("door 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 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 =

http://tailieuhay.com

421

Lp trnh ha trn Java 2D v 3D 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 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)

http://tailieuhay.com

422

Lp trnh ha trn Java 2D v 3D 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) Hm to vi tham s armingNode,speedHine WakeupOnCollisionExit(SceneGraphPath armingPath) Hm to vi tham sarmingPath

http://tailieuhay.com

423

Lp trnh ha trn Java 2D v 3D WakeupOnCollisionExit(SceneGraphPath speedHint) Hm to vi tham s armingPath, speedHint armingPath, int

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) Hm to WakeupOnCollisionMovement WakeupOnCollisionMovement(Node armingNode, int speedHint) Hm to WakeupOnCollisionMovement trong speedHint nhn gi tr:

http://tailieuhay.com

424

Lp trnh ha trn Java 2D v 3D USE_BOUNDS hoc USE_GEOMETRY WakeupOnCollisionMovement(SceneGraphPath armingPath) Hm to WakeupOnCollisionMovement. WakeupOnCollisionMovement(SceneGraphPath speedHint) Hm to WakeupOnCollisionMovement, trong speedHint nhn mt trong hai gi tr: USE_BOUNDS hoc USE_GEOMETRY armingPath, int

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 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

http://tailieuhay.com

425

Lp trnh ha trn Java 2D v 3D 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.

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.

http://tailieuhay.com

426

Lp trnh ha trn Java 2D v 3D

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 c nhn bit bi lp WakeupOnSensorEntry v WakeupOnSensorExit. 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)

http://tailieuhay.com

427

Lp trnh ha trn Java 2D v 3D 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> Tr v i tng Sensor gy ra wakeup.

WakeupOnTransformChange

http://tailieuhay.com

428

Lp trnh ha trn Java 2D v 3D 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 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.

http://tailieuhay.com

429

Lp trnh ha trn Java 2D v 3D

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

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

http://tailieuhay.com

430

Lp trnh ha trn Java 2D v 3D 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) Constructs a new WakeupAndOfOrs condition..

WakeupOrOfAnds Constructor Summary

http://tailieuhay.com

431

Lp trnh ha trn Java 2D v 3D 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

432

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 d KeyNavigatorApp sau y 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 group 2. Thm i tng KeyNavigatorBehavior vo th khung cnh 3. Cung cp mt gi hn KeyNavigatorBehavior public 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 BranchGroup (hoc BoundingLeaf) cho i tng ,thit lp transform

http://tailieuhay.com

433

Lp trnh ha trn Java 2D v 3D 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 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; } 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 view khc ca hoc SimpleUniverse, thm mt i nh tng PlatformGeometry, ViewerAvatar, keyNavBeh = new =

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

http://tailieuhay.com

434

Lp trnh ha trn Java 2D v 3D 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); // Utility class SimpleUniverse SimpleUniverse(canvas3D); BranchGroup createSceneGraph(simpleU); 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. scene = simpleU = new SimpleUniverse is a Convenience

4.4.2 Lp KeyNavigatorBehaviour v KeyNavigator

http://tailieuhay.com

435

Lp trnh ha trn Java 2D v 3D 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) 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

http://tailieuhay.com

436

Lp trnh ha trn Java 2D v 3D

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 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

http://tailieuhay.com

437

Lp trnh ha trn Java 2D v 3D 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 a single,

interactively rotatable cube. public class MouseRotateApp extends Applet { public BranchGroup createSceneGraph() { // Create the root of the branch graph BranchGroup objRoot = new BranchGroup(); TransformGroup TransformGroup(); objRotate = new

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());

http://tailieuhay.com

438

Lp trnh ha trn Java 2D v 3D MouseRotate 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 // 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(); // Utility class SimpleUniverse is a Convenience myMouseRotate = new

http://tailieuhay.com

439

Lp trnh ha trn Java 2D v 3D SimpleUniverse SimpleUniverse(canvas3D); // This will move the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU = new

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 public static void main(String[] args) { System.out .print("MouseRotateApp.java 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."); \n-

http://tailieuhay.com

440

Lp trnh ha trn Java 2D v 3D 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/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

441

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

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

http://tailieuhay.com

442

Lp trnh ha trn Java 2D v 3D 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 TransformGroup) Thit lp TransformGroup ch cho Behaviour void wakeup() Gi n phng thc wakeup. MouseCallback Interface 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) void setTransformGroup(TransformGroup

http://tailieuhay.com

443

Lp trnh ha trn Java 2D v 3D 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 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.
http://tailieuhay.com 444

Lp trnh ha trn Java 2D v 3D 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. 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

http://tailieuhay.com

445

Lp trnh ha trn Java 2D v 3D 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 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.

http://tailieuhay.com

446

Lp trnh ha trn Java 2D v 3D 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

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

http://tailieuhay.com

447

Lp trnh ha trn Java 2D v 3D cho phng thc createSceneGraph v vy i tng ViewPlatform c th c truy cp.

public createSceneGraph(SimpleUniverse su) {

BranchGroup

// Create the root of the branch graph BranchGroup objRoot = new BranchGroup(); TransformGroup vpTrans = null; BoundingSphere mouseBounds = null; vpTrans ); objRoot.addChild(new ColorCube(0.4)); objRoot.addChild(new Axis()); mouseBounds = new BoundingSphere(new Point3d(), 1000.0); MouseRotate myMouseRotate = new =

su.getViewingPlatform().getViewPlatformTransform(

MouseRotate(MouseBehavior.INVERT_INPUT); myMouseRotate.setTransformGroup(vpTrans); myMouseRotate.setSchedulingBounds(mouseBo unds); objRoot.addChild(myMouseRotate);

http://tailieuhay.com

448

Lp trnh ha trn Java 2D v 3D MouseTranslate myMouseTranslate = new MouseTranslate(MouseBehavior.INVERT_INPUT); myMouseTranslate.setTransformGroup(vpTran s); myMouseTranslate.setSchedulingBounds(mous eBounds); objRoot.addChild(myMouseTranslate); MouseZoom myMouseZoom = new

MouseZoom(MouseBehavior.INVERT_INPUT); myMouseZoom.setTransformGroup(vpTrans); myMouseZoom.setSchedulingBounds(mouseBoun ds); objRoot.addChild(myMouseZoom); // Let Java 3D perform optimizations on this scene graph. objRoot.compile(); return objRoot; } // end of CreateSceneGraph method of MouseNavigatorApp

Kt qu cho ta l:

http://tailieuhay.com

449

Lp trnh ha trn Java 2D v 3D

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. 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.

http://tailieuhay.com

450

Lp trnh ha trn Java 2D v 3D

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 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 .

http://tailieuhay.com

451

Lp trnh ha trn Java 2D v 3D

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 node. c im khc ca lp Node l kh nng ENABLE_PICK_REPORTING. Kh nng ny ch p dng vi mt nhm

Node Method (partial list) 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

http://tailieuhay.com

452

Lp trnh ha trn Java 2D v 3D 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 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

http://tailieuhay.com

453

Lp trnh ha trn Java 2D v 3D 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 chng ta gii thiu v cc lp tin ch PickRotateBehavior, PickTranslateBehavior, 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 PickRotateBehavior behavior = new PickRotateBehavior(root, canvas, bounds); root.addChild(behavior);

http://tailieuhay.com

454

Lp trnh ha trn Java 2D v 3D 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) { // Create the root of the branch graph BranchGroup objRoot = new BranchGroup(); TransformGroup objRotate = null;
http://tailieuhay.com 455

Lp trnh ha trn Java 2D v 3D PickRotateBehavior pickRotate = null; Transform3D Transform3D(); BoundingSphere BoundingSphere(); // PickRotateBehavior objects transform.setTranslation(new Vector3f(0.6f, 0.0f, -0.6f)); objRotate 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, behaveBounds); objRoot.addChild(pickRotate); // add a second ColorCube object to the scene graph = new = new create ColorCube and behaveBounds = new transform = new

canvas,

http://tailieuhay.com

456

Lp trnh ha trn Java 2D v 3D transform.setTranslation(new Vector3f( 0.6f, 0.0f, -0.6f)); objRotate 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 = new

http://tailieuhay.com

457

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 458

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

459

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

460

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

461

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 462

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

463

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

464

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

465

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 466

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 467

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

468

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 PickObject.GROUP, PickObject.PRIMITIVE, PickObject.SHAPE3D, PickObject.TRANSFORM_GROUP. Node pickNode(SceneGraphPath sgPath, int node_types, int occurrence) PickObject.SWITCH, xc nh gi tr ca kiu node: PickObject.BRANCH_GROUP, PickObject.LINK, PickObject.MORPH,

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

469

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

470

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 boolean segmentAndPoint(PickSegment segmentAndQuad(PickSegment segment, Point3d pnt, double[] dist) 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

471

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 i 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

472

Lp trnh ha trn Java 2D v 3D Thc thi: PickingCallback PickTranslateBehavior(BranchGroup Bounds bounds) Khi to hnh vi pick/translate ch s kin t chut trong th khung cnh PickTranslateBehavior(BranchGroup Bounds bounds, int pickMode) root, Canvas3D canvas, root, Canvas3D canvas,

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

473

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 .

CHNG 5 Hot Hnh

http://tailieuhay.com

474

Lp trnh ha trn Java 2D v 3D

Trong chng ny, chng ti s trnh by cc vn c bn sau:

S dng cc lp Alpha v Interpolator


n gin

thm cc hot nh

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 ng ngi dng th c gi l tng tc (chng ta xt trong chng 4).

http://tailieuhay.com

475

Lp trnh ha trn Java 2D v 3D 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

476

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 477

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 52. 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

478

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

479

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.
2. 3.

to i tng ch vi cc kh nng thch hp to i tng Alpha to i tng Interpolator tham chiu n n i tng thm cc gii hn cho i tng Interpolator thm i tng Interpolator vo th khung cnh

Alpha v i tng ch
4. 5.

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

480

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 481

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 TransformGroup(); objSpin.setCapability(TransformGroup.ALLO W_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()); objRoot.addChild(background); objSpin = new

http://tailieuhay.com

482

Lp trnh ha trn Java 2D v 3D

// Let Java 3D perform optimizations on this scene graph. objRoot.compile(); return objRoot; } 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. // end of CreateSceneGraph method of

http://tailieuhay.com

483

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

484

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 ~ 0.8s

Time ~ 1.2s

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 485

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

486

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 gi tr xc nh cho thuc tnh
487

http://tailieuhay.com

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 c th l 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 488

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

489

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 RotationInterpolator


http://tailieuhay.com

mt i tng lp tru tng TransformGroup thay i v tr TransformGroup ca i tng thay i chuyn TransformGroup

5-20 5-14 5-15


490

Lp trnh ha trn Java 2D v 3D ng quay

(hng) ca i ScaleInterpolator tng thay i kch c TransformGroup 5-16 5-17

ca i tng SwitchValueInterpolator la chn mt Switch 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

491

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

492

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 GeometryArray.COORDINATES | GeometryArray.NORMALS); else carGeom GeometryArray.COORDINATES); carGeom.setCoordinate( carGeom.setCoordinate( carGeom.setCoordinate( 0, 1, 2, new new new = new QuadArray(16, = new QuadArray(16,

Point3f(xScale*-0.25f, yScale*0.22f, 0.0f)); Point3f(xScale* 0.20f, yScale*0.22f, 0.0f)); Point3f(xScale* 0.10f, yScale*0.35f, 0.0f));

http://tailieuhay.com

493

Lp trnh ha trn Java 2D v 3D carGeom.setCoordinate( carGeom.setCoordinate( carGeom.setCoordinate( carGeom.setCoordinate( carGeom.setCoordinate( carGeom.setCoordinate( carGeom.setCoordinate( 3, 4, 5, 6, 7, 8, 9, new new new new new new new new new new new new new

Point3f(xScale*-0.20f, yScale*0.35f, 0.0f)); Point3f(xScale*-0.50f, yScale*0.10f, 0.0f)); Point3f(xScale* 0.50f, yScale*0.10f, 0.0f)); Point3f(xScale* 0.45f, yScale*0.20f, 0.0f)); Point3f(xScale*-0.48f, yScale*0.20f, 0.0f)); Point3f(xScale*-0.26f, yScale*0.00f, 0.0f)); Point3f(xScale*-0.18f, yScale*0.00f, 0.0f)); carGeom.setCoordinate(10, Point3f(xScale*-0.16f, yScale*0.12f, 0.0f)); carGeom.setCoordinate(11, Point3f(xScale*-0.28f, yScale*0.12f, 0.0f)); carGeom.setCoordinate(12, Point3f(xScale* 0.25f, yScale*0.00f, 0.0f)); carGeom.setCoordinate(13, Point3f(xScale* 0.33f, yScale*0.00f, 0.0f)); carGeom.setCoordinate(14, Point3f(xScale* 0.35f, yScale*0.12f, 0.0f)); carGeom.setCoordinate(15, Point3f(xScale* 0.23f, yScale*0.12f, 0.0f)); if (createNormals){ int i;

http://tailieuhay.com

494

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 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(); carAppear = new

http://tailieuhay.com

495

Lp trnh ha trn Java 2D v 3D BoundingSphere BoundingSphere(); // create target TransformGroup with Capabilities TransformGroup TransformGroup(); objMove.setCapability(TransformGroup.ALLO W_TRANSFORM_WRITE); // create target TransformGroup with Capabilities TransformGroup TransformGroup(); objRotate.setCapability(TransformGroup.AL LOW_TRANSFORM_WRITE); // create target TransformGroup with Capabilities TransformGroup TransformGroup(); objScale.setCapability(TransformGroup.ALL OW_TRANSFORM_WRITE); // Capabilities Material objColor = new Material(); objColor.setCapability(Material.ALLOW_COM PONENT_WRITE); create target Material with objScale = new objRotate = new objMove = new bounds = new

http://tailieuhay.com

496

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

497

Lp trnh ha trn Java 2D v 3D RotationInterpolator rotInt = new

RotationInterpolator (alpha, objRotate); rotInt.setSchedulingBounds(bounds); // create scale interpolator ScaleInterpolator scaInt = new ScaleInterpolator (alpha, objScale); scaInt.setSchedulingBounds(bounds); // create color interpolator ColorInterpolator colInt = new 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

498

Lp trnh ha trn Java 2D v 3D t3d.setTranslation(new Vector3f(0.0f, 0.8f, 0.0f)); TransformGroup 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 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 TransformGroup(t3d); objRoot.addChild(objScalePos); objScalePos.addChild(objScale); objScale.addChild(createCar(0.4f, 0.4f, false, true)); objRoot.addChild(scaInt); objScalePos = new objRotPos = new objMovePos = new

http://tailieuhay.com

499

Lp trnh ha trn Java 2D v 3D

t3d.setTranslation(new Vector3f(0.0f, -0.2f, 0.0f)); TransformGroup TransformGroup(t3d); objRoot.addChild(objColorPos); Shape3D colorCar = createCar(0.4f, 0.4f, true, false); Appearance Appearance(); materialAppear.setMaterial(objColor); colorCar.setAppearance(materialAppear); objColorPos.addChild(colorCar); objRoot.addChild(colInt); t3d.setTranslation(new Vector3f(0.0f, -0.5f, 0.0f)); TransformGroup TransformGroup(t3d); objRoot.addChild(objTranspPos); Shape3D transpCar = createCar(0.4f, 0.4f, false, true); Appearance transpCar.getAppearance(); transpAppear.setTransparencyAttributes(ob jTransp); objTranspPos.addChild(transpCar); objRoot.addChild(traInt); transpAppear = objTranspPos = new materialAppear = new objColorPos = new

http://tailieuhay.com

500

Lp trnh ha trn Java 2D v 3D t3d.setTranslation(new Vector3f(0.0f, -0.8f, 0.0f)); TransformGroup 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 DirectionalLight(); // lightD1.setDirection(new Vector3f(-0.7f,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(); 0.7f,0.0f)); lightD1 = new objSwitchPos = new

http://tailieuhay.com

501

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 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) simpleU = new

http://tailieuhay.com

502

Lp trnh ha trn Java 2D v 3D // // The following allows this to be run as an as well as an applet

application

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 503

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

504

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

505

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 506

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 507

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

508

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

509

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

510

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 CHILD_MASK 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 - ch th tt c cc con c biu din - s dng mt n childMask (kiu BitSet) la

http://tailieuhay.com

511

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 512

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

513

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 s dng i 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 514

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 TransformGroup(); Transform3D 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 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); axis = new axisOfRotPos = new target = new

http://tailieuhay.com

515

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( -1.0f); positions[1]= new Point3f( -2.0f); positions[2]= new Point3f( -1.0f, -3.0f); positions[3]= new Point3f( -4.0f); positions[4]= new Point3f( -2.0f, -1.0f, -5.0f); positions[5]= new Point3f( -6.0f); positions[6]= new Point3f( -3.0f, -7.0f); positions[7]= new Point3f( -4.0f); positions[8]= positions[0]; 2.0f, -1.0f, 0.0f, 3.0f, 1.0f, 2.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f,

http://tailieuhay.com

516

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 Appearance(); ColoringAttributes points_coloring = new ColoringAttributes(); points_coloring.setColor(1.0f, 0.0f, 0.0f); points_appear = new

http://tailieuhay.com

517

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

518

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

519

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 v 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

520

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

521

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

522

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 523

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 i tng ch khng c 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 524

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 createSceneGraph(SimpleUniverse su) { // Create the root of the branch graph TransformGroup vpTrans = null; BranchGroup objRoot = new BranchGroup(); Vector3f translate = new Vector3f(); BranchGroup

http://tailieuhay.com

525

Lp trnh ha trn Java 2D v 3D Transform3D T3D = new Transform3D(); TransformGroup TGT = null; TransformGroup TGR = null; Billboard billboard = null; BoundingSphere BoundingSphere(); objRoot.addChild(createLand()); SharedGroup share = new SharedGroup(); share.addChild(createTree()); float[][] position = { { 0.0f, 0.0f, bSphere = new

-3.0f }, { 6.0f, 0.0f, 0.0f }, { 6.0f, 0.0f, 6.0f }, { 3.0f, 0.0f, -10.0f }, { { 13.0f, -13.0f, 0.0f, -30.0f }, { }, -13.0f, 0.0f, 30.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

526

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 ); translate.set(0.0f, 0.3f, 0.0f); T3D.setTranslation(translate); vpTrans.setTransform(T3D); KeyNavigatorBehavior KeyNavigatorBehavior(vpTrans); keyNavBeh .setSchedulingBounds(new BoundingSphere(new Point3d(), 1000.0)); objRoot.addChild(keyNavBeh); Background background = new Background(); background.setColor(0.3f, 0.3f, 1.0f); keyNavBeh = new = su.getViewingPlatform().getViewPlatformTransform(

http://tailieuhay.com

527

Lp trnh ha trn Java 2D v 3D background.setApplicationBounds(new BoundingSphere()); objRoot.addChild(background); // Let Java 3D perform optimizations on this scene graph. objRoot.compile(); return objRoot; } // end of m CreateSceneGraph trn c trch t method phng of thc BillboardAppon

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 BillboardApp.java

trong

Hnh 5-17 hin th mt cnh sinh bi chng trnh v d BillboardApp.

http://tailieuhay.com

528

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

529

Lp trnh ha trn Java 2D v 3D Cc phng thc khi to ca Billboard Billboard Khi to mt Billboard 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 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 530

() vi tham s mc nh: mode =

ROTATE_ABOUT_AXIS, axis = (0, 1, 0).

- Ch nh quay xung quanh mt

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

531

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

532

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();
533

http://tailieuhay.com

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 534

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 535

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 i 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

536

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

537

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 BoundingSphere(); // create target TransformGroup with Capabilities TransformGroup 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
538

bounds

new

objMove

new

http://tailieuhay.com

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 Appearance(); ColoringAttributes ColoringAttributes(); sphereCAa.setColor(0.1f, 0.8f, 0.1f); sphereAppearA.setColoringAttributes(spher eCAa); Appearance Appearance(); ColoringAttributes ColoringAttributes(); sphereCAb.setColor(0.8f, 0.1f, 0.1f); sphereAppearB.setColoringAttributes(spher eCAb); sphereCAb = new sphereAppearB = new sphereCAa = new sphereAppearA = new

http://tailieuhay.com

539

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

540

Lp trnh ha trn Java 2D v 3D objRoot.addChild(objMove); TG of position interp to move vo objRoot.addChild(posInt); position interpolator objMove.addChild(dLOD); the bounds move with visual object objMove.addChild(targetSwitch);// must add target switch to scene graph too // make // add // target

// show a level 3 object up close for comparison Transform3D t3d = new Transform3D(); t3d.set(new Vector3f(0.6f, 0.0f, 0.0f)); TransformGroup TransformGroup(t3d); objRoot.addChild(tga); tga.addChild(new Sphere(.40f, 0, sphereAppearB)); // show a level 0 object at a distance for comparison t3d.set(new -35.0f)); TransformGroup TransformGroup(t3d); objRoot.addChild(tgb); tgb.addChild(new Sphere(.40f, 0, sphereAppearA)); 25, tgb = new Vector3f(-5.0f, 0.0f, 4, tga = new

http://tailieuhay.com

541

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

542

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

543

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 2. n nu distances[i-1] < d <= distances[i] nu d > distances[n-1]

http://tailieuhay.com

544

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

545

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

546

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

547

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

548

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] weights[alphaIndex]; targetMorph.setWeights(weights); // set next wakeup condition this.wakeupOn(trigger); } } // end of class MorphBehavior = 1.0 -

http://tailieuhay.com

549

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

550

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 TransformGroup(t3d); // create GeometryArray[] (array of GeometryArray objects) GeometryArray[] 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_WEIGHT S_WRITE); // create alpha object Alpha alpha = new Alpha(-1, 1, 0, 0, 2000, 100, 0, 0, 0, 0); // create morph driving behavior MorphBehavior MorphBehavior(morphObj, alpha); morphBehav = new geomArray = new translate = new

http://tailieuhay.com

551

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; } 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. // end of CreateSceneGraph method of

http://tailieuhay.com

552

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 553

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

554

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

555

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

556

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

557

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 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 nh.
http://tailieuhay.com 558

th 2

chu trch nhim thit lp kh nng c s lng

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 LineArray.COORDINATES | LineArray.BY_REFERENCE); = new LineArray(N * 2,

waterLines.setCapability(GeometryArray.ALLOW_REF_ DATA_WRITE);

waterLines.setCapability(GeometryArray.ALLOW_REF_ DATA_READ);

http://tailieuhay.com

559

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 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); // redundant // waterLines.setInitialCoordIndex(0); // waterLines.setValidVertexCount(N*2); return waterLines; } the following statements would be * 3 + 4] = * 3 + 1] =

http://tailieuhay.com

560

Lp trnh ha trn Java 2D v 3D abstract Behavior { WakeupOnElapsedFrames w = null; public UpdateWaterBehavior() { w = new WakeupOnElapsedFrames(0); } public void initialize() { wakeupOn(w); } public critiria) { waterLines.updateData(geometryUpdater); wakeupOn(w); } // end processStimulus } // end class UpdateWaterBehavior public class WaterUpdater implements void processStimulus(Enumeration class UpdateWaterBehavior extends

GeometryUpdater { Random random; public WaterUpdater() { random = new Random();

http://tailieuhay.com

561

Lp trnh ha trn Java 2D v 3D } public void updateData(Geometry geometry) { GeometryArray (GeometryArray) geometry; float[] int coords N = = geometryArray.getCoordRefFloat(); geometryArray.getValidVertexCount(); int i; for (i = 0; i < N; i += 2) { // for each particle if (coords[i * 3 + 1] > baseElevation) { // update active // particles coords[i coords[i * * 3 3 + + 0] 1] += += coords[i * 3 + 0] - coords[i * 3 + 3]; // x1 coords[i * 3 + 1] - coords[i * 3 + 4] - 0.01f; // y1 coords[i coords[i x2 * * 3 3 + + 2] 3] += = coords[i * 3 + 2] - coords[i * 3 + 5]; // z1 (coords[i * 3 + 0] + coords[i * 3 + 3]) / 2; // geometryArray =

http://tailieuhay.com

562

Lp trnh ha trn Java 2D v 3D coords[i 2;// y2 coords[i z2 if (coords[i * 3 + 1] < * 3 + 5] = (coords[i * 3 + 2] + coords[i * 3 + 5]) / 2; // * 3 + 4] =

(coords[i * 3 + 1] + coords[i * 3 + 4] + 0.01f) /

baseElevation) { // if particle // below base coords[i 0.0f; // x1 coords[i baseElevation; // y1 coords[i 0.0f; // z1 coords[i 0.0f; // x2 coords[i baseElevation; // y2 coords[i 0.0f; // z2 } } else { // an inactive particle if (random.nextFloat() coords[i * 3 + 0] > = 0.8) { // randomly start a drop 0.03f * (random.nextFloat() - 0.5f); // x1 * 3 + 5] = * 3 + 4] = * 3 + 3] = * 3 + 2] = * 3 + 1] = * 3 + 0] =

http://tailieuhay.com

563

Lp trnh ha trn Java 2D v 3D coords[i 0.14f * random.nextFloat() + baseElevation; // y1 coords[i } // 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 c dn nhn . Phng thc initialize() ca lp UpdateWaterBehavior, bt u t dng m 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. , thit lp iu kin nh * 3 + 2] = 0.03f * (random.nextFloat() - 0.5f); // z1 * 3 + 1] =

http://tailieuhay.com

564

Lp trnh ha trn Java 2D v 3D abstract Behavior { WakeupOnElapsedFrames w = null; public UpdateWaterBehavior() { w = new WakeupOnElapsedFrames(0); } public void initialize() { wakeupOn(w); } public 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 phng thc updateData(). , mt i tng Random c to ra s dng trong phng thc thng duy nht ca lp, void processStimulus(Enumeration class UpdateWaterBehavior extends

http://tailieuhay.com

565

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 thnh GeometryArray. Trn dng m nh c ly ra. Dng , tham s Geometry c p kiu , mt tham chiu n d liu ta

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 566

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 khi to. public class WaterUpdater implements . Trong v d ny, mt lng trung bnh khong 20% cc phn t khng hot ng s c

GeometryUpdater { Random random; public WaterUpdater() { random = new Random(); } public void updateData(Geometry geometry) { GeometryArray (GeometryArray) geometry; float[] int coords N = = geometryArray.getCoordRefFloat(); geometryArray.getValidVertexCount(); int i; for (i = 0; i < N; i += 2) { // for each particle if (coords[i * 3 + 1] > baseElevation) { // update active
567

geometryArray

http://tailieuhay.com

Lp trnh ha trn Java 2D v 3D

// particles coords[i coords[i * * 3 3 + + 0] 1] += += coords[i * 3 + 0] - coords[i * 3 + 3]; // x1 coords[i * 3 + 1] - coords[i * 3 + 4] - 0.01f; // y1 coords[i coords[i x2 coords[i 2;// y2 coords[i z2 if (coords[i * 3 + 1] < * 3 + 5] = (coords[i * 3 + 2] + coords[i * 3 + 5]) / 2; // * 3 + 4] = (coords[i * 3 + 1] + coords[i * 3 + 4] + 0.01f) / * * 3 3 + + 2] 3] += = coords[i * 3 + 2] - coords[i * 3 + 5]; // z1 (coords[i * 3 + 0] + coords[i * 3 + 3]) / 2; //

baseElevation) { // if particle // below base coords[i 0.0f; // x1 coords[i baseElevation; // y1 coords[i 0.0f; // z1 * 3 + 2] = * 3 + 1] = * 3 + 0] =

http://tailieuhay.com

568

Lp trnh ha trn Java 2D v 3D coords[i 0.0f; // x2 coords[i baseElevation; // y2 coords[i 0.0f; // z2 } } else { // an inactive particle if (random.nextFloat() coords[i coords[i 0.14f * random.nextFloat() + baseElevation; // y1 coords[i } // 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 i tng LineAttributes vi setLineAntialiasedEnable(true) vo thnh phn Appearance ca phn t nc. Tuy nhin, lu rng, vic lm ny c th phi tr gi bi tc x l hot nh.
http://tailieuhay.com 569

* * *

3 3 3

+ + +

3] 4] 5]

= = =

> = =

0.8) { // randomly start a drop * * 3 3 + + 0] 1] 0.03f * (random.nextFloat() - 0.5f); // x1

2]

0.03f * (random.nextFloat() - 0.5f); // z1

Lp trnh ha trn Java 2D v 3D

http://tailieuhay.com

570

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

571

You might also like