> Well, I didn't like that functionality. It hurt my brain. ;)
It was not in there, so it couldn't possibly hurt you :))
But It's a great idea, I'll add it to the class later on, probably in different
way, but I definitly like this option.
Fabrice
On Mar 5, 2010, at 2:07 PM, Wex wrote:
> Well, I didn't like that functionality. It hurt my brain. ;)
>
> So I've written some of my own methods for it, borrowing a little from
> what was in the Mirror class...
>
> Here are my additions if anyone else wants them:
>
>
> Addition to Object3D.as:
>
> public static const MIRROR_X:int = 1;
> public static const MIRROR_Y:int = 2;
> public static const MIRROR_Z:int = 4;
>
> /**
> * Mirrors the object about an origin
> *
> * @param _flags
> Any combination of MIRROR_X, MIRROR_Y, and
> MIRROR_Z which states which axis to mirror along
> * @param _origin [optional] The
> origin to mirror about. Defaults
> to 0,0,0
> * @param _duplicate [optional] When
> true any container objects are
> not manipulated. Instead underlying objects such as 'Mesh' physically
> duplicate their geometry in the mirrored position. Defaults to true.
> *
> */
> public function mirror(_flags:int, _origin:Number3D = null,
> _duplicate:Boolean = true):void
> {
> if (!_duplicate)
> {
> if (_origin == null)
> {
> _origin = new Number3D();
> }
>
> if ((_flags & MIRROR_X) != 0)
> {
> _transform.tx = -_transform.tx +
> ((_origin.x - _transform.tx));
> }
>
> if ((_flags & MIRROR_Y) != 0)
> {
> _transform.ty = -_transform.ty +
> ((_origin.y - _transform.ty));
> }
>
> if ((_flags & MIRROR_Z) != 0)
> {
> _transform.tz = -_transform.tz +
> ((_origin.z - _transform.tz));
> }
> }
> }
>
>
> Addition to ObjectContainer3D.as:
>
> public override function mirror(_flags:int, _origin:Number3D =
> null,
> _duplicate:Boolean = true):void
> {
> for each (var child:Object3D in _children)
> {
> child.mirror(_flags, _origin, _duplicate);
> }
> super.mirror(_flags, _origin, _duplicate);
> }
>
>
> Addition to Mesh.as:
>
> public override function mirror(_flags:int, _origin:Number3D =
> null,
> _duplicate:Boolean = true):void
> {
> var aFaces:Array = faces;
> var facecount:int = aFaces.length;
> var face:Face;
>
> var va:Vertex;
> var vb:Vertex;
> var vc:Vertex;
>
> var v0:Vertex;
> var v1:Vertex;
> var v2:Vertex;
>
> var uvTemp:UV;
>
> var offset:Number3D;
>
> var vax:Number = 0;
> var vbx:Number = 0;
> var vcx:Number = 0;
> var vay:Number = 0;
> var vby:Number = 0;
> var vcy:Number = 0;
> var vaz:Number = 0;
> var vbz:Number = 0;
> var vcz:Number = 0;
>
> var flipNormals:Boolean = false;
>
> if (_duplicate)
> {
> if (_origin == null)
> {
> _origin = new Number3D();
> }
> var pos:Number3D = scenePosition;
> offset = new Number3D((_origin.x - pos.x) * 2,
> (_origin.y - pos.y)
> * 2, (_origin.z - pos.z) * 2);
> }
>
> for (var i:int = 0; i < facecount; i++)
> {
> flipNormals = false;
> face = aFaces[i];
>
> va = face._v0;
> vb = face._v1;
> vc = face._v2;
>
> if (_duplicate)
> {
> if ((_flags & MIRROR_X) != 0)
> {
> vax = -va.x + offset.x;
> vbx = -vb.x + offset.x;
> vcx = -vc.x + offset.x;
> flipNormals = !flipNormals;
> }
> else
> {
> vax = va.x;
> vbx = vb.x;
> vcx = vc.x;
> }
>
> if ((_flags & MIRROR_Y) != 0)
> {
> vay = -va.y + offset.y;
> vby = -vb.y + offset.y;
> vcy = -vc.y + offset.y;
> flipNormals = !flipNormals;
> }
> else
> {
> vay = va.y;
> vby = vb.y;
> vcy = vc.y;
> }
>
> if ((_flags & MIRROR_Z) != 0)
> {
> vaz = -va.z + offset.z;
> vbz = -vb.z + offset.z;
> vcz = -vc.z + offset.z;
> flipNormals = !flipNormals;
> }
> else
> {
> vaz = va.z;
> vbz = vb.z;
> vcz = vc.z;
> }
>
> v0 = new Vertex( vax, vay, vaz);
> v1 = new Vertex( vbx, vby, vbz);
> v2 = new Vertex( vcx, vcy, vcz);
>
> if (flipNormals)
> {
> addFace(new Face(v1, v0, v2,
> face.material, face.uv1, face.uv0,
> face.uv2 ) );
> }
> else
> {
> addFace(new Face(v0, v1, v2,
> face.material, face.uv0, face.uv1,
> face.uv2 ) );
> }
> }
> else
> {
> if ((_flags & MIRROR_X) != 0)
> {
> vax = -va.x;
> vbx = -vb.x;
> vcx = -vc.x;
> flipNormals = !flipNormals;
> }
> else
> {
> vax = va.x;
> vbx = vb.x;
> vcx = vc.x;
> }
>
> if ((_flags & MIRROR_Y) != 0)
> {
> vay = -va.y;
> vby = -vb.y;
> vcy = -vc.y;
> flipNormals = !flipNormals;
> }
> else
> {
> vay = va.y;
> vby = vb.y;
> vcy = vc.y;
> }
>
> if ((_flags & MIRROR_Z) != 0)
> {
> vaz = -va.z;
> vbz = -vb.z;
> vcz = -vc.z;
> flipNormals = !flipNormals;
> }
> else
> {
> vaz = va.z;
> vbz = vb.z;
> vcz = vc.z;
> }
>
> v0 = new Vertex( vax, vay, vaz);
> v1 = new Vertex( vbx, vby, vbz);
> v2 = new Vertex( vcx, vcy, vcz);
>
> // perhaps have a mirror method in face
> as well
> if (flipNormals)
> {
> face.v0 = v1;
> face.v1 = v0;
> face.v2 = v2;
>
> uvTemp = face.uv0;
> face.uv0 = face.uv1;
> face.uv1 = uvTemp;
> }
> else
> {
> face.v0 = v0;
> face.v1 = v1;
> face.v2 = v2;
> }
> }
> }
>
> super.mirror(_flags, _origin, _duplicate);
> }
>
>
> The usage is pretty simple:
>
> // X Mirror about the origin
> myObject.mirror(Object3D.MIRROR_X);
>
> // Y Mirror about 0,30,0
> myObject.mirror(Object3D.MIRROR_Y, new Number3D(0, 30, 0));
>
> // X and Z Mirror about 10,0,10
> myObject.mirror(Object3D.MIRROR_X | Object3D.MIRROR_Z, new
> Number3D(10, 0, 10));
>
> // X Mirror about 20,0,0 with no duplication
> myObject.mirror(Object3D.MIRROR_X, new Number3D(20, 0, 0),
> false);
>
>
> It's recursive and seems to work on any containers, loaded meshes, and
> primitives. Having it work on a specified origin also allows for
> greater flexibility. I don't mean to state that the Mirror class is
> wrong; it just didn't exhibit the behaviour I expected.
>
> Hope this helps someone else out too.
>
> -Wex
>
> On Mar 4, 3:54 pm, Fabrice3D <[email protected]> wrote:
>> these example is exact in terms of functionality
>> x+ will test the outmost maxX fopund as offset for the mirror, same nut
>> reversed for x-
>>
>> using mirror x is also correct, but that doesn't mean your model is.
>> let me explain: if you plan for instance to mirror on x, at 0,0,0
>> then because model will be exactly mirrored at that point, it means that
>> your model should be excenter in your modeler so that x 0 is at side of your
>> model.
>> plus , if you do not set the mirror mesh duplicate to false, you will get an
>> additive result. the mirrored part become part of the original model.
>>
>> your "i" comfirms the above, by looking at the shared space at the base
>> 0,0,0 of the geometry.
>>
>> play around with the settings in Prefab, it's not having the unique mesh
>> option there yet, but you should be able to test
>>
>> Fabrice
>>
>> On Mar 4, 2010, at 4:29 PM, Wex wrote:
>>
>>> Okay, some Mirror testing; this is the scene creation code:
>>
>>> private function buildMirrorTest():void
>>> {
>>> var mat:ShadingColorMaterial = new
>>> ShadingColorMaterial(0xFFFF00);
>>> var sphere:Sphere = new Sphere( { radius:4, material:mat
>>> } );
>>> m_view.scene.addChild(sphere);
>>
>>> mesh = Max3DS.load("axis.3DS");
>>> mesh.addOnSuccess(flip);
>>> m_view.scene.addChild(mesh);
>>> }
>>
>>> private function flip(_event:Loader3DEvent):void
>>> {
>>> var cube:LoaderCube = _event.target as LoaderCube;
>>
>>> cube.handle.x = 0;
>>> cube.handle.y = 0;
>>> cube.handle.z = 0;
>>> }
>>
>>> This just loads a basic multiple-mesh model as seen here:
>>> http://www.creativenorth.co.uk/post-content/away003.png
>>
>>> There are 4 meshes in this model, one for the main three bars and one
>>> each for the three end-cubes. All have the same material applied.
>>
>>> If I then apply a Mirror be making the following change:
>>
>>> private function flip(_event:Loader3DEvent):void
>>> {
>>> var cube:LoaderCube = _event.target as LoaderCube;
>>
>>> cube.handle.x = 0;
>>> cube.handle.y = 0;
>>> cube.handle.z = 0;
>>
>>> Mirror.apply(cube.handle, "x", true, true);
>>> }
>>
>>> I get the correct, expected, result:
>>> http://www.creativenorth.co.uk/post-content/away004.png
>>
>>> However using either x+ or x- gives the following respectivly:
>>> http://www.creativenorth.co.uk/post-content/away005.png
>>> http://www.creativenorth.co.uk/post-content/away006.png
>>
>>> In addition; if I do:
>>> cube.handle.x = -40;
>>> Mirror.apply(cube.handle, "x", true, true);
>>
>>> It should mirror about the world origin, but I get (yellow sphere is
>>> at 0,0,0):
>>> http://www.creativenorth.co.uk/post-content/away007.png
>>
>>> It's worth noting that the same results are seen if the Mirror's
>>> recenter parameter is set to be false.
>>
>>> -Wex
>>
>>> On Mar 4, 1:16 pm, Fabrice3D <[email protected]> wrote:
>>>> Mirror with prop "x", if the model is at 0,0,0 AND recentered AND
>>>> duplicate mesh is false, will perfectly mirror.
>>>> The class doesn't recenter the mesh for you, simply because you might no
>>>> want it to do it.
>>
>>>> Fabrice
>>
>>>> On Mar 4, 2010, at 1:44 PM, Wex wrote:
>>
>>>>> Indeed, after further debugging I determined that it was Mirroring the
>>>>> LoaderCube and not the final mesh.
>>
>>>>> I've added an event handler via addOnSuccess() and now I manage to
>>>>> flip the right mesh. Not 100% about how it's flipping right now as it
>>>>> doesn't seem to flip about the world origin and the +/- options don't
>>>>> seem to do the right thing as I would expect. However, I'll do some
>>>>> more looking into the issue before making a formal query about it.
>>
>>>>> Thanks for the help.
>>
>>>>> -Wex
>>
>>>>> On Mar 4, 12:18 pm, Fabrice3D <[email protected]> wrote:
>>>>>> then you do not target the right mesh...
>>>>>> Drop your model in Prefab, select your mesh and open mirror panel..
>>>>>> just to see whats happening...
>>
>>>>>> Fabrice
>>
>>>>>> On Mar 4, 2010, at 1:03 PM, Wex wrote:
>>
>>>>>>> Cheers for replying. I've tried all the flips. Just done x+ and x-
>>>>>>> again to be sure; still nothing.
>>
>>>>>>> Also, the object isn't at 0,0,0. I move it as shown in the posted
>>>>>>> code.
>>
>>>>>>> -Wex
>>
>>>>>>> On Mar 4, 11:23 am, Fabrice3D <[email protected]> wrote:
>>>>>>>> it might do it, but no being obvious... especially if your model is at
>>>>>>>> 0,0,0 and symetrical
>>>>>>>> try x+ or x- just to see.
>>
>>>>>>>> Fabrice
>>
>>>>>>>> On Mar 4, 2010, at 12:08 PM, Wex wrote:
>>
>>>>>>>>> Been banging my head against this for a few hours now... for some
>>>>>>>>> reason when I mirror a mesh loaded from a 3DS file, it doesn't do
>>>>>>>>> anything. Here's the code I'm testing with:
>>
>>>>>>>>> var mat:ShadingColorMaterial = new ShadingColorMaterial(0x00FF00);
>>>>>>>>> var sphere:Sphere = new Sphere( { material:mat, segmentsH:6,
>>>>>>>>> segmentsW:6, radius:10 } );
>>>>>>>>> sphere.x = -20;
>>>>>>>>> sphere.z = -200;
>>>>>>>>> m_view.scene.addChild(sphere);
>>>>>>>>> Mirror.apply(sphere, "x");
>>
>>>>>>>>> var mesh:Loader3D = Max3DS.load("wall.3DS");
>>>>>>>>> mesh.x = -20;
>>>>>>>>> mesh.z = -200;
>>>>>>>>> m_view.scene.addChild(mesh);
>>>>>>>>> Mirror.apply(mesh, "x");
>>
>>>>>>>>> The sphere mirrors wonderfully, but the 3DS just shows up as normal.
>>>>>>>>> I've dumped a load of trace-ouputs in Mirror.as to see if it's doing
>>>>>>>>> anything, and it does reach the obj.addFace call; all the verts seem
>>>>>>>>> to be mirrored as expected... so I'm at a loss at to what's going on.
>>
>>>>>>>>> I'm running v3.4.0 of Away.
>>
>>>>>>>>> Any ideas?