SoTransform(3)

πŸ“¦ version 2.5.0, in fedora 43, fedora 44

SoTransform(3) πŸ’– Library Functions Manual

okay bestie, sit down, hydrate, and let me tell you about SoTransform β€” the man page is literally called SoTransform(3) and it lives in the Library Functions Manual. it's long, it's iconic, and we're doing it in parts. part 1 starts now, no skips, we eat the whole plate. πŸ“


✨ NAME ✨

SoTransform β€” the SoTransform class is the "all-purpose" transformation node type. the moment. the blueprint. the "i can be anything you need" of nodes. πŸ’…


πŸŽ€ SYNOPSIS πŸŽ€

the vibe check, in code form:

#include <Inventor/nodes/SoTransform.h>

Inherits SoTransformation.

Inherited by SoTransformManip.

🌸 Public Member Functions 🌸

  • virtual SoType getTypeId (void) const
  • SoTransform (void)
  • void pointAt (const SbVec3f &frompoint, const SbVec3f &topoint)
  • void getScaleSpaceMatrix (SbMatrix &mat, SbMatrix &inv) const
  • void getRotationSpaceMatrix (SbMatrix &mat, SbMatrix &inv) const
  • void getTranslationSpaceMatrix (SbMatrix &mat, SbMatrix &inv) const
  • void multLeft (const SbMatrix &mat)
  • void multRight (const SbMatrix &mat)
  • void combineLeft (SoTransformation *nodeonright)
  • void combineRight (SoTransformation *nodeonleft)
  • void setMatrix (const SbMatrix &mat)
  • void recenter (const SbVec3f &newcenter)
  • virtual void doAction (SoAction *action)
  • virtual void GLRender (SoGLRenderAction *action)
  • virtual void callback (SoCallbackAction *action)
  • virtual void getBoundingBox (SoGetBoundingBoxAction *action)
  • virtual void getMatrix (SoGetMatrixAction *action)
  • virtual void pick (SoPickAction *action)
  • virtual void getPrimitiveCount (SoGetPrimitiveCountAction *action)

πŸ’œ Public Member Functions inherited from SoNode πŸ’œ

  • void setOverride (const SbBool state)
  • SbBool isOverride (void) const
  • void setNodeType (const NodeType type)
  • NodeType getNodeType (void) const
  • virtual SoNode * copy (SbBool copyconnections=0) const
  • virtual SbBool affectsState (void) const
  • virtual void GLRenderBelowPath (SoGLRenderAction *action)
  • virtual void GLRenderInPath (SoGLRenderAction *action)
  • virtual void GLRenderOffPath (SoGLRenderAction *action)
  • virtual void handleEvent (SoHandleEventAction *action)
  • virtual void rayPick (SoRayPickAction *action)
  • virtual void search (SoSearchAction *action)
  • virtual void write (SoWriteAction *action)
  • virtual void audioRender (SoAudioRenderAction *action)
  • virtual void grabEventsSetup (void)
  • virtual void grabEventsCleanup (void)
  • virtual void startNotify (void)
  • virtual void notify (SoNotList *l)
  • uint32_t getNodeId (void) const
  • virtual SoChildList * getChildren (void) const
  • virtual void writeInstance (SoOutput *out)
  • virtual SoNode * addToCopyDict (void) const
  • virtual void copyContents (const SoFieldContainer *from, SbBool copyconnections)
  • virtual SoFieldContainer * copyThroughConnection (void) const

πŸ¦‹ Public Member Functions inherited from SoFieldContainer πŸ¦‹

  • void setToDefaults (void)
  • SbBool hasDefaultValues (void) const
  • SbBool fieldsAreEqual (const SoFieldContainer *container) const
  • void copyFieldValues (const SoFieldContainer *container, SbBool copyconnections=0)
  • SbBool set (const char *const fielddata)
  • void get (SbString &fielddata)
  • virtual int getFields (SoFieldList &l) const
  • virtual int getAllFields (SoFieldList &l) const
  • virtual SoField * getField (const SbName &name) const
  • virtual SoField * getEventIn (const SbName &name) const
  • virtual SoField * getEventOut (const SbName &name) const
  • SbBool getFieldName (const SoField *const field, SbName &name) const
  • SbBool enableNotify (const SbBool flag)
  • SbBool isNotifyEnabled (void) const
  • SbBool set (const char *fielddata, SoInput *in)
  • void get (SbString &fielddata, SoOutput *out)
  • virtual SbBool validateNewFieldValue (SoField *field, void *newval)
  • virtual void addWriteReference (SoOutput *out, SbBool isfromfield=0)
  • SbBool getIsBuiltIn (void) const
  • void setUserData (void *userdata) const
  • void * getUserData (void) const

