---
name: "SoSFRotation"
section: "3"
platform: "linux"
package: "coin"
version: "1:4.0.10-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/SoSFRotation"
---

# SoSFRotation(3)

The SoSFRotation class is a container for an SbRotation.

## NAME

SoSFRotation - The **SoSFRotation** class is a container for an **SbRotation**.

## SYNOPSIS

\#include \<Inventor/fields/SoSFRotation.h\>

Inherits **SoSField**.

### Public Member Functions

virtual **SoType** **getTypeId** (void) const\
 virtual void **copyFrom** (const **SoField** &field)\
 const **SoSFRotation** & **operator=** (const **SoSFRotation** &field)\
 virtual SbBool **isSame** (const **SoField** &field) const\
 const **SbRotation** & **getValue** (void) const\
 void **setValue** (const **SbRotation** &newvalue)\
 const **SbRotation** & **operator=** (const **SbRotation** &newvalue)\
 int **operator==** (const **SoSFRotation** &field) const\
 int **operator!=** (const **SoSFRotation** &field) const\
 void **getValue** (**SbVec3f** &axis, float &angle) const\
 void **setValue** (const float q0, const float q1, const float q2, const float q3)\
 void **setValue** (const float q\[4\])\
 void **setValue** (const **SbVec3f** &axis, const float angle)\

Public Member Functions inherited from **SoSField** virtual **~SoSField** ()\

Public Member Functions inherited from **SoField** virtual **~SoField** ()\
 void **setIgnored** (SbBool ignore)\
 SbBool **isIgnored** (void) const\
 void **setDefault** (SbBool defaultVal)\
 SbBool **isDefault** (void) const\
 SbBool **isOfType** (const **SoType** type) const\
 void **enableConnection** (SbBool flag)\
 SbBool **isConnectionEnabled** (void) const\
 SbBool **connectFrom** (**SoEngineOutput** \*master, SbBool notnotify=FALSE, SbBool append=FALSE)\
 SbBool **appendConnection** (**SoEngineOutput** \*master, SbBool notnotify=FALSE)\
 void **disconnect** (**SoEngineOutput** \*engineoutput)\
 SbBool **isConnectedFromEngine** (void) const\
 SbBool **getConnectedEngine** (**SoEngineOutput** \*&master) const\
 SbBool **connectFrom** (**SoField** \*master, SbBool notnotify=FALSE, SbBool append=FALSE)\
 SbBool **appendConnection** (**SoField** \*master, SbBool notnotify=FALSE)\
 void **disconnect** (**SoField** \*field)\
 SbBool **isConnectedFromField** (void) const\
 SbBool **getConnectedField** (**SoField** \*&master) const\
 int **getNumConnections** (void) const\
 int **getForwardConnections** (**SoFieldList** &slavelist) const\
 int **getConnections** (**SoFieldList** &masterlist) const\
 void **disconnect** (void)\
 SbBool **isConnected** (void) const\
 void **setContainer** (**SoFieldContainer** \*cont)\
 **SoFieldContainer** \* **getContainer** (void) const\
 SbBool **set** (const char \*valuestring)\
 void **get** (**SbString** &valuestring)\
 SbBool **shouldWrite** (void) const\
 virtual void **touch** (void)\
 virtual void **startNotify** (void)\
 virtual void **notify** (**SoNotList** \*nlist)\
 SbBool **enableNotify** (SbBool on)\
 SbBool **isNotifyEnabled** (void) const\
 void **addAuditor** (void \*f, **SoNotRec::Type** type)\
 void **removeAuditor** (void \*f, **SoNotRec::Type** type)\
 int **operator==** (const **SoField** &f) const\
 int **operator!=** (const **SoField** &f) const\
 virtual void **connectionStatusChanged** (int numconnections)\
 SbBool **isReadOnly** (void) const\
 virtual void **fixCopy** (SbBool copyconnections)\
 virtual SbBool **referencesCopy** (void) const\
 void **copyConnection** (const **SoField** \*fromfield)\
 virtual SbBool **read** (**SoInput** \*input, const **SbName** &name)\
 virtual void **write** (**SoOutput** \*out, const **SbName** &name) const\
 virtual void **countWriteRefs** (**SoOutput** \*out) const\
 void **setFieldType** (int type)\
 int **getFieldType** (void) const\
 SbBool **getDirty** (void) const\
 void **setDirty** (SbBool dirty)\
 void **evaluate** (void) const\

