How to change parent of a Scenenode (detach/attach)

Problems building or running the engine, queries about how to use features etc.
Post Reply
Garibalde
Halfling
Posts: 69
Joined: Thu Apr 16, 2009 2:38 am
Location: Montreal, Quebec
x 2
Contact:

How to change parent of a Scenenode (detach/attach)

Post by Garibalde »

I am trying to remove a scenenode and to reattach it to another scenenode as a child of that node.
I thought this would be very easy to do. But I think I am missing something as only a part of the object is reattached (i.e the top node).
the child nodes just disappears.

Below is my scene loaded with "dotsceneloader"

Code: Select all

mloader.parseDotScene("Tool.scene", "General", mSceneMgr, NULL, prepend.c_str());
Here is my "Tool.scene"

Code: Select all

<scene formatVersion="1.0" upAxis="z" unitsPerMeter="100" unitType="centimeters" minOgreVersion="1.9" ogreMaxVersion="2.6.4" author="OgreMax Scene Exporter (www.ogremax.com)" application="3DS Max">
    <environment>
        <colourAmbient r="0.333333" g="0.333333" b="0.333333"/>
        <colourBackground r="0" g="0" b="0"/>
        <clipping near="0" far="100000"/>
    </environment>
    <nodes>
        <node name="Tool">
            <position x="0" y="0" z="0"/>
            <scale x="1" y="1" z="1"/>
            <rotation qx="0" qy="0" qz="0" qw="1"/>
            <entity name="Tool" castShadows="true" receiveShadows="true" meshFile="Tool.mesh">
                <subentities>
                    <subentity index="0" materialName="Tool_A_m1"/>
                    <subentity index="1" materialName="Tool_B_m1"/>
                </subentities>
            </entity>
            <node name="Tool_Roller">
                <position x="0" y="0" z="0"/>
                <scale x="1" y="1" z="1"/>
                <rotation qx="-2.45869e-007" qy="-4.47035e-008" qz="-2.16067e-007" qw="1"/>
                <entity name="Tool_Roller" castShadows="true" receiveShadows="true" meshFile="Tool_Roller.mesh">
                    <subentities>
                        <subentity index="0" materialName="Tool_A_m1"/>
                    </subentities>
                </entity>
            </node>
        </node>
    </nodes>
</scene>
After the Dotsceneloader call. I can see my Tool on the scene at the origin (0,0,0) as expected. Both parts Tool and Tool_Roller are visible.
Then when I want to switch the object to be a child of "Hand". Here si the code I use.

Code: Select all

Ogre::SceneNode* MyToolSceneNode = mSceneMgr->getSceneNode(Toolname);

//! Reassign the tool to the Hand.
Ogre::SceneNode* MyHandSceneNode = mSceneMgr->getSceneNode(ObjHitData.HitObjName);
Ogre::SceneNode* MyHandToolNode = MyHandSceneNode->createChildSceneNode();

Ogre::MovableObject* MyMoveObj = MyToolSceneNode->getAttachedObject(Toolname);
Ogre::MovableObject* MyToolMoveObj = mSceneMgr->getMovableObject(Toolname, Ogre::EntityFactory::FACTORY_TYPE_NAME);
MyToolSceneNode->removeAllChildren();
MyToolSceneNode->detachAllObjects();

MyHandToolNode->attachObject(MyToolMoveObj);
MyHandToolNode->setPosition(0.0, 0.0, 5.0);
After this only the top Tool.mesh is moved correctly.. the Tool_roller.mesh is not visible.
it seems the move does not move the complete tree of "Tool" only the top element.

How do I move all the children of tool from a scenenode to another scenenode.

Thanks
Garibalde
VIRMED Simulation Technologies Inc.
http://www.virmed.com
Lax
Hobgoblin
Posts: 583
Joined: Mon Aug 06, 2007 12:53 pm
Location: Saarland, Germany
x 50

Re: How to change parent of a Scenenode (detach/attach)

Post by Lax »

Hi,

when you re-attach a node, its position and orientation will be changed, so you need to store it before you do the re-attaching like that:

Code: Select all

Ogre::Vector3 resultPosition = node1->convertWorldToLocalPosition(node2->getPosition());
Ogre::Quaternion resultOrientation = node1->convertWorldToLocalOrientation(node2->getOrientation());

node1->getParentSceneNode()->removeChild(node2);
node1->addChild(node2);
node2->setPosition(resultPosition);
node2->setOrientation(resultOrientation);
node2->setInheritScale(false);
Regards
Lax

http://www.lukas-kalinowski.com/Homepage/?page_id=1631
Please support Second Earth Technic Base built of Lego bricks for Lego ideas: https://ideas.lego.com/projects/81b9bd1 ... b97b79be62

Garibalde
Halfling
Posts: 69
Joined: Thu Apr 16, 2009 2:38 am
Location: Montreal, Quebec
x 2
Contact:

Re: How to change parent of a Scenenode (detach/attach)

Post by Garibalde »

Thanks i was over complicating the issue with removing and detach etc..
it worked.
Garibalde
VIRMED Simulation Technologies Inc.
http://www.virmed.com
tomecki
Gnoblar
Posts: 12
Joined: Thu Mar 31, 2005 7:11 pm

Re: How to change parent of a Scenenode (detach/attach)

Post by tomecki »

Very nice advice Garibalde, but there is one thing here worth to mention.
You assumed that in initial state the child node is under root scene node. It may lead to some issues. So in general first two lines of the code should be like:

Code: Select all

Ogre::Vector3 resultPosition = node1->convertWorldToLocalPosition(node2->getPosition());
Ogre::Quaternion resultOrientation = node1->convertWorldToLocalOrientation(node2->getOrientation());
I know this is old topic, but I faced very recently errors related to what I wrote above.
Lax
Hobgoblin
Posts: 583
Joined: Mon Aug 06, 2007 12:53 pm
Location: Saarland, Germany
x 50

Re: How to change parent of a Scenenode (detach/attach)

Post by Lax »

Hi tomecki,

what is different in the code of your last post, comparing to my post? Where is the issue?

Regards
Lax

http://www.lukas-kalinowski.com/Homepage/?page_id=1631
Please support Second Earth Technic Base built of Lego bricks for Lego ideas: https://ideas.lego.com/projects/81b9bd1 ... b97b79be62

Post Reply