🫢 Public Member Functions inherited from SoBase 🫢

  • void ref (void) const
  • void unref (void) const
  • void unrefNoDelete (void) const
  • int32_t getRefCount (void) const
  • void touch (void)
  • SbBool isOfType (SoType type) const
  • virtual SbName getName (void) const
  • virtual void setName (const SbName &newname)
  • void addAuditor (void *const auditor, const SoNotRec::Type type)
  • void removeAuditor (void *const auditor, const SoNotRec::Type type)
  • const SoAuditorList & getAuditors (void) const
  • SbBool shouldWrite (void)
  • void assertAlive (void) const

⭐ Static Public Member Functions ⭐

  • static SoType getClassTypeId (void)
  • static void initClass (void)

🌈 Static Public Member Functions inherited from SoTransformation 🌈

  • static SoType getClassTypeId (void)
  • static void initClass (void)

🌈 Static Public Member Functions inherited from SoNode 🌈

  • static uint32_t getCompatibilityTypes (const SoType &nodetype)
  • static SoType getClassTypeId (void)
  • static SoNode * getByName (const SbName &name)
  • static int getByName (const SbName &name, SoNodeList &l)
  • static void initClass (void)
  • static void initClasses (void)
  • static uint32_t getNextNodeId (void)
  • static int getActionMethodIndex (const SoType type)
  • static void getBoundingBoxS (SoAction *action, SoNode *node)
  • static void GLRenderS (SoAction *action, SoNode *node)
  • static void callbackS (SoAction *action, SoNode *node)
  • static void getMatrixS (SoAction *action, SoNode *node)
  • static void handleEventS (SoAction *action, SoNode *node)
  • static void pickS (SoAction *action, SoNode *node)
  • static void rayPickS (SoAction *action, SoNode *node)
  • static void searchS (SoAction *action, SoNode *node)
  • static void writeS (SoAction *action, SoNode *node)
  • static void audioRenderS (SoAction *action, SoNode *node)
  • static void getPrimitiveCountS (SoAction *action, SoNode *node)

🌈 Static Public Member Functions inherited from SoFieldContainer 🌈

  • static void initClass (void)
  • static SoType getClassTypeId (void)
  • static void initCopyDict (void)
  • static void addCopy (const SoFieldContainer *orig, const SoFieldContainer *copy)
  • static SoFieldContainer * checkCopy (const SoFieldContainer *orig)
  • static SoFieldContainer * findCopy (const SoFieldContainer *orig, const SbBool copyconnections)
  • static void copyDone (void)

🌈 Static Public Member Functions inherited from SoBase 🌈

  • static void initClass (void)
  • static SoType getClassTypeId (void)
  • static void addName (SoBase *const base, const char *const name)
  • static void removeName (SoBase *const base, const char *const name)
  • static void incrementCurrentWriteCounter (void)
  • static void decrementCurrentWriteCounter (void)
  • static SoBase * getNamedBase (const SbName &name, SoType type)
  • static int getNamedBases (const SbName &name, SoBaseList &baselist, SoType type)
  • static SbBool read (SoInput *in, SoBase *&base, SoType expectedtype)
  • static void setInstancePrefix (const SbString &c)
  • static void setTraceRefs (SbBool trace)
  • static SbBool getTraceRefs (void)
  • static SbBool connectRoute (SoInput *in, const SbName &fromnodename, const SbName &fromfieldname, const SbName &tonodename, const SbName &tofieldname)
  • static SbBool readRoute (SoInput *in)

πŸ‘‘ Public Attributes πŸ‘‘

  • SoSFVec3f translation
  • SoSFRotation rotation
  • SoSFVec3f scaleFactor
  • SoSFRotation scaleOrientation
  • SoSFVec3f center

🧚 Protected Member Functions 🧚

  • virtual const SoFieldData * getFieldData (void) const
  • virtual ~SoTransform ()

πŸ’« Protected Member Functions inherited from SoTransformation πŸ’«

  • SoTransformation (void)
  • virtual ~SoTransformation ()

