Sean, Uwe Transform3d.setScale() seems more suitable for the task then scale(); the former discards the old scaling factor as it puts in the new, so you don't have to worry about cummulative effects. Gabriel On Sun, 17 Sep 2006, MASON-INTEREST-L automatic digest system wrote: > There are 2 messages totalling 124 lines in this issue. > > Topics of the day: > > 1. Dynamic TransformedPortayal3D (2) > > ---------------------------------------------------------------------- > > Date: Sat, 16 Sep 2006 19:38:46 -0400 > From: Uwe Grueters <[log in to unmask]> > Subject: Dynamic TransformedPortayal3D > > Dear all, > > I am completely new to this list and to MASON. > > I intend to develop a model for virtual plants in 3d. Plant attributes > (height, diameter) are calculated in the simulation and ConePortrayals3D > for the plants created at runtime shall reflect these attributes. > > I found example code in the Balls3D model that does similar things to a > SpherePortrayal3D. The BallPortrayal inherits from the SpherePortrayal3D > and overrides the getModel method of the superclass. The if condition > becomes true when the TransformGroup passed to the method is null (as in > the getModel method of the superclass) or when the passed in Object casted > to Ball has changed its mass. In the statements that are executed in that > case the SpherePortayal3D scale-variable is multiplied by the BallObject's > radius, that also has changed. So, there is a dynamic connection of the > attributes of a ball and its portrayal. > > I tried to follow this scheme by creating a PlantPortrayal that extends > TransformedPortrayal3D, overriding its getModel method, putting in || > ((Plant)obj).oldDiameter != ((Plant)obj).diameter and trying to change the > internalTransform using components from the method code for scaling > (double,double,double) and rotatingY in the TransformedPortrayal3D. > > However, when I ran the code with a step method in which the diameter is > increased by 1 each time step I saw the cone size to increase drametically > at step 1 and at step 2 the cones seemed to be too large to be displayed. > > Has anyone written code to dynamically connect a "TransformedPortrayal3D" > to attributes of the underlying agent? Is there anyone, who could give me > some advice in these matters? > > Since this behaviour is such a basic requirement for the model development > I would greatly appreciate any helpful suggestions. > > Thank you very much in advance, Uwe > > ------------------------------ > > Date: Sat, 16 Sep 2006 20:52:57 -0400 > From: Sean Luke <[log in to unmask]> > Subject: Re: Dynamic TransformedPortayal3D > > Hi Uwe. The TransformedPortrayal3D class uses a Java3D Transform3D > object underneath, and you can replace the Transform3D as you see > fit. However if you're calling the scale() method built into the > class, you need to understand that these are further scaling the > *existing* scale -- that is, it's multiplying the scales. For > example, if you called scale(2,2,2), and then again called scale > (2,2,2), your total scaling will be of size 4. > > Also, note that performing scales, rotations, and translations, are > called affine transformations, and are done internally with a 4 by 4 > matrix. Each operation multiplies that matrix by a new matrix -- and > matrix multiplications are NOT commutative. You can't do a rotate > and then a scale and expect it to be the same as a scale followed by > a rotate (say). > > Sean > > On Sep 16, 2006, at 7:38 PM, Uwe Grueters wrote: > > > Dear all, > > > > I am completely new to this list and to MASON. > > > > I intend to develop a model for virtual plants in 3d. Plant attributes > > (height, diameter) are calculated in the simulation and > > ConePortrayals3D > > for the plants created at runtime shall reflect these attributes. > > > > I found example code in the Balls3D model that does similar things > > to a > > SpherePortrayal3D. The BallPortrayal inherits from the > > SpherePortrayal3D > > and overrides the getModel method of the superclass. The if condition > > becomes true when the TransformGroup passed to the method is null > > (as in > > the getModel method of the superclass) or when the passed in Object > > casted > > to Ball has changed its mass. In the statements that are executed > > in that > > case the SpherePortayal3D scale-variable is multiplied by the > > BallObject's > > radius, that also has changed. So, there is a dynamic connection of > > the > > attributes of a ball and its portrayal. > > > > I tried to follow this scheme by creating a PlantPortrayal that > > extends > > TransformedPortrayal3D, overriding its getModel method, putting in || > > ((Plant)obj).oldDiameter != ((Plant)obj).diameter and trying to > > change the > > internalTransform using components from the method code for scaling > > (double,double,double) and rotatingY in the TransformedPortrayal3D. > > > > However, when I ran the code with a step method in which the > > diameter is > > increased by 1 each time step I saw the cone size to increase > > drametically > > at step 1 and at step 2 the cones seemed to be too large to be > > displayed. > > > > Has anyone written code to dynamically connect a > > "TransformedPortrayal3D" > > to attributes of the underlying agent? Is there anyone, who could > > give me > > some advice in these matters? > > > > Since this behaviour is such a basic requirement for the model > > development > > I would greatly appreciate any helpful suggestions. > > > > Thank you very much in advance, Uwe > > ------------------------------ > > End of MASON-INTEREST-L Digest - 2 Sep 2006 to 16 Sep 2006 (#2006-54) > ********************************************************************* >