Okay.. forget all the previous... I finally have a clue...
Rob, thank you for being correct... yet again!
Here are the corrected methods as Rob already demonstrated.... and
thank you for the "sceneMatrix3D" now that I understand it.
public function Local3DtoGlobal3D(localVector3D:Vector3D,
o3D:Object3D):Vector3D
{
var globalVect:Vector3D;
var matrix:Matrix3D = o3D.sceneMatrix3D.clone();
globalVect = matrix.transformVector(localVector3D);
return globalVect;
}
public function Global3DtoLocal3D(GlobalVector3D:Vector3D,
o3D:Object3D):Vector3D
{
var localVect:Vector3D;
var matrix:Matrix3D = o3D.sceneMatrix3D.clone();
matrix.invert();
localVect = matrix.transformVector(GlobalVector3D);
return localVect;
}
On Nov 1, 4:55 pm, mogg <[email protected]> wrote:
> To test this I'm using an OnMouseDown event on the loaded models
> inside their ObjectContainer3D.
>
> I then place a "local" sphere in the ObjectContainer3D.
> I then place a "global" sphere in the view.scene.
>
> Here is my test code:
>
> // local sphere
> var sphr:Sphere = new Sphere(new ColorMaterial(0xFF00FF,0.5),
> 5,8,6,true);
> // global sphere
> var sphr2:Sphere = new Sphere(new ColorMaterial(0x00FF00,0.5),
> 2,8,6,true);
>
> // convert global mouse3D event to local
> var localVec3D:Vector3D = Global3DtoLocal3D(event.scenePosition,o3d);
> // convert it back again from local to global (test)
> var globalVec3D:Vector3D = Local3DtoGlobal3D(localVec3D,o3d);
>
> objcont.addChild(sphr); // (local point)
> sphr.x = localVec3D.x;
> sphr.y = localVec3D.y;
> sphr.z = localVec3D.z;
>
> _lastSphere = sphr;
> view.scene.addChild(sphr2); // green (global point)
> sphr2.x = globalVec3D.x;
> sphr2.y = globalVec3D.y;
> sphr2.z = globalVec3D.z;
>
> On Nov 1, 4:27 pm, mogg <[email protected]> wrote:
>
>
>
> > I wanted to share my Global3D to Local3D and
> > Local3D to Global3D methods I have working for Away3Dlite.
>
> > These are working perfectly for my object tree.
>
> > I'm using Away3Dlite trunk:Away3D/trunk/fp10/Away3DLite/src
>
> > These two methods do assume the following object tree.
>
> > View.scene
> > -ObjectContainer3D (non-mesh container for rotation help)
> > --Object3D (my loaded model inside the above ObjectContainer3D).
>
> > Every model I load I first add an ObjectContainer3D to the view.scene
> > and then I add my loaded model into this new ObjectContainer3D.
>
> > The purpose of the nested objects is to provide
> > "pitch","roll"...etc...
>
> > Here are the methods. (please note that I had to swap the rotationZ
> > and rotationY AXIS in the Global3DtoLocal3D method. Not sure why but
> > it is the only way I was able to get this to work (a bug maybe? or I'm
> > just way off track and it works anyway). These work well no matter how
> > I seem to rotate the Outer container or the inner model itself.
>
> > public function Local3DtoGlobal3D(localVector3D:Vector3D,
> > o3D:Object3D):Vector3D
> > {
> > var globalVect:Vector3D;
> > var parent:Object3D = o3D.parent as Object3D;
>
> > var matrix:Matrix3D = parent.transform.matrix3D.clone();
>
> > globalVect = matrix.transformVector(localVector3D);
>
> > return globalVect;
>
> > }
>
> > public function Global3DtoLocal3D(GlobalVector3D:Vector3D,
> > o3D:Object3D):Vector3D
> > {
> > var localVect:Vector3D;
> > var parent:Object3D = o3D.parent as Object3D;
> > var matrix:Matrix3D = o3D.transform.matrix3D.clone();
> > matrix.appendRotation(-o3D.rotationX,Vector3D.X_AXIS);
> > matrix.appendRotation(-o3D.rotationZ,Vector3D.Y_AXIS);
> > matrix.appendRotation(-o3D.rotationY,Vector3D.Z_AXIS);
>
> > var matrix2:Matrix3D = parent.transform.matrix3D.clone();
>
> > matrix.append(matrix2);
> > matrix.invert();
>
> > localVect = matrix.transformVector(GlobalVector3D);
>
> > return localVect;
>
> > }- Hide quoted text -
>
> > - Show quoted text -- Hide quoted text -
>
> - Show quoted text -