I suspect you haven't set ALLOW_APPEARANCE_WRITE on the Shape3D or you
used Sphere, in which case you don't seem to be able to set this
capability. Looks like you'd have to do the following for each part:
Sphere.getShape().setCapability(ALLOW_APPEARANCE_WRITE);
The reason it works any way is that you don't actually need the second
line in your method (mySphere.setAppearance()) since you kept a
reference to your appearance which is actually set in the node. Hence
you don't actually need to reset the appearance each time.
Just take the second line out, or set the capability using the method
mentioned above.
HTH
Kev
ZACZEK, MARIUSZ P. (MARIO) (JSC-DM) (NASA) wrote:
Hi,
I've been racking my brain for over a day on this and can't figure out
what I'm doing wrong or not doing.
I place a 3D Sphere into my scenegraph, and later I want to change the
color of it. But when I press the button to reset it's appearance to the
new color/material:
public void setSphereAppearance(Material newmat) {
planetApp.setMaterial(newmat);
mySphere.setAppearance(planetApp);
}
I get a error saying: Shape3D: no capability to set appearance
Although...it changes the color...wierd. I'm pretty sure I set all
the needed capability flags but maybe I'm missing something. I've copied
the code for my 3D sphere below...it's a BranchGroup so it can be
added to a live scenegraph.
I'd appreciate any suggestions..
Mario
CODE:
==================================================
// Import the 3D API libraries for viewing 3D environments.
import com.sun.j3d.utils.geometry.*;
import javax.media.j3d.*;
import javax.vecmath.*;
// Import the math library.
import java.lang.Math.*;
/**
*
*/
public class Sphere3d extends BranchGroup {
//
// Variable declarations
//
private double _scaleValue = 1.0f;
private Vector3f _transValue = new Vector3f(0.0f, 0.0f, 0.0f);
private Transform3D _scaleTran; // Scale transform
private Transform3D _transTran; // Translation transform
private Transform3D _oldTrans = new Transform3D();
private TransformGroup mainTG = new TransformGroup();
private boolean _solid = false;
private Color3f _color = new Color3f();
private Vector3f _base = new Vector3f();
private float _scale = 1.0f;
private float _dim1 = 0.0f;
private Appearance planetApp;
private Sphere mySphere;
Color3f black = new Color3f(0.20f, 0.20f, 0.20f);
/**
* Calls the 'defineVrml' function to define the VRML model
* by setting the initial scale, translation and rotation.
*
*/
public Sphere3d(boolean solid, Color3f color, Vector3f base, float scale,
float dim1){
this.addChild(mainTG);
this.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
System.out.println("\n Cannot simply define blank Sphere3d");
setVariables(solid, color, base, scale, dim1);
definePrimitive();
drawSphere(solid,dim1);
setPosition(base.x, base.y, base.z);
setScale(scale);
}
/**
*
*
*
*/
private void setVariables(boolean solid, Color3f color, Vector3f base,
float scale, float dim1) {
_solid = solid;
_color = color;
_base = base;
_scale = scale;
_dim1 = dim1;
}
public boolean getSolid() {
return _solid;
}
public Color3f getColor() {
return _color;
}
public Vector3f getBase() {
return _base;
}
public float getScaleVal() {
return _scale;
}
public float getDim1() {
return _dim1;
}
/**
*
*
*
*/
private void drawSphere(boolean solid, float radius) {
if (!solid) {
ColoringAttributes ca = new ColoringAttributes();
ca.setColor(_color);
PolygonAttributes pa = new PolygonAttributes();
pa.setPolygonMode (PolygonAttributes.POLYGON_LINE);
Appearance ap = new Appearance();
ap.setColoringAttributes (ca);
ap.setPolygonAttributes (pa);
mainTG.addChild(new Sphere(radius,ap));
} else if (solid) {
planetApp = new Appearance();
planetApp.setCapability(Appearance.ALLOW_MATERIAL_WRITE);
planetApp.setCapability.Appearance.ALLOW_COLORING_ATTRIBUTES_WRITE);
TransparencyAttributes _transAttrs;
float _transparency = 0.0f;
float _curtransparency = 0.0f;
Transform3D _transTrans = new Transform3D();
_transAttrs = new TransparencyAttributes(TransparencyAttributes.NONE,
_transparency);
// Allow the transparency value to be overwritten.
_transAttrs.setCapability(TransparencyAttributes.ALLOW_VALUE_WRITE);
// Allow the transparency mode to be overwritten.
_transAttrs.setCapability(TransparencyAttributes.ALLOW_MODE_WRITE);
planetApp.setTransparencyAttributes(_transAttrs);
Material m = new Material(_color,black,_color,black,64.0f);
planetApp.setMaterial(m);
// Draw the sphere for the planet and add the texture to it
mainTG.addChild(mySphere = new Sphere(radius,
Sphere.GENERATE_TEXTURE_COORDS |
Sphere.GENERATE_NORMALS,
8, planetApp));
mySphere.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
mySphere.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
mySphere.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
}
}
/**
* Changes the appearance
*
*/
public void setSphereAppearance(Material newmat) {
planetApp.setMaterial(newmat);
mySphere.setAppearance(planetApp);
}
/**
* Sets up the VRML model (does not specifically load one
* until needed, but sets up the necessary Transforms and
* BranchGroups)
*
*/
private void definePrimitive() {
// this will allow arm to be dynamic.
mainTG.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
mainTG.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
mainTG.setCapability( TransformGroup.ALLOW_CHILDREN_EXTEND );
mainTG.setCapability( TransformGroup.ALLOW_CHILDREN_READ );
mainTG.setCapability( TransformGroup.ALLOW_CHILDREN_WRITE );
this.setCapability( BranchGroup.ALLOW_CHILDREN_WRITE );
// Allow this primitive to be detached from wherever it is attached
this.setCapability( BranchGroup.ALLOW_DETACH );
//
// Multiply together the SCALING, TRANSLATION matrices
// to form one TRANSFORMATION matrix.
//
// newMatrix = [S][T]
//
// [S] = Scaling Matrix
// [T] = Translation Matrix
//
// SCALING transformation matrix
_scaleTran = new Transform3D();
_scaleTran.setScale(_scaleValue);
// TRANSLATION transformation matrix (combined with previous scaling
matrix)
_transTran = new Transform3D();
_transTran.setTranslation(_transValue);
// Set the final transformation for 'this' transform group to be the
composite
mainTG.setTransform(_transTran);
// UPDATE all of the transformations (multiply them together into one)
// ...then set the Transform3D of this TransformGroup
update();
}
/**
* Scales the size of the model in all directions.
* @param newscale scaling factor for the VRML object
*/
public void setScale(double newscale) {
_scaleValue = newscale;
_scaleTran.setIdentity();
_scaleTran.setScale(_scaleValue);
update();
}
/**
* Moves the model to any 3D position.
* @param x x position
* @param y y position
* @param z z position
*/
public void setPosition( double x, double y, double z ) {
_transValue.x = (float)x;
_transValue.y = (float)y;
_transValue.z = (float)z;
_transTran.setIdentity();
_transTran.setTranslation(_transValue);
update();
}
/**
* Sets the scaling, position and rotation transforms and
* set the combined Transform (this.setTransform) of 'this'
TransformGroup.
*
*/
private void setTransformations() {
// Multiply all the rotation, translation and scaling matrices together
_oldTrans.setIdentity();
// Multiply identity matrix by the TRANSLATION matrix
_oldTrans.mul(_transTran);
// Multiply the combined TRANSLATION-ROTATION matrix by the SCALE matrix
_oldTrans.mul(_scaleTran);
// set the TRANSFORM of this TransformGroup (TRANSLATION-ROTATION-SCALE)
mainTG.setTransform(_oldTrans);
}
/**
* Updates the transformations. This call is needed following any change
in the planet.
*
*
*/
public void update() {
setTransformations();
}
/**
* Returns scale value.
* @return double _scaleValue - value of the current scaling factor
*/
public double getScale() {
return _scaleValue;
}
/**
* Returns the current position as a vector.
* @return Vector3f _transValue - current position vector
*/
public Vector3f getPosition() {
return _transValue;
}
} // end of 'Sphere3d' class
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".
--
Jose UML - http://www.newdawnsoftware.com/jose
Pondering RPG - http://pondering.newdawnsoftware.com
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".