Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00017 package com.generalrobotix.ui.view.tdview;
00018 import com.sun.j3d.utils.picking.*;
00019 import com.sun.j3d.utils.geometry.Primitive;
00020 import com.sun.j3d.utils.geometry.Cone;
00021 import com.sun.j3d.utils.geometry.Cylinder;
00022 import com.sun.j3d.utils.geometry.Sphere;
00023
00024 import javax.media.j3d.*;
00025 import javax.vecmath.*;
00026
00027
00028
00029 public class FittingInfo {
00031 Point3f p3fIntersect;
00033 Vector3f v3fNormal;
00035 Point3f p3fIntersectVW;
00037 Vector3f v3fNormalVW;
00039 Point3d[] p3dPrimitivePoints;
00040
00042 TransformGroup tgFittingTarget;
00043 TransformGroup tgFittingTargetBefore;
00044
00045 public final static int iNumberOfSphere = 4;
00047 BranchGroup bgAddTop = new BranchGroup();
00049 TransformGroup[] sphTrans = new TransformGroup [iNumberOfSphere];
00050 TransformGroup tgArrowTranslate = new TransformGroup();
00051 TransformGroup tgArrowRotate = new TransformGroup();
00053 Cone cone;
00055 Cylinder cylinder;
00056
00064 public FittingInfo(
00065 Color3f c3fArrow,
00066 Color3f c3fSphere,
00067 boolean bInvertArrow
00068 ) {
00069
00070 Sphere[] sph = new Sphere [iNumberOfSphere];
00071 bgAddTop.setCapability(BranchGroup.ALLOW_DETACH);
00072 tgArrowTranslate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
00073 tgArrowTranslate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
00074 tgArrowTranslate.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
00075 tgArrowTranslate.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
00076 tgArrowTranslate.setCapability(
00077 TransformGroup.ALLOW_LOCAL_TO_VWORLD_READ
00078 );
00079 tgArrowRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
00080 tgArrowRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
00081 float fScaleFactor = 0.1f;
00082 Appearance spherelook = new Appearance();
00083 Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
00084 Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
00085 spherelook.setMaterial(
00086 new Material(c3fSphere, black, c3fSphere, white, 50.0f)
00087 );
00088
00089
00090 for (int i = 0 ;i < iNumberOfSphere ; i++) {
00091 sph[i] = new Sphere(0.25f * fScaleFactor, spherelook);
00092 sph[i].setPickable(false);
00093 sphTrans[i] = new TransformGroup ();
00094 sphTrans[i].setCapability (TransformGroup.ALLOW_TRANSFORM_READ);
00095 sphTrans[i].setCapability (TransformGroup.ALLOW_TRANSFORM_WRITE);
00096
00097
00098 bgAddTop.addChild (sphTrans[i]);
00099 sphTrans[i].addChild (sph[i]);
00100 }
00101
00102
00103 Appearance arrowlook = new Appearance();
00104 arrowlook.setMaterial(
00105 new Material(c3fArrow, black, c3fArrow, white, 50.0f)
00106 );
00107
00108 cone =
00109 new Cone(
00110 0.5f * fScaleFactor,
00111 1.0f * fScaleFactor,
00112 Cone.GENERATE_NORMALS,
00113 arrowlook
00114 );
00115 cone.setCapability(Primitive.ENABLE_GEOMETRY_PICKING);
00116 for (int i = Cone.BODY; i <= Cone.CAP; i ++) {
00117 PickTool.setCapabilities(cone.getShape(i), PickTool.INTERSECT_FULL);
00118 }
00119 cone.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
00120 cone.setCapability(Primitive.ALLOW_PICKABLE_READ);
00121 cone.setCapability(Primitive.ALLOW_PICKABLE_WRITE);
00122 cylinder =
00123 new Cylinder(0.2f * fScaleFactor, 2.0f * fScaleFactor, arrowlook);
00124 cylinder.setCapability(Primitive.ENABLE_GEOMETRY_PICKING);
00125 cylinder.setCapability(Primitive.ALLOW_PICKABLE_READ);
00126 cylinder.setCapability(Primitive.ALLOW_PICKABLE_WRITE);
00127 for(int i = Cylinder.BODY; i <= Cylinder.BOTTOM; i ++) {
00128 PickTool.setCapabilities(
00129 cylinder.getShape(i),
00130 PickTool.INTERSECT_FULL
00131 );
00132 }
00133 cylinder.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
00134
00135 TransformGroup tgCone = new TransformGroup();
00136 Transform3D t3dCone = new Transform3D();
00137 TransformGroup tgCylinder = new TransformGroup();
00138 Transform3D t3dCylinder = new Transform3D();
00139 t3dCone.setTranslation(new Vector3f(0.0f,1.5f * fScaleFactor,0.0f));
00140 tgCone.setTransform(t3dCone);
00141 tgCone.addChild(cone);
00142 if (bInvertArrow) {
00143 t3dCylinder.setTranslation(
00144 new Vector3f(0.0f, 2.0f * fScaleFactor, 0.0f)
00145 );
00146 t3dCylinder.setRotation(
00147 new AxisAngle4f(new Vector3f(1.0f, 0.0f, 0.0f), (float)Math.PI)
00148 );
00149 } else {
00150 t3dCylinder.setTranslation(
00151 new Vector3f(0.0f, fScaleFactor, 0.0f)
00152 );
00153 }
00154 tgCylinder.addChild(tgCone);
00155 tgCylinder.setTransform(t3dCylinder);
00156 tgCylinder.addChild(cylinder);
00157 tgArrowRotate.addChild(tgCylinder);
00158 tgArrowTranslate.addChild(tgArrowRotate);
00159 bgAddTop.addChild(tgArrowTranslate);
00160 }
00161
00166 public void addForDisplay() {
00167 if(tgFittingTarget == null) {
00168 System.err.println("物体を表示する対象の TG が設定されていません");
00169 }
00170
00171
00172 v3fNormalVW = new Vector3f();
00173 if (p3dPrimitivePoints.length >= 3) {
00174 Point3d pt1 = new Point3d();
00175 Point3d pt2 = new Point3d();
00176 pt1.sub(p3dPrimitivePoints[1],p3dPrimitivePoints[0]);
00177 pt2.sub(p3dPrimitivePoints[2],p3dPrimitivePoints[1]);
00178 Vector3f vecOne = new Vector3f(pt1);
00179 Vector3f vecTwo = new Vector3f(pt2);
00180
00181 v3fNormalVW.cross(vecOne,vecTwo);
00182 double dScale =
00183 Math.sqrt(
00184 v3fNormalVW.x * v3fNormalVW.x +
00185 v3fNormalVW.y * v3fNormalVW.y +
00186 v3fNormalVW.z * v3fNormalVW.z
00187 );
00188 v3fNormalVW.x /= dScale;
00189 v3fNormalVW.y /= dScale;
00190 v3fNormalVW.z /= dScale;
00191 }
00192
00193
00194 Transform3D t3dSph = new Transform3D();
00195 Transform3D t3dLocalToVworld = new Transform3D();
00196 Transform3D t3dCurrent = new Transform3D();
00197 this.tgFittingTarget.getLocalToVworld(t3dLocalToVworld);
00198 this.tgFittingTarget.getTransform(t3dCurrent);
00199
00200 t3dLocalToVworld.mul(t3dCurrent);
00201 t3dLocalToVworld.invert();
00202
00203 int iCoorsNum = p3dPrimitivePoints.length;
00204
00205 for (int iCount = 0; iCount < iNumberOfSphere; iCount++) {
00206 if(iCoorsNum <= iCount) {
00207 t3dSph.set(new Vector3f(p3dPrimitivePoints[iCoorsNum - 1]));
00208 } else {
00209 t3dLocalToVworld.transform(this.p3dPrimitivePoints[iCount]);
00210 t3dSph.set(new Vector3f(this.p3dPrimitivePoints[iCount]));
00211 }
00212
00213 sphTrans[iCount].setTransform(t3dSph);
00214 }
00215
00216
00217 v3fNormal = new Vector3f(this.v3fNormalVW);
00218 t3dLocalToVworld.transform(this.v3fNormal);
00219 p3fIntersect = new Point3f(this.p3fIntersectVW);
00220 t3dLocalToVworld.transform(this.p3fIntersect);
00221
00222 Transform3D t3dTranslate = new Transform3D();
00223 Transform3D t3dRotate = new Transform3D();
00224 t3dTranslate.set(new Vector3f(p3fIntersect));
00225 tgArrowTranslate.setTransform(t3dTranslate);
00226
00227
00228 Vector3f v3fLine = new Vector3f(0.0f,1.0f,0.0f);
00229 Vector3f v3fLineOther = new Vector3f(0.0f,0.0f,1.0f);
00230 Vector3f v3fCross = new Vector3f();
00231
00232 if (v3fNormal.y != -1.0f) {
00233 v3fCross.cross(v3fLine,v3fNormal);
00234 } else {
00235 v3fCross.cross(v3fLineOther,v3fNormal);
00236 }
00237 t3dRotate.set(new AxisAngle4f(v3fCross,v3fLine.angle(v3fNormal)));
00238 tgArrowRotate.setTransform(t3dRotate);
00239
00240 if (bgAddTop.isLive()) {
00241
00242
00243 for(int i= 0; i < tgFittingTargetBefore.numChildren(); i ++) {
00244 if (bgAddTop == tgFittingTargetBefore.getChild(i)) {
00245 tgFittingTargetBefore.removeChild(i);
00246 }
00247 }
00248 }
00249 bgAddTop.detach();
00250 tgFittingTarget.addChild(bgAddTop);
00251 tgFittingTargetBefore = tgFittingTarget;
00252 }
00253
00258 public void removeForDisplay() {
00259 for (int i = 0; i < tgFittingTargetBefore.numChildren(); i ++) {
00260 if(bgAddTop == tgFittingTargetBefore.getChild(i)) {
00261 tgFittingTargetBefore.removeChild(i);
00262 }
00263 }
00264 }
00265
00271 public void setPickable(boolean bPick) {
00272 this.cone.setPickable(bPick);
00273 this.cylinder.setPickable(bPick);
00274 }
00275
00281 public void setIntersectPoint(Point3f p3fIntersect) {
00282 this.p3fIntersectVW = new Point3f(p3fIntersect);
00283 }
00284
00290 public Point3f getIntersectPoint() {
00291 return this.p3fIntersectVW;
00292 }
00293
00299 public Vector3f getNormalVector() {
00300 return this.v3fNormalVW;
00301 }
00302
00308 public void setPrimitiveCoordinates(Point3d[] ptCoordinates) {
00309 this.p3dPrimitivePoints = ptCoordinates;
00310 }
00311
00317 public void setTransformGroup(TransformGroup tgFittingTarget) {
00318 this.tgFittingTarget = tgFittingTarget;
00319 }
00320
00326 public TransformGroup getTransformGroup() {
00327 return this.tgFittingTarget;
00328 }
00329
00335 public TransformGroup getArrowTransformGroup() {
00336 return this.tgArrowTranslate;
00337 }
00338 }