πŸ’« Protected Member Functions inherited from SoNode πŸ’«

  • SoNode (void)
  • virtual ~SoNode ()
  • virtual SbBool readInstance (SoInput *in, unsigned short flags)

πŸ’« Protected Member Functions inherited from SoFieldContainer πŸ’«

  • SoFieldContainer (void)
  • ~SoFieldContainer ()

πŸ’« Protected Member Functions inherited from SoBase πŸ’«

  • SoBase (void)
  • virtual ~SoBase ()
  • virtual void destroy (void)
  • SbBool hasMultipleWriteRefs (void) const
  • SbBool writeHeader (SoOutput *out, SbBool isgroup, SbBool isengine) const
  • void writeFooter (SoOutput *out) const
  • virtual const char * getFileFormatName (void) const

🌟 Static Protected Member Functions 🌟

  • static const SoFieldData ** getFieldDataPtr (void)

🌸 Static Protected Member Functions inherited from SoTransformation 🌸

  • static const SoFieldData ** getFieldDataPtr (void)

🌸 Static Protected Member Functions inherited from SoNode 🌸

  • static const SoFieldData ** getFieldDataPtr (void)
  • static void setNextActionMethodIndex (int index)
  • static int getNextActionMethodIndex (void)
  • static void incNextActionMethodIndex (void)
  • static void setCompatibilityTypes (const SoType &nodetype, const uint32_t bitmask)

🌸 Static Protected Member Functions inherited from SoBase 🌸

  • static uint32_t getCurrentWriteCounter (void)
  • static void staticDataLock (void)
  • static void staticDataUnlock (void)

πŸŽ€ Additional Inherited Members πŸŽ€

🌷 Public Types inherited from SoNode 🌷

enum NodeType { INVENTOR = 0x0000, VRML1 = 0x0001, VRML2 = 0x0002,
    INVENTOR_1 = 0x0004, INVENTOR_2_0 = 0x0008, INVENTOR_2_1 = 0x0010,
    INVENTOR_2_5 = 0x0020, INVENTOR_2_6 = 0x0040, COIN_1_0 = 0x0080,
    COIN_2_0 = 0x0100, EXTENSION = 0x0200, COIN_2_2 = 0x0400, COIN_2_3 =
    0x0800, COIN_2_4 = 0x1000, INVENTOR_5_0 = 0x2000, COIN_2_5 = 0x4000
}

🌷 Protected Types inherited from SoBase 🌷

enum BaseFlags { IS_ENGINE = 0x01, IS_GROUP = 0x02 }

🌷 Protected Attributes inherited from SoNode 🌷

  • uint32_t uniqueId

🌷 Protected Attributes inherited from SoFieldContainer 🌷

  • SbBool isBuiltIn

🌷 Static Protected Attributes inherited from SoNode 🌷

  • static uint32_t nextUniqueId = 0
  • static int nextActionMethodIndex = 0

πŸ’– Detailed Description πŸ’–

the SoTransform class is the "all-purpose" transformation node type. periodt.

like SoMatrixTransform, nodes of this type give the application programmer maximum flexibility when specifying geometry transformations in a scene graph. so like, the power is in your hands, bestie. ✨

but β€” and this is the tea β€” if you want to set and keep the various components of the transformation matrix in separate entities, this node type is preferable. lowkey that's the whole reason it exists. 🫢

the order of operations is: first scaling is done, then rotation, then translation. in that order, no swapping, that's the sequence and it's non-negotiable. 🌈

🌸 FILE FORMAT/DEFAULTS: 🌸

Transform {
    translation 0 0 0
    rotation 0 0 1  0
    scaleFactor 1 1 1
    scaleOrientation 0 0 1  0
    center 0 0 0
}

that's the default glow-up, straight out of the box. πŸ’…


πŸ¦‹ Constructor & Destructor Documentation πŸ¦‹

πŸ’œ SoTransform::SoTransform (void ) πŸ’œ

Constructor. it makes the node. that's it, that's the function, and it's doing great. 😌

References center, rotation, scaleFactor, scaleOrientation, SoTransform(), and translation.

Referenced by getFieldData(), SoTransformManip::replaceManip(), SoTransformManip::replaceNode(), SoTransform(), and SoTransformManip::transferFieldValues().

πŸ’œ SoTransform::~SoTransform () [protected], [virtual] πŸ’œ

Destructor. it cleans up after the node. protected, so it's giving "only my inner circle gets to call me" energy. πŸ™ˆ


okay that's part 1 done and we are SO not finished β€” there's more where this came from, bestie, don't go anywhere πŸ’–

✨ Member Function Documentation ✨


πŸ’… SoType SoTransform::getTypeId (void ) const [virtual]

Okay so this one hands you back the type identification of any object that's derived from a class inheriting SoBase. It's the whole reason run-time type checking and "downward" casting work at all. Bestie, it's giving detective energy πŸ” β€” it's literally how you figure out what you're actually holding.

Usage example, and yes it's iconic:

void foo(SoNode * node)
{
  if (node->getTypeId() == SoFile::getClassTypeId()) {
    SoFile * filenode = (SoFile *)node;  // safe downward cast, knows the type
  }
  else if (node->getTypeId().isOfType(SoGroup::getClassTypeId())) {
    SoGroup * group = (SoGroup *)node;  // safe downward cast, knows the type
  }
}

Now, for all the application programmers out there who wanna extend the library with new nodes, engines, nodekits, draggers or others β€” heads up 🫢 β€” this method needs to be overridden in all subclasses. That's typically done as part of setting up the full type system for extension classes, which is usually accomplished by using the pre-defined macros available through for instance Inventor/nodes/SoSubNode.h (SO_NODE_INIT_CLASS and SO_NODE_CONSTRUCTOR for node classes), Inventor/engines/SoSubEngine.h (for engine classes) and so on. Periodt.

Want more tea on writing Coin extensions? Go check the class documentation of the toplevel superclasses for the various class groups. πŸ“š

  • Reimplemented from SoTransformation.
  • Reimplemented in SoCenterballManip, SoHandleBoxManip, SoJackManip, SoTabBoxManip, SoTrackballManip, SoTransformBoxManip, SoTransformerManip, and SoTransformManip.

πŸ¦‹ const SoFieldData * SoTransform::getFieldData (void ) const [protected], [virtual]

Returns a pointer to the class-wide field data storage object for this instance. And if there are no fields present? It returns NULL. That's it, that's the whole vibe. πŸ™ˆ

  • Reimplemented from SoTransformation.
  • Reimplemented in SoCenterballManip, SoHandleBoxManip, SoJackManip, SoTabBoxManip, SoTrackballManip, SoTransformBoxManip, SoTransformerManip, and SoTransformManip.
  • References SoTransform().

🌸 void SoTransform::pointAt (const SbVec3f & frompoint, const SbVec3f & topoint)

Sets the transformation to translate to frompoint, with a rotation so that the (0,0,-1) vector gets rotated into the vector going from frompoint to topoint. It's literally pointing at things, main character behavior 🎯.

  • References center, SbVec3f::normalize(), SoDebugError::postWarning(), rotation, scaleFactor, scaleOrientation, and translation.

πŸ’œ void SoTransform::getScaleSpaceMatrix (SbMatrix & mat, SbMatrix & inv) const

Calculates the matrices to/from scale space. Matrices going both ways, we love a two-way street ✨.

  • References center, SbMatrix::inverse(), SbMatrix::multRight(), scaleFactor, scaleOrientation, SbMatrix::setRotate(), SbMatrix::setScale(), and SbMatrix::setTranslate().

🌈 void SoTransform::getRotationSpaceMatrix (SbMatrix & mat, SbMatrix & inv) const

Calculates the matrices to/from rotation space. Spinning around, literally πŸ’«.

  • References center, SbMatrix::inverse(), SbMatrix::multRight(), rotation, scaleFactor, scaleOrientation, SbMatrix::setRotate(), SbMatrix::setScale(), and SbMatrix::setTranslate().

⭐ void SoTransform::getTranslationSpaceMatrix (SbMatrix & mat, SbMatrix & inv) const

Calculates the matrices to/from translation space. Movement, but make it math πŸ“.

  • References center, SbMatrix::inverse(), SbMatrix::multRight(), rotation, scaleFactor, scaleOrientation, SbMatrix::setRotate(), SbMatrix::setScale(), SbMatrix::setTranslate(), and translation.

πŸŽ€ void SoTransform::multLeft (const SbMatrix & mat)

Premultiplies this transformation by mat. Left side supremacy, no cap πŸ’….

  • References SbMatrix::multLeft(), setMatrix(), SbMatrix::setTransform(), and translation.
  • Referenced by combineLeft().

