SoVRMLViewpoint(3)
π NAME π
SoVRMLViewpoint β bestie, it's the perspective camera class. That's the whole vibe. A whole class whose entire job is being a camera. Iconic. π
It lives in the SoVRMLViewpoint(3) manual page, and if you're here, you're probably about to point a virtual camera at something and hope it looks good. Say less. π
β¨ SYNOPSIS β¨
#include <Inventor/VRMLnodes/SoVRMLViewpoint.h>
Inherits SoNode. So it's got the whole family tree behind it, no cap. π§¬
πΈ Public Member Functions πΈ
virtual SoType getTypeId (void) constβ the type-ID check, so you can clock what kind of node you're dealing with.SoVRMLViewpoint (void)β the constructor. Hiiii. πvirtual void GLRender (SoGLRenderAction *action)β the render hook, where the actual drawing magic gets asked for.
π«Ά Public Member Functions inherited from SoNode
void setOverride (const SbBool state)SbBool isOverride (void) constvoid setNodeType (const NodeType type)NodeType getNodeType (void) constvirtual SoNode * copy (SbBool copyconnections=0) constvirtual SbBool affectsState (void) constvirtual void doAction (SoAction *action)virtual void GLRenderBelowPath (SoGLRenderAction *action)virtual void GLRenderInPath (SoGLRenderAction *action)virtual void GLRenderOffPath (SoGLRenderAction *action)virtual void callback (SoCallbackAction *action)virtual void getBoundingBox (SoGetBoundingBoxAction *action)virtual void getMatrix (SoGetMatrixAction *action)virtual void handleEvent (SoHandleEventAction *action)virtual void pick (SoPickAction *action)virtual void rayPick (SoRayPickAction *action)virtual void search (SoSearchAction *action)virtual void write (SoWriteAction *action)virtual void audioRender (SoAudioRenderAction *action)virtual void getPrimitiveCount (SoGetPrimitiveCountAction *action)virtual void grabEventsSetup (void)virtual void grabEventsCleanup (void)virtual void startNotify (void)virtual void notify (SoNotList *l)uint32_t getNodeId (void) constvirtual SoChildList * getChildren (void) constvirtual void writeInstance (SoOutput *out)virtual SoNode * addToCopyDict (void) constvirtual void copyContents (const SoFieldContainer *from, SbBool copyconnections)virtual SoFieldContainer * copyThroughConnection (void) const
π Public Member Functions inherited from SoFieldContainer
void setToDefaults (void)SbBool hasDefaultValues (void) constSbBool fieldsAreEqual (const SoFieldContainer *container) constvoid copyFieldValues (const SoFieldContainer *container, SbBool copyconnections=0)SbBool set (const char *const fielddata)void get (SbString &fielddata)virtual int getFields (SoFieldList &l) constvirtual int getAllFields (SoFieldList &l) constvirtual SoField * getField (const SbName &name) constvirtual SoField * getEventIn (const SbName &name) constvirtual SoField * getEventOut (const SbName &name) constSbBool getFieldName (const SoField *const field, SbName &name) constSbBool enableNotify (const SbBool flag)SbBool isNotifyEnabled (void) constSbBool 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) constvoid setUserData (void *userdata) constvoid * getUserData (void) const
π¦ Public Member Functions inherited from SoBase
void ref (void) constvoid unref (void) constvoid unrefNoDelete (void) constint32_t getRefCount (void) constvoid touch (void)SbBool isOfType (SoType type) constvirtual SbName getName (void) constvirtual 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) constSbBool shouldWrite (void)void assertAlive (void) const
β Static Public Member Functions β
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 positionβ where the camera is sitting, in local coords.SoSFRotation orientationβ which way it's looking, rotation-style.SoSFFloat fieldOfViewβ the angle of the vibe. Wide? Zoomed? Your call.SoSFString descriptionβ a little text label for the viewpoint, cute.SoSFBool jumpβ whether the transition teleports or eases in.
π₯ Protected Member Functions π₯
virtual const SoFieldData * getFieldData (void) constvirtual ~SoVRMLViewpoint ()
π« 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) constSbBool writeHeader (SoOutput *out, SbBool isgroup, SbBool isengine) constvoid writeFooter (SoOutput *out) constvirtual const char * getFileFormatName (void) const
π Static Protected Member Functions π
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)
β¨ Protected Attributes β¨
SoSFBool set_bindβ the eventIn that pushes/pops this node on the bindable stack.SoSFTime bindTimeβ the eventOut timestamping when binding happened.SoSFBool isBoundβ the eventOut telling you if this viewpoint is the one right now.
π¦ Protected Attributes inherited from SoNode
uint32_t uniqueId
π Protected Attributes inherited from SoFieldContainer
SbBool isBuiltIn
β 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 }
Static Protected Attributes inherited from SoNode
static uint32_t nextUniqueId = 0static int nextActionMethodIndex = 0
π Detailed Description π
The SoVRMLViewpoint class is a perspective camera class. That's the whole assignment. It's giving "camera, but make it a node." π·β¨
The detailed class documentation is taken verbatim from the VRML97 standard (ISO/IEC 14772-1:1997). It is copyright The Web3D Consortium, and is used by permission of the Consortium. So yes, credit where credit is due, we do not plagiarize in this house. π«Ά
Viewpoint {
eventIn SFBool set_bind
exposedField SFFloat fieldOfView 0.785398 # (0,inf)
exposedField SFBool jump TRUE
exposedField SFRotation orientation 0 0 1 0 # [-1,1],(-inf,inf)
exposedField SFVec3f position 0 0 10 # (-inf,inf)
field SFString description ""
eventOut SFTime bindTime
eventOut SFBool isBound
}
Okay so the Viewpoint node defines a specific location in the local coordinate system from which the user may view the scene. Think of it as: where the eyeballs live. π
Viewpoint nodes are bindable children nodes (see 4.6.10, Bindable children nodes: http://www.web3d.org/x3d/specifications/vrml/ISO-IEC-14772-VRML97/part1/concepts.html#4.6.10) β and because of that, there exists a Viewpoint node stack in the browser, and the top-most Viewpoint node on the stack is the currently active Viewpoint node. The stack is the moment. The top of the stack is the main character. π
If a TRUE value is sent to the set_bind eventIn of a Viewpoint node, it gets moved to the top of the Viewpoint node stack and activated. When a Viewpoint node is at the top of the stack, the user's view is conceptually re-parented as a child of the Viewpoint node. All subsequent changes to the Viewpoint node's coordinate system change the user's view β e.g., changes to any ancestor transformation nodes, or to the Viewpoint node's position or orientation fields. So like, everything upstream of it matters. The ancestors ate. π½οΈ
Sending a set_bind FALSE event removes the Viewpoint node from the stack and produces isBound FALSE and bindTime events. If the popped Viewpoint node is at the top of the viewpoint stack, the user's view is re-parented to the next entry in the stack. Popped and dropped, respectfully. π
More details on binding stacks can be found in 4.6.10, Bindable children nodes (http://www.web3d.org/x3d/specifications/vrml/ISO-IEC-14772-VRML97/part1/concepts.html#4.6.10).
When a Viewpoint node is moved to the top of the stack, the existing top of stack Viewpoint node sends an isBound FALSE event and is pushed down the stack. Not me passing the aux cord... π§β¨
okay so bestie, an author can literally auto-move your view through the world by binding you to a Viewpoint node and then animating either that Viewpoint node or the transformations above it. and browsers shall let you navigate relative to the coordinate system defined by the Viewpoint node (and the transformations above it) even if the Viewpoint node or its ancestors' transformations are being animated. no cap. π
The bindTime eventOut sends the time at which the Viewpoint node is bound or unbound. This can happen:
- during loading;
- when a
set_bindevent is sent to theViewpointnode; - when the browser binds to the
Viewpointnode through its user interface described below.
The position and orientation fields of the Viewpoint node specify relative locations in the local coordinate system. Position is relative to the coordinate system's origin (0,0,0), while orientation specifies a rotation relative to the default orientation. In the default position and orientation, the viewer is on the Z-axis looking down the -Z-axis toward the origin with +X to the right and +Y straight up. Viewpoint nodes are affected by the transformation hierarchy. β¨
Navigation types (see SoVRMLNavigationInfo) that require a definition of a down vector (e.g., terrain following) shall use the negative Y-axis of the coordinate system of the currently bound Viewpoint node. Likewise, navigation types that require a definition of an up vector shall use the positive Y-axis of the coordinate system of the currently bound Viewpoint node. The orientation field of the Viewpoint node does not affect the definition of the down or up vectors. This allows the author to separate the viewing direction from the gravity direction. π§
The jump field specifies whether the user's view "jumps" to the position and orientation of a bound Viewpoint node or remains unchanged. This jump is instantaneous and discontinuous in that no collisions are performed and no ProximitySensor nodes are checked in between the starting and ending jump points. If the user's position before the jump is inside a ProximitySensor the exitTime of that sensor shall send the same timestamp as the bind eventIn. Similarly, if the user's position after the jump is inside a ProximitySensor the enterTime of that sensor shall send the same timestamp as the bind eventIn. Regardless of the value of jump at bind time, the relative viewing transformation between the user's view and the current Viewpoint node shall be stored with the current Viewpoint node for later use when un-jumping (i.e., popping the Viewpoint node binding stack from a Viewpoint node with jump TRUE). The following summarizes the bind stack rules (see 4.6.10, Bindable children nodes: http://www.web3d.org/x3d/specifications/vrml/ISO-IEC-14772-VRML97/part1/concepts.html#4.6.10) with additional rules regarding Viewpoint nodes (in the original those extra bits were in boldface type β so iconic, right?):
- During read, the first encountered
Viewpointnode is bound by pushing it to the top of theViewpointnode stack. If aViewpointnode name is specified in the URL that is being read, this namedViewpointnode is considered to be the first encounteredViewpointnode. Nodes contained withinSoVRMLInlinenodes, within the strings passed to theBrowser.createVrmlFromString()method, or within files passed to theBrowser.createVrmlFromURL()method (see 4.12.10, Browser script interface: http://www.web3d.org/x3d/specifications/vrml/ISO-IEC-14772-VRML97/part1/concepts.html#4.12.10) are not candidates for the first encounteredViewpointnode. The first node within a prototype instance is a valid candidate for the first encounteredViewpointnode. The first encounteredViewpointnode sends anisBoundTRUE event. - When a
set_bindTRUE event is received by aViewpointnode,- If it is not on the top of the stack: The relative transformation from the current top of stack
Viewpointnode to the user's view is stored with the current top of stackViewpointnode. The current top of stack node sends anisBoundFALSE event. The new node is moved to the top of the stack and becomes the currently boundViewpointnode. The newViewpointnode (top of stack) sends anisBoundTRUE event. Ifjumpis TRUE for the newViewpointnode, the user's view is instantaneously "jumped" to match the values in thepositionandorientationfields of the newViewpointnode. - If the node is already at the top of the stack, this event has no affect.
- If it is not on the top of the stack: The relative transformation from the current top of stack
- When a
set_bindFALSE event is received by aViewpointnode in the stack, it is removed from the stack. If it was on the top of the stack,- it sends an
isBoundFALSE event, - the next node in the stack becomes the currently bound
Viewpointnode (i.e., pop) and issues anisBoundTRUE event, - if its
jumpfield value is TRUE, the user's view is instantaneously "jumped" to the position and orientation of the nextViewpointnode in the stack with the stored relative transformation of this nextViewpointnode applied.
- it sends an
- If a
set_bindFALSE event is received by a node not in the stack, the event is ignored andisBoundevents are not sent. - When a node replaces another node at the top of the stack, the
isBoundTRUE and FALSE events from the two nodes are sent simultaneously (i.e., with identical timestamps). - If a bound node is deleted, it behaves as if it received a
set_bindFALSE event.
The jump field may change after a Viewpoint node is bound. The rules described above still apply. If jump was TRUE when the Viewpoint node is bound, but changed to FALSE before the set_bind FALSE is sent, the Viewpoint node does not un-jump during unbind. If jump was FALSE when the Viewpoint node is bound, but changed to TRUE before the set_bind FALSE is sent, the Viewpoint node does perform the un-jump during unbind. π
Note that there are two other mechanisms that result in the binding of a new Viewpoint:
- An
Anchornode'surlfield specifies a"#ViewpointName". - A script invokes the
loadURL()method and the URL argument specifies a"#ViewpointName".
Both of these mechanisms override the jump field value of the specified Viewpoint node (#ViewpointName) and assume that jump is TRUE when binding to the new Viewpoint. The behaviour of the viewer transition to the newly bound Viewpoint depends on the currently bound NavigationInfo node's type field value (see SoVRMLNavigationInfo). π¦
The fieldOfView field specifies a preferred minimum viewing angle from this viewpoint in radians. A small field of view roughly corresponds to a telephoto lens; a large field of view roughly corresponds to a wide-angle lens. The field of view shall be greater than zero and smaller than . The value of fieldOfView represents the minimum viewing angle in any direction axis perpendicular to the view. For example, a browser with a rectangular viewing projection shall have the following relationship:
display width tan(FOVhorizontal/2)
-------------- = -----------------
display height tan(FOVvertical/2)
where the smaller of display width or display height determines which angle equals the fieldOfView (the larger angle is computed using the relationship described above). The larger angle shall not exceed and may force the smaller angle to be less than fieldOfView in order to sustain the aspect ratio. πΈ
The description field specifies a textual description of the Viewpoint node. This may be used by browser-specific user interfaces. If a Viewpoint's description field is empty it is recommended that the browser not present this Viewpoint in its browser-specific user interface. π
The URL syntax ".../scene.wrl#ViewpointName" specifies the user's initial view when loading "scene.wrl" to be the first Viewpoint node in the VRML file that appears as DEF ViewpointName Viewpoint {...}. This overrides the first Viewpoint node in the VRML file as the initial user view, and a set_bind TRUE message is sent to the Viewpoint node named "ViewpointName". If the Viewpoint node named "ViewpointName" is not found, the browser shall use the first Viewpoint node in the VRML file (i.e. the normal default behaviour). The URL syntax "#ViewpointName" (i.e. no file name) specifies a viewpoint within the existing VRML file. If this URL is loaded (e.g. Anchor node's url field or loadURL() method is invoked by a Script node), the Viewpoint node named "ViewpointName" is bound (a set_bind TRUE event is sent to this Viewpoint node). π
The results are undefined if a Viewpoint node is bound and is the child of an LOD, Switch, or any node or prototype that disables its children. If a Viewpoint node is bound that results in collision with geometry, the browser shall perform its self-defined navigation adjustments as if the user navigated to this point (see SoVRMLCollision). π
π Constructor & Destructor Documentation π
SoVRMLViewpoint::SoVRMLViewpoint (void )
Constructor.
References bindTime, description, fieldOfView, SbRotation::identity(), isBound, jump, orientation, position, set_bind, and SoVRMLViewpoint().
Referenced by getFieldData(), and SoVRMLViewpoint().
SoVRMLViewpoint::~SoVRMLViewpoint () [protected], [virtual]
Destructor.
β¨ MEMBER FUNCTION DOCUMENTATION β¨
SoType SoVRMLViewpoint::getTypeId(void) const [virtual]
okay bestie, this one hands you back the type ID of any object that descends from SoBase π it's the whole reason run-time type checking works, and it's how you do a "downward" cast without just praying π
usage example, keep it exactly like this:
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 the application programmers out there who wanna extend the library with new nodes, engines, nodekits, draggers or whatever else π listen up: this method needs to be overridden in all subclasses. no skipping, periodt. you typically do it as part of setting up the full type system for extension classes, and that's 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 β¨
want more deets on writing Coin extensions? go read the class documentation of the toplevel superclasses for the various class groups π¦
Implements SoBase.
const SoFieldData * SoVRMLViewpoint::getFieldData(void) const [protected], [virtual]
this lil cutie returns a pointer to the class-wide field data storage object for this instance πΈ and if there are no fields present at all? it returns NULL. that's it, that's the whole vibe.
Reimplemented from SoFieldContainer.
References SoVRMLViewpoint().
void SoVRMLViewpoint::GLRender(SoGLRenderAction * action) [virtual]
action method for the SoGLRenderAction π
this gets called during rendering traversals. any node that influences the rendering state in literally any way β or that wants to throw geometry primitives at OpenGL β overrides this method π₯
Reimplemented from SoNode.
π MEMBER DATA DOCUMENTATION π
SoSFVec3f SoVRMLViewpoint::position
the viewpoint position, bestie. default value is (0, 0, 0) β¨
Referenced by SoVRMLViewpoint().
SoSFRotation SoVRMLViewpoint::orientation
the camera orientation π¦ by default the camera is aligned along the negative z-axis.
Referenced by SoVRMLViewpoint().
SoSFFloat SoVRMLViewpoint::fieldOfView
field of view, as one does. default value is PI/4 π
Referenced by SoVRMLViewpoint().
SoSFString SoVRMLViewpoint::description
a textual viewpoint description πΈ it's empty by default.
Referenced by SoVRMLViewpoint().
SoSFBool SoVRMLViewpoint::jump
jump TRUE/FALSE, no cap π
Referenced by SoVRMLViewpoint().
SoSFBool SoVRMLViewpoint::set_bind [protected]
an eventIn that is used to bind the viewpoint π
Referenced by SoVRMLViewpoint().
SoSFTime SoVRMLViewpoint::bindTime [protected]
an event out that is sent when the viewpoint is bound β
Referenced by SoVRMLViewpoint().
SoSFBool SoVRMLViewpoint::isBound [protected]
an event out that is sent when the viewpoint is bound/unbound π
Referenced by SoVRMLViewpoint().
π AUTHOR π
Generated automatically by Doxygen for Coin from the source code.
and that's a wrap on this icon, bestie π«Ά this was Coin Version 2.5.0, page SoVRMLViewpoint(3) β go forth and viewpoint responsibly π
β¨
π¦ where this page comes from
- fedora 43: Coin2-devel 2.5.0-52.fc43 Β· GPL-2.0-only
- fedora 43: Coin2-devel 2.5.0-52.fc43 Β· GPL-2.0-only
- fedora 44: Coin2-devel 2.5.0-54.fc44 Β· GPL-2.0-only
- fedora 44: Coin2-devel 2.5.0-54.fc44 Β· GPL-2.0-only
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms