Anima瑩ng Scene Objects
[
198 
]
Finally, the visitor in turn calls the 
a
p
p
l
y
(
)
virtual method to receive various types of nodes 
as its argument, and realizes customized visi瑩ng behaviors therea晴er. Since each 
a
p
p
l
y
(
)
method must call the visitor's 
t
r
a
v
e
r
s
e
(
)
to end itself, the cycle comes back to the first 
step, un瑩l the whole scene graph is traversed. The en瑩re diagram can be explained with 
following image:
The callback's 
o
p
e
r
a
t
o
r
(
)
method calls its 
t
r
a
v
e
r
s
e
(
)
in the third form, with a visitor 
and a node parameter. However, there is no need to worry about the complexity, as the only 
work it performs is to call the 
t
r
a
v
e
r
s
e
(
)
method of the visitor and con瑩nue the traversal. 
If you fail to call this in the callback's method, the traversal will simply be stopped and will 
return from current node at once.
Pop quiz – adding or setting callbacks
The 
method can be used to a瑴ach callbacks to scene nodes 
besides 
. It adds the new callback object to the end of the major 
one, and thus makes it possible to have more than one callback on a single node. Which one 
do you prefer? Can you point out when the nested callback is going to be executed during 
the run of the major one's 
o
p
e
r
a
t
o
r
(
)
method?
Avoiding conflicting modifications
We have discussed OSG's mul瑩thread implementa瑩on and thread safety in a very simple and 
easy way. The theory of the processing architecture is really out of the scope of this book. 
But in order to show the importance of maintaining data variance of scene objects, we need 
to briefly talk about the threading model.
Pdf rotate single page - Split, seperate PDF into multiple files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Explain How to Split PDF Document in Visual C#.NET Application
pdf no pages selected to print; break pdf into multiple pages
Pdf rotate single page - VB.NET PDF File Split Library: Split, seperate PDF into multiple files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET PDF Document Splitter Control to Disassemble PDF Document
pdf split pages; pdf link to specific page
Chapter 8
[
199 
]
OSG can make the draw traversal, which transfers data to the OpenGL pipeline run in a 
separated thread. It must be synchronized with other draw traversals in every frame, but 
part of the draw traversal can usually overlap the update traversal coming from the next 
frame, which improves the rendering efficiency and reduces frame latency. That means that 
the 
f
r
a
m
e
(
)
method of 
o
s
g
V
i
e
w
e
r
:
:
V
i
e
w
e
r
will return while the drawing work is s瑩ll 
ac瑩ve. Data changes in update callbacks could then conflict with the unfinished rendering 
process and cause unexpected behaviors, and even crashes.
OSG supplies a solu瑩on in the 
s
e
t
D
a
t
a
V
a
r
i
a
n
c
e
(
)
method, which belongs to the 
o
s
g
:
:
O
b
j
e
c
t
class—the base class of all scene objects. This can be set to one of three 
enumerate values: 
U
N
S
P
E
C
I
F
I
E
D
(by default), 
S
T
A
T
I
C
, and 
D
Y
N
A
M
I
C
. A 
D
Y
N
A
M
I
C
object 
in the scene graph must be processed at the beginning of the draw traversal. That is, the 
rendering backend should ensure all nodes and scene objects that are specified as 
D
Y
N
A
M
I
C
have finished being drawn before star瑩ng the next frame's update and cull traversals. 
However, 
S
T
A
T
I
C
objects, which are considered to be unchanged during upda瑩ng and 
drawing, can thus be rendered later and won't hold back the frame rate.
By default, any newly-allocated objects are set to 
U
N
S
P
E
C
I
F
I
E
D
, including nodes, drawables, 
state sets, and a瑴ributes. This allows OSG to predict the data variance. On the other hand, 
you can always reset the value and make it work from the next frame, for instance:
Time for action – drawing a geometry dynamically
It is common prac瑩ce to modify geometries' ver瑩ces and primi瑩ve a瑴ributes dynamically. 
We can change the posi瑩on, normal, color, and texture coordinate of each vertex, as well as 
related primi瑩ves per frame, in order to implement kinds of morph anima瑩ons. During the 
modifica瑩ons, it is important to keep an eye on the data variance, because the draw traversal 
might be running while upda瑩ng ver瑩ces and primi瑩ves, which might cause conflicts and 
even crashes.
In this example, we will make use of the quad geometry that was created in Chapter 4
Building Geometry Models. We will simply alter its last vertex and make it rotate around 
the X axis, which results in a simple anima瑩on effect.
1. 
Include the necessary headers:
C# PDF Page Rotate Library: rotate PDF page permanently in C#.net
And C# users may choose to only rotate a single page of PDF file or all the pages. See C# programming demos below. DLLs for PDF Page Rotation in C#.NET Project.
break a pdf apart; pdf split and merge
VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.
Able to remove a single page from adobe PDF document in VB.NET. using RasterEdge. XDoc.PDF; How to VB.NET: Delete a Single PDF Page from PDF File.
can print pdf no pages selected; pdf rotate single page
Anima瑩ng Scene Objects
[
200 
]
2. 
The crea瑩on of a quad is familiar to us. Specify the vertex, normal, and color array, 
and add a primi瑩ve set to indicate that all ver瑩ces are arranged and rendered with 
the type of 
G
L
_
Q
U
A
D
S
. Finally, return the newly-allocated geometry object:
{
}
3. 
With the help of 
, we can easily obtain 
the geometry pointer for altering each frame. The only method to be overridden 
is 
u
p
d
a
t
e
(
)
, which has a node visitor and a drawable pointer parameter. Its 
super class, 
, is a li瑴le similar to the 
o
s
g
:
:
N
o
d
e
C
a
l
l
b
a
c
k
class, except that a drawable's callback doesn't have to 
traverse to any "child" (a drawable has no child).
{
p
u
b
l
i
c
:
d
r
a
w
a
b
l
e
)
;
}
;
C# PDF Page Delete Library: remove PDF pages in C#.net, ASP.NET
application. Able to remove a single page from PDF document. Ability Demo Code: How to Delete a Single PDF Page from PDF File in C#.NET. How to
acrobat split pdf pages; how to split pdf file by pages
VB.NET PDF Page Rotate Library: rotate PDF page permanently in vb.
anticlockwise in VB.NET. Rotate single specified page or entire pages permanently in PDF file in Visual Basic .NET. Batch change PDF page
break pdf into single pages; c# split pdf
Chapter 8
[
201 
]
4. 
In the implementa瑩on of the 
u
p
d
a
t
e
(
)
method, we read out the vertex 
array of the created quad geometry with two 
s
t
a
t
i
c
_
c
a
s
t
<
>
operators. The 
d
y
n
a
m
i
c
_
c
a
s
t
<
>
keyword might be safer here if the 
class is not only applied to 
o
s
g
:
:
G
e
o
m
e
t
r
y
, but is also applied to other customized 
drawables. A晴er that, we quickly rotate the last vertex in the array around the origin 
(0, 0, 0), using the 
o
s
g
:
:
Q
u
a
t
quaternion class. The last work before exi瑩ng the 
method is to recalculate the display list object and bounding box of the current 
geometry, which may need to be updated when any of the ver瑩ces are changed:
{
}
5. 
We define the geometry as 
D
Y
N
A
M
I
C
, so the drawing traversal of the OSG backend 
will automa瑩cally order the dynamic object to perform robust scene graph 
traversals. In addi瑩on, the drawable's modifica瑩on callback is specified by the 
method of the 
o
s
g
:
:
D
r
a
w
a
b
l
e
class:
6. 
Now, add the quad geometry to an 
o
s
g
:
:
G
e
o
d
e
node, and a瑴ach the root node to 
the viewer:
r
e
t
u
r
n
v
i
e
w
e
r
.
r
u
n
(
)
;
How to C#: Basic SDK Concept of XDoc.PDF for .NET
insert, delete, re-order, copy, paste, cut, rotate, and save or query data and save the PDF document. The PDFPage class presents a single page in a PDFDocument
pdf file specification; pdf specification
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
C#.NET PDF file & pages edit, C#.NET PDF pages extract, copy, paste, C#.NET rotate PDF pages, C# Users can view PDF document in single page or continue
break pdf password online; can't cut and paste from pdf
Anima瑩ng Scene Objects
[
202 
]
7. 
The quad is animated this 瑩me. Its fourth vertex is dancing around the X axis, with 
the help of 
o
s
g
:
:
Q
u
a
t
class. It is more dynamic than just showing a mo瑩onless 
image on the screen:
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
Try to remove the 
s
e
t
D
a
t
a
V
a
r
i
a
n
c
e
(
)
line and see what happens. It is a li瑴le surprising 
that the example is s瑩ll running perfectly, as if it is not affected by the threading model. That 
is because 
U
N
S
P
E
C
I
F
I
E
D
objects can decide if they will be dynamically modified in callbacks 
or not, and reset the data variance to 
D
Y
N
A
M
I
C
automa瑩cally.
Try changing the enumera瑩on 
D
Y
N
A
M
I
C
to 
S
T
A
T
I
C
, and you may occasionally find that the 
rendering result is flickering and there is an OpenGL error message "invalid opera瑩on" from 
the console. This is actually caused by thread conflicts.
Without calling the 
d
i
r
t
y
D
i
s
p
l
a
y
L
i
s
t
(
)
method, OSG will ignore all dynamic drawable 
changes and make use of the display list commands storing the previous vertex and primi瑩ve 
data. Also, without the 
d
i
r
t
y
B
o
u
n
d
(
)
method, OSG will not know if the bounding box no 
longer fits the drawable size, and will make mistakes when doing view frustum culling work.
C# PDF Convert to Tiff SDK: Convert PDF to tiff images in C#.net
Both single page and multipage tiff image files can be created from PDF. Supports tiff compression selection. Supports for changing image size.
cannot print pdf file no pages selected; break a pdf into separate pages
VB.NET PDF: Basic SDK Concept of XDoc.PDF
insert, delete, re-order, copy, paste, cut, rotate, and save or query data and save the PDF document. The PDFPage class presents a single page in a PDFDocument
break a pdf into smaller files; pdf no pages selected to print
Chapter 8
[
203 
]
Have a go hero – dirtying geometry objects
We have to call the 
d
i
r
t
y
D
i
s
p
l
a
y
L
i
s
t
(
)
method to ac瑩vate the update of drawable data 
for correct rendering. But an important prerequisite here is the drawable should support the 
display list mode, which is the default behavior of drawables and can be enabled or disabled 
with the 
method.
OSG allows a be瑴er mechianism to be used while working in the VBO mode, which 
tends to be more efficient. Enable 
and disable 
to make it work. You will find the 
d
i
r
t
y
D
i
s
p
l
a
y
L
i
s
t
(
)
method 
is useless in this case. Try dirtying array data by issuing a 
d
i
r
t
y
(
)
command, such as:
v
e
r
t
i
c
e
s
-
>
d
i
r
t
y
(
)
;
See if your modifica瑩ons take effect, and iden瑩fy the difference between these two 
strategies when dirtying the same geometry. Actually, display list is of no use here because 
it is regenerated in every frame. Therefore, we o晴en prefer VBO for rendering changing 
geometry data.
Understanding ease motions
Assume that there is a train running from sta瑩on A to sta瑩on B within 15 minutes. We would 
like to simulate this scenario by altering the transforma瑩on matrix of the train in an update 
callback. The simplest way is to put the train at sta瑩on A at 瑩me point 0, and at sta瑩on B 
at 瑩me point 15 (minutes), and move it evenly in the transi瑩on phase. A heavily-employed 
method used here is the linear interpola瑩on. This draws a straight line between two 
neighboring samples 
P
0
and 
P
1
, and returns the appropriate point 
P
along the line, which 
can be used to represent transla瑩on and scale opera瑩ons of nodes. It is commonly expressed 
in the following form:
Here, 
t
is a number between 0 and 1.
Unfortunately, the mo瑩on of a train is usually much more complex. It starts from sta瑩on A, 
accelerates slowly, drives at an even speed, decelerates, and finally stops at sta瑩on B. In that 
case, linear interpola瑩on is always slightly unnatural.
VB.NET PDF File & Page Process Library SDK for vb.net, ASP.NET
With VB.NET PDF SDK, PDF document page can be rotated to 90, 180, and 270 in clockwise. Both a single page and whole file pages can be rotated and saved as
break apart a pdf; pdf format specification
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
all. This guiding page will help you merge two or more PDF documents into a single one in a Visual Basic .NET imaging application.
pdf print error no pages selected; break pdf into multiple pages
Anima瑩ng Scene Objects
[
204 
]
So we have ease mo瑩ons, or ease func瑩ons. These are mathema瑩cal func瑩ons that are used 
to interpolate values between two endpoints. An ease mo瑩on usually generates non-linear 
results, in order to produce more natural effects. The osgAnima瑩on library defines a number 
of built-in ease mo瑩ons. Each of them has at least two arguments: the start value (usually 0) 
and a dura瑩on (usually 1), and thus produces results in the range [start value, start value + 
dura瑩on]. They can be applied to the start (
I
n
M
o
t
i
o
n
), to the end (
O
u
t
M
o
t
i
o
n
), or to both 
start and end of the anima瑩on (
I
n
O
u
t
M
o
t
i
o
n
). We will list them in the following table:
Mo瑩on type
Ease-in class
Ease-out class
Ease-in/out class
Linear 
interpola瑩on
L
i
n
e
a
r
M
o
t
i
o
n
-
-
Quad func瑩on 
(y = t2)
I
n
Q
u
a
d
M
o
t
i
o
n
O
u
t
Q
u
a
d
M
o
t
i
o
n
I
n
O
u
t
Q
u
a
d
M
o
t
i
o
n
Cubic func瑩on 
(y = t3)
I
n
C
u
b
i
c
M
o
t
i
o
n
O
u
t
C
u
b
i
c
M
o
t
i
o
n
I
n
O
u
t
C
u
b
i
c
M
o
t
i
o
n
Quart func瑩on 
(y = t4)
I
n
Q
u
a
r
t
M
o
t
i
o
n
O
u
t
Q
u
a
r
t
M
o
t
i
o
n
I
n
O
u
t
Q
u
a
r
t
M
o
t
i
o
n
Bounce effect 
func瑩on
I
n
B
o
u
n
c
e
M
o
t
i
o
n
O
u
t
B
o
u
n
c
e
M
o
t
i
o
n
I
n
O
u
t
B
o
u
n
c
e
M
o
t
i
o
n
Elas瑩c bounce 
func瑩on
I
n
E
l
a
s
t
i
c
M
o
t
i
o
n
O
u
t
E
l
a
s
t
i
c
M
o
t
i
o
n
I
n
O
u
t
E
l
a
s
t
i
c
M
o
t
i
o
n
Sine func瑩on
I
n
S
i
n
e
M
o
t
i
o
n
O
u
t
S
i
n
e
M
o
t
i
o
n
I
n
O
u
t
S
i
n
e
M
o
t
i
o
n
Back func瑩on
I
n
B
a
c
k
M
o
t
i
o
n
O
u
t
B
a
c
k
M
o
t
i
o
n
I
n
O
u
t
B
a
c
k
M
o
t
i
o
n
Circle func瑩on
I
n
C
i
r
c
M
o
t
i
o
n
O
u
t
C
i
r
c
M
o
t
i
o
n
I
n
O
u
t
C
i
r
c
M
o
t
i
o
n
Exponent 
func瑩on
I
n
E
x
p
o
M
o
t
i
o
n
O
u
t
E
x
p
o
M
o
t
i
o
n
I
n
O
u
t
E
x
p
o
M
o
t
i
o
n
To create a linear interpola瑩on mo瑩on object, we just type:
The 
file in the OSG source code can help you to 
discover these ease mo瑩ons graphically. Try compiling and running it for details.
Chapter 8
[
205 
]
Animating the transformation nodes
Path anima瑩ons are the most commonly-used anima瑩ons in graphics applica瑩ons. They 
can be used to describe a running car, a flight, a rota瑩ng ball, or the camera's mo瑩on. The 
path should always be set up first, including posi瑩on, rota瑩on, and scale values at different 
key 瑩me nodes. When the simula瑩on loop is running, a transi瑩on state is calculated every 
frame, using the linear interpola瑩on for posi瑩on and scale vectors, and spherical linear 
interpola瑩on for the rota瑩on quaternion. The 
s
l
e
r
p
(
)
method of 
o
s
g
:
:
Q
u
a
t
is used 
internally here.
OSG provides the 
o
s
g
:
:
A
n
i
m
a
t
i
o
n
P
a
t
h
class to encapsulate a 瑩me varying transforma瑩on 
path. It has an 
i
n
s
e
r
t
(
)
method that can be used to insert a control point at a specific 
瑩me. A control point, declared by the 
class, 
accepts a posi瑩on value, and op瑩onal rota瑩on and scale values in order to construct the 
anima瑩on path. For example:
Here, 
t
1
and 
t
2
are 瑩me nodes in seconds, and 
r
o
t
1
is an 
o
s
g
:
:
Q
u
a
t
variable for 
represen瑩ng the rota瑩on of a object.
Besides that, we can set up the loop mode of the anima瑩on path with the 
s
e
t
L
o
o
p
M
o
d
e
(
)
method. The default value is 
L
O
O
P
, that is, the anima瑩on will con瑩nuously run on the preset 
path over and over again. This parameter can be changed to 
N
O
_
L
O
O
P
I
N
G
(run once) or 
S
W
I
N
G
(create a ping-pong path) for other purposes.
A晴er that, we a瑴ach the 
o
s
g
:
:
A
n
i
m
a
t
i
o
n
P
a
t
h
object to a built-in 
object, which is actually derived from 
o
s
g
:
:
N
o
d
e
C
a
l
l
b
a
c
k
, and can help developers to control their anima瑩ng scenes 
in an intui瑩ve way.
Time for action – making use of the animation path
Now we are going to make our Cessna navigate a cruise. It will be moving in a circle with 
the centre at (0, 0, 0). The anima瑩on path is used for upda瑩ng the posi瑩on and orienta瑩on 
of the model con瑩nuously, using linear interpola瑩on between key-frames. The only work 
is to add control points, including posi瑩on, op瑩onal rota瑩on, and scale key value, to the 
anima瑩on 瑩meline.
1. 
Include the necessary headers:
Anima瑩ng Scene Objects
[
206 
]
2. 
Create the anima瑩on path. This is in fact a circle with a specific radius on the XOY 
plane. The 瑩me parameter is used to indicate the total 瑩me required to finish a lap. 
The 
o
s
g
:
:
A
n
i
m
a
t
i
o
n
P
a
t
h
object is set to loop the anima瑩on infinitely. It contains 
32 control points to form a circle path, which is determined by the local variable 
n
u
m
S
a
m
p
l
e
s
:
)
{
o
s
g
:
:
A
n
i
m
a
t
i
o
n
P
a
t
h
;
{
)
;
}
}
3. 
Load the Cessna model. You will have no瑩ced that there is a significant difference 
between this and previous file names. The string 
"
0
,
0
,
9
0
.
r
o
t
"
seems redundant 
and ambiguous here. It is a kind of pseudo-loader, which is wri瑴en as part of 
filename but actually does a 90 degrees rota瑩on around the Z axis to the model 
c
e
s
s
n
a
.
o
s
g
. We are going to discuss this in detail in Chapter 10Crea瑩ng 
Components and Extending Func瑩onality:
o
s
g
:
:
M
a
t
r
i
x
T
r
a
n
s
f
o
r
m
;
Chapter 8
[
207 
]
4. 
Add the anima瑩on path to the 
object, and 
a瑴ach the callback to a node. Note that the anima瑩on path can only affect 
o
s
g
:
:
M
a
t
r
i
x
T
r
a
n
s
f
o
r
m
and 
nodes, 
upda瑩ng their transforma瑩on matrices or posi瑩on and rota瑩on a瑴ributes in the 
update traversal:
5. 
Simply start the viewer now:
r
e
t
u
r
n
v
i
e
w
e
r
.
r
u
n
(
)
;
6. 
The Cessna starts circling now. It may move beyond the scope of the screen, so we 
have to use the camera manipulator to change to a be瑴er viewing place than the 
ini瑩al one. Use the mouse bu瑴ons to adjust the view matrix and have an overview 
of the anima瑩on path that we have created:
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
The 
o
s
g
:
:
A
n
i
m
a
t
i
o
n
P
a
t
h
class uses a 
g
e
t
M
a
t
r
i
x
(
)
method to compute and 
return a transi瑩onal transforma瑩on matrix according to the two control points just 
before and a晴er a given 瑩me. It is then applied to the host 
o
s
g
:
:
M
a
t
r
i
x
T
r
a
n
s
f
o
r
m
, or 
o
s
g
:
:
C
a
m
e
r
a
node in order to make it move 
along the path. This is done by the 
class, which is actually 
an update callback for a specific purpose.
Documents you may be interested
Documents you may be interested