πŸ“ void SoTransform::multRight (const SbMatrix & mat)

Postmultiplies this transformation by mat. Right side, equally iconic 🌸.

  • References SbMatrix::multRight(), setMatrix(), SbMatrix::setTransform(), and translation.
  • Referenced by combineRight().

🧚 void SoTransform::combineLeft (SoTransformation * nodeonright)

Premultiplies this transformation by the transformation in nodeonright. Yes, the parameter is called nodeonright and it's doing a left combine β€” we don't make the rules, bestie 😭.

  • References SoAction::apply(), SoGetMatrixAction::getMatrix(), multLeft(), and SoTransformation::SoTransformation().

πŸ’– void SoTransform::combineRight (SoTransformation * nodeonleft)

Postmultiplies this transformation by the transformation in nodeonleft. Same energy, mirrored πŸͺž.

  • References SoAction::apply(), SoGetMatrixAction::getMatrix(), multRight(), and SoTransformation::SoTransformation().

πŸ”₯ void SoTransform::setMatrix (const SbMatrix & mat)

Sets the fields to create a transformation equal to mat. One matrix in, whole field glow-up out ✨.

  • References center, SbMatrix::getTransform(), rotation, scaleFactor, scaleOrientation, and translation.
  • Referenced by multLeft(), and multRight().

🌷 void SoTransform::recenter (const SbVec3f & newcenter)

Sets the center field to newcenter. And oop β€” this might affect one or more of the other fields. Not me changing one thing and shaking the whole table πŸ™ˆ.

  • References center, SbMatrix::getTransform(), rotation, scaleFactor, scaleOrientation, SbMatrix::setTransform(), and translation.

πŸ‘‘ void SoTransform::doAction (SoAction * action) [virtual]

This function performs the typical operation of a node for any action. The generalist. The people's champ. πŸ’…

  • Reimplemented from SoNode.
  • Reimplemented in SoTransformManip.
  • References SoAction::getState(), SbMatrix::setTransform(), and translation.
  • Referenced by callback(), getBoundingBox(), getPrimitiveCount(), GLRender(), and pick().

🌟 void SoTransform::GLRender (SoGLRenderAction * action) [virtual]

Action method for the SoGLRenderAction. This gets called during rendering traversals. Any node influencing the rendering state in any way, or who wants to throw geometry primitives at OpenGL, overrides this method. Throwing primitives at OpenGL is such a mood 🎨.

  • Reimplemented from SoNode.
  • Reimplemented in SoTransformManip.
  • References doAction().
  • Referenced by SoTransformManip::GLRender().

🫢 void SoTransform::callback (SoCallbackAction * action) [virtual]

Action method for SoCallbackAction. It simply updates the state according to how the node behaves for the render action, so the application programmer can use the SoCallbackAction for extracting information about the scene graph. Very informative, very demure πŸŽ€.

  • Reimplemented from SoNode.
  • Reimplemented in SoTransformManip.
  • References doAction().
  • Referenced by SoTransformManip::callback().

πŸ¦„ void SoTransform::getBoundingBox (SoGetBoundingBoxAction * action) [virtual]

Action method for the SoGetBoundingBoxAction. It calculates bounding box and center coordinates for the node, then modifies the values of the action to encompass the bounding box for this node and to shift the center point for the scene more towards the one for this node. It's giving "make room, this node is important" πŸ“¦βœ¨.

Nodes influencing how geometry nodes calculate their bounding box also override this method to change the relevant state variables.

  • Reimplemented from SoNode.
  • Reimplemented in SoTransformManip.
  • References doAction().
  • Referenced by SoTransformManip::getBoundingBox().

πŸ’« void SoTransform::getMatrix (SoGetMatrixAction * action) [virtual]

Action method for SoGetMatrixAction. It updates action by accumulating with the transformation matrix of this node (if any). Accumulating, we love a little build-up πŸ’œ.

  • Reimplemented from SoNode.
  • Reimplemented in SoTransformManip.
  • References SoGetMatrixAction::getInverse(), SoGetMatrixAction::getMatrix(), SbMatrix::inverse(), SbMatrix::multLeft(), SbMatrix::multRight(), SbMatrix::setTransform(), and translation.
  • Referenced by SoTransformManip::getMatrix().

🎯 void SoTransform::pick (SoPickAction * action) [virtual]