### Static Public Member Functions

static void \* **createInstance** (void)\
 static **SoType** **getClassTypeId** (void)\
 static void **initClass** (void)\

Static Public Member Functions inherited from **SoSField** static void **initClass** (void)\
 static **SoType** **getClassTypeId** (void)\
 static void **atexit\_cleanup** (void)\

Static Public Member Functions inherited from **SoField** static void **initClass** (void)\
 static void **initClasses** (void)\
 static void **cleanupClass** (void)\
 static **SoType** **getClassTypeId** (void)\

### Protected Attributes

**SbRotation** **value**\

### Additional Inherited Members

Public Types inherited from **SoField** enum **FieldType** { **NORMAL\_FIELD** = 0, **EVENTIN\_FIELD**, **EVENTOUT\_FIELD**, **EXPOSED\_FIELD** }\

Protected Member Functions inherited from **SoSField** **SoSField** (void)\

Protected Member Functions inherited from **SoField** **SoField** (void)\
 void **valueChanged** (SbBool resetdefault=TRUE)\
 virtual void **evaluateConnection** (void) const\
 virtual SbBool **readConnection** (**SoInput** \*in)\
 virtual void **writeConnection** (**SoOutput** \*out) const\
 SbBool **isDestructing** (void) const\
 virtual **SoNotRec** **createNotRec** (**SoBase** \*cont)\

## Detailed Description

The **SoSFRotation** class is a container for an **SbRotation**.

This field is used where nodes, engines or other field containers need to store a single rotation definition.

Fields of this type stores their value to file as a rotation axis vector plus a rotation angle: "axis0 axis1 axis2 angle".

Note that there is one *very* common mistake that is easy to make when setting the value of an **SoSFRotation** field, and that is to inadvertently use the wrong **SbRotation** constructor. This example should clarify the problem:

```
mytransformnode->rotation.setValue(0, 0, 1, 1.5707963f);
```

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);
```

**See also**

**SoMFRotation**

## Member Function Documentation

### void \* SoSFRotation::createInstance (void ) \[static\]

*This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.*\

 Creates a new instance of the class type corresponding to the **SoType** object.

### SoType SoSFRotation::getClassTypeId (void ) \[static\]

This static method returns the **SoType** object associated with objects of this class.

### SoType SoSFRotation::getTypeId (void ) const \[virtual\]

Returns the type identification of an object derived from a class inheriting **SoField**. This is used for runtime type checking and "downward" casting.

Implements **SoField**.

### void SoSFRotation::copyFrom (const SoField & f) \[virtual\]

Copy value(s) from *f* into this field. *f* must be of the same type as this field.

Implements **SoField**.

### SbBool SoSFRotation::isSame (const SoField & f) const \[virtual\]

Check for equal type and value(s).

Implements **SoField**.

### void SoSFRotation::initClass (void ) \[static\]

Internal method called upon initialization of the library (from **SoDB::init()**) to set up the type system.

### void SoSFRotation::getValue (SbVec3f & axis, float & angle) const

Return value of rotation as an *axis* and an *angle* around this *axis*.

### void SoSFRotation::setValue (const float q0, const float q1, const float q2, const float q3)

Set the rotation from a set of quaternion values.

### void SoSFRotation::setValue (const float q\[4\])

Set the rotation from a set of quaternion values.

### void SoSFRotation::setValue (const SbVec3f & axis, const float angle)

Set the rotation from an *axis* and an *angle* around this *axis*.

## Author

Generated automatically by Doxygen for Coin from the source code.