Action method for SoPickAction. Does common processing for SoPickAction action instances. Just doing the common processing, humble of it 🌸.

  • Reimplemented from SoNode.
  • Reimplemented in SoTransformManip.
  • References doAction().
  • Referenced by SoTransformManip::pick().

πŸ”’ void SoTransform::getPrimitiveCount (SoGetPrimitiveCountAction * action) [virtual]

Action method for the SoGetPrimitiveCountAction. It calculates the number of triangle, line segment and point primitives for the node and adds these to the counters of the action. Counting triangles like a lil accountant πŸ”Ί.

Nodes influencing how geometry nodes calculate their primitive count also override this method to change the relevant state variables.

  • Reimplemented from SoNode.
  • References doAction().

πŸ’– Member Data Documentation πŸ’–


🌸 SoSFVec3f SoTransform::translation

The translation part of the transformation. Where the thing actually is πŸ“.

  • Referenced by SoTransformManip::attachSensors(), doAction(), SoTransformManip::fieldSensorCB(), getMatrix(), getTranslationSpaceMatrix(), multLeft(), multRight(), pointAt(), recenter(), setMatrix(), SoTransform(), SoTransformManip::transferFieldValues(), and SoTransformManip::valueChangedCB().

πŸŒ€ SoSFRotation SoTransform::rotation

The rotation part of the transformation. The spin, the twirl, the moment πŸ’«.

⚠️ Bestie, listen β€” there is one very common mistake that's easy to make when setting the value of a SoSFRotation field, and that's inadvertently using the wrong SbRotation constructor. This example should clarify the problem:
mytransformnode->rotation.setValue(0, 0, 1, 1.5707963f);

So the programmer clearly tries to set a PI/2 rotation around the Z axis, but this will fail, as the SbRotation constructor invoked above is the one that takes as arguments the 4 floats of a quaternion. What the programmer almost certainly wanted to do was to use the SbRotation constructor that takes a rotation vector and a rotation angle, which is invoked like this:

mytransformnode->rotation.setValue(SbVec3f(0, 0, 1), 1.5707963f);
  • Referenced by SoTransformManip::attachSensors(), SoTransformManip::fieldSensorCB(), getRotationSpaceMatrix(), getTranslationSpaceMatrix(), pointAt(), recenter(), setMatrix(), SoTransform(), SoTransformManip::transferFieldValues(), and SoTransformManip::valueChangedCB().

πŸ“ SoSFVec3f SoTransform::scaleFactor

The scaling part of the transformation. Big or small, it's a vibe either way πŸ“.

  • Referenced by SoTransformManip::attachSensors(), SoTransformManip::fieldSensorCB(), getRotationSpaceMatrix(), getScaleSpaceMatrix(), getTranslationSpaceMatrix(), pointAt(), recenter(), setMatrix(), SoTransform(), SoTransformManip::transferFieldValues(), and SoTransformManip::valueChangedCB().

🧭 SoSFRotation SoTransform::scaleOrientation

The orientation the object is set to before scaling. Pre-scaling pose, a little pre-game if you will ✨.

  • Referenced by SoTransformManip::attachSensors(), SoTransformManip::fieldSensorCB(), getRotationSpaceMatrix(), getScaleSpaceMatrix(), getTranslationSpaceMatrix(), pointAt(), recenter(), setMatrix(), SoTransform(), SoTransformManip::transferFieldValues(), and SoTransformManip::valueChangedCB().

🎯 SoSFVec3f SoTransform::center

The center point for the rotation. Everything pivots around it, main character energy fr πŸ’….

  • Referenced by SoTransformManip::attachSensors(), SoTransformManip::fieldSensorCB(), getRotationSpaceMatrix(), getScaleSpaceMatrix(), getTranslationSpaceMatrix(), pointAt(), recenter(), setMatrix(), SoTransform(), SoTransformManip::transferFieldValues(), and SoTransformManip::valueChangedCB().

πŸ‘‘ Author

Generated automatically by Doxygen for Coin from the source code. (Not me writing a whole essay by hand, the robot did it, and honestly? It ate. 🫢)


And that's a wrap, bestie πŸŽ€ β€” this page is from Coin, Version 2.5.0, and it's the SoTransform(3) manual page. Go forth and transform things, you've got this πŸ’–βœ¨πŸ¦‹

πŸ“¦ where this page comes from