Anima瑩ng Scene Objects
[
228 
]
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
Maybe you are eager to learn how to create characters with anima瑩ons, rather than loading 
them into OSG, and start rendering. But again, it is out of the scope of this book. There are a 
couple of 3D modeling so晴ware for you to use: Autodesk 3dsmax, Autodesk Maya, Blender, 
and so on. Try outpu瑴ng your works to FBX format, or you may choose to convert it to OSG 
na瑩ve formats by using some expor瑩ng tools, such as Cedric Pinson's Blender Exporter: 
. This is controlled by Mercurial, a popular 
source control management tool.
In addi瑩on to the character solu瑩on in 
o
s
g
A
n
i
m
a
t
i
o
n
, there exist more third-party projects 
that handle character anima瑩ons. One of them is known as Cal3D project. This has an OSG 
wrapper project named 
o
s
g
C
a
l
2
. It is suggested that you have a look at the following 
websites to see if they are more preferred in your applica瑩ons:
‹
‹
Have a go hero – analyzing the structure of your character
Are you interes瑩ng in the structure of 
b
i
g
n
a
t
h
a
n
? As introduced before, it should be made 
up of 
o
s
g
A
n
i
m
a
t
i
o
n
:
:
B
o
n
e
and 
classes, which are actually 
nodes. Therefore, a node visitor can be used to analyze the scene graph and see how it is 
constructed and traversed.
Alter the node visitor example in Chapter 5Managing Scene Graph and use it to view and 
operate all of the bone nodes in the character file. A sugges瑩on is that you may read out the 
update callback a瑴ached with each 
o
s
g
A
n
i
m
a
t
i
o
n
:
:
B
o
n
e
node, and, if possible, build 
your own 
b
i
p
e
d
with 
b
i
g
n
a
t
h
a
n
used as a reference. They o晴en have the same skeletons 
in design.
Summary
OSG supports all major types of anima瑩on that can be applied in 3D applica瑩ons. The most 
common is transforma瑩on over 瑩me, which can be achieved by changing the spa瑩al status 
or even rendering states of a 3D object, while the so called key-frame anima瑩on is designed 
to achieve smooth movement by interpola瑩ng between frames. Skeleton system is the key 
for character anima瑩on, in which a mesh is used to rig to a prebuilt skeleton.
Pdf specification - 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
break pdf file into multiple files; split pdf into multiple files
Pdf specification - 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
cannot print pdf file no pages selected; break pdf documents
Chapter 8
[
229 
]
In this chapter, we introduced the capabili瑩es of OSG anima瑩on classes' and specifically 
covered:
‹
The reason for and methods to avoid conflicted modifica瑩ons, especially when  
crea瑩ng dynamic geometries
‹
Deriving from the callback base classes, including 
o
s
g
:
:
N
o
d
e
C
a
l
l
b
a
c
k
, and so on
‹
Interpola瑩ng transforma瑩on values in a path anima瑩on by using the 
o
s
g
:
:
A
n
i
m
a
t
i
o
n
P
a
t
h
and 
classes
‹
Using ease mo瑩on classes such as 
and 
to achieve nature mo瑩on effects
‹
Genera瑩ng animated textures using the 
o
s
g
:
:
I
m
a
g
e
S
e
q
u
e
n
c
e
class
‹
How to create complex generic key-frame anima瑩on by using the 
o
s
g
A
n
i
m
a
t
i
o
n
library, as well as the concept of anima瑩on channels and the way to control them
‹
Managing and anima瑩ng rigged characters from exis瑩ng files
C# Word: How to Generate Barcodes in C# Word with .NET Library
123456789"; linearBarcode.Resolution = 96; linearBarcode.Rotate = Rotate.Rotate0; // load Word document and you can also load documents like PDF, TIFF, Excel
break pdf into pages; break pdf into separate pages
C# Imaging - C# Code 128 Generation Guide
Automatically add minimum left and right margins that go with specification. Create Code 128 on PDF, Multi-Page TIFF, Word, Excel and PPT.
cannot select text in pdf; break a pdf apart
TIFF Image Viewer| What is TIFF
The TIFF specification contains two parts: Baseline TIFF (the core of TIFF) and TIFF and other popular formats, such as Bitmap, Png, Gif, Tiff, PDF, MS-Word
split pdf by bookmark; acrobat split pdf bookmark
Generate and Print 1D and 2D Barcodes in Java
linear barcode industry specification with barcode generator for Java. Error correction is valid for all 2D barcodes like QR Code, Data Matrix and PDF 417 in
break pdf into single pages; a pdf page cut
9
Interacting with 
Outside Elements
OSG provides a graphical user interface (GUI) abstrac瑩on library that 
centralizes the commonality of implementa瑩ons of different windowing systems 
(MFC, Qt, GLUT, and so on). It handles GUI events, among which the most 
commonly seen is the user's real-瑩me interac瑩on with peripheral devices such 
as the mouse and keyboard. In addi瑩on, the osgViewer library encapsulates 
different windowing systems' graphics contexts for construc瑩ng rendering 
environments. These cons瑩tute the topic of this chapter: how OSG interacts 
with other elements—for instance, input devices and windowing systems.
In this chapter, we will tell you:
‹
How to handle keyboard and mouse events with customized event handlers
‹
How to create and handle user-defined events
‹
How to understand the intersec瑩on test of scene objects
‹
How to configure traits of a window, and thus create the graphical context
‹
How to integrate the rendered scene into a windowing system
DocImage SDK for .NET: Web Document Image Viewer Online Demo
Microsoft PowerPoint: PPTX, PPS, PPSX; PDF: Portable Document Format; TIFF: Tagged Image XPS: XML Paper Specification. Supported Browers: IE9+; Firefox, Firefox
can't select text in pdf file; break apart a pdf in reader
.NET PDF Generator | Generate & Manipulate PDF files
archival records creation; Support for template PDF creation; Easy to use, no need to know PDF specification; Fast Document creation
acrobat split pdf pages; break a pdf file into parts
Interac瑩ng with Outside Elements
[
232 
]
Various events
graphical user interface (GUI) is a type of interface object that allows computer users to 
interact with programs in many ways, via so called GUI events. There are always different 
kinds of events that can be handled to respond to corresponding user opera瑩ons, for 
instance, moving the mouse device, clicking a mouse bu瑴on, pressing a key, resizing 
windows, and even wai瑩ng un瑩l a deadline has been reached.
In today's GUI framework, a widget element is always defined to receive these user ac瑩ons 
and transfer them to an event handler object. The la瑴er is wri瑴en by high-level developers to 
implement specific func瑩onali瑩es. For example, to pop up a dialog when clicking the Browse 
bu瑴on, or to save current content of a text editor to a file when pressing the S key.
Unfortunately, most frameworks, including MFC and .NET under Windows, GTK+ under 
Linux, Cocoa under Mac OS X, and some cross-pla瑦orm systems like Qt and wxWidgets, are 
incompa瑩ble with each other. Therefore they are not so convenient for direct use in an OSG 
applica瑩on. Instead, OSG provides a basic interface for anyone who wants to handle GUI 
events, called the 
.
This event handler class should be a瑴ached to the scene viewer with 
the 
a
d
d
E
v
e
n
t
H
a
n
d
l
e
r
(
)
method of the viewer, and removed with the 
r
e
m
o
v
e
E
v
e
n
t
H
a
n
d
l
e
r
(
)
method. It is a kind of callback that will automa瑩cally 
be called during the event traversal, which is introduced in the Traversing the scene 
graph sec瑩on of Chapter 5Managing Scene Graph.
When inheri瑩ng 
to implement your own event handlers, 
the most important work is to override the 
h
a
n
d
l
e
(
)
method. This has two arguments: 
the 
parameter that supplies the received events, and the 
parameter for feedback. The method can be wri瑴en like this:
{
}
The 
class will be introduced in the next sec瑩on. The 
allows the handler to ask the GUI to take some ac瑩on 
in response to an incoming event. In most cases, this can actually be considered as the 
viewer object. That is because the 
o
s
g
V
i
e
w
e
r
:
:
V
i
e
w
e
r
class is also derived from 
. The 
d
y
n
a
m
i
c
_
c
a
s
t
<
>
operator can be used here to 
perform the conversion in a safe way:
Here, 
a
a
is the input parameter of the 
h
a
n
d
l
e
(
)
method of 
.
GS1-128 Web Server Control for ASP.NET
Microsoft Visual Studio 2005/2008/2010 is supported. GS1-128 is actually a barcode application standard, rather than a barcode specification standard.
break pdf into multiple files; cannot print pdf no pages selected
VB.NET TWAIN: Overview of TWAIN Image Scanning in VB.NET
It includes the specification, data source manager and sample code implement console based TWAIN scanning and scan multiple pages into a single PDF document in
pdf will no pages selected; break pdf into multiple documents
Chapter 9
[
233 
]
Handling mouse and keyboard inputs
The 
class manages all kinds of OSG supported events, including 
both se瑴ng and ge瑴ng methods for them. The 
g
e
t
E
v
e
n
t
T
y
p
e
(
)
method returns the 
current GUI event stored in an event adapter. Every 瑩me the overriding 
h
a
n
d
l
e
(
)
method 
is called, we have to check this first to determine the event type and take appropriate 
countermeasures.
The following table shows the main event types in OSG, as well as the related methods used 
to get the necessary event arguments:
Event type value
Descrip瑩on
Related methods
P
U
S
H
/
R
E
L
E
A
S
E
/
D
O
U
B
L
E
C
L
I
C
K
The push, release, and 
double-click events of the 
mouse
Get the current mouse posi瑩on: 
g
e
t
X
(
)
g
e
t
Y
(
)
Get the related bu瑴on: 
g
e
t
B
u
t
t
o
n
(
)
return value can be one of:
L
E
F
T
_
M
O
U
S
E
_
B
U
T
T
O
N
, or
R
I
G
H
T
_
M
O
U
S
E
_
B
U
T
T
O
N
S
C
R
O
L
L
The scrolling mo瑩on of 
the mouse
Get the mo瑩on value: 
; return value 
can be one of:
S
C
R
O
L
L
_
U
P
S
C
R
O
L
L
_
D
O
W
N
S
C
R
O
L
L
_
L
E
F
T
, or 
S
C
R
O
L
L
_
R
I
G
H
T
D
R
A
G
The mouse drag event
Get the current mouse posi瑩on: 
g
e
t
X
(
)
g
e
t
Y
(
)
Get the current mouse bu瑴on state: 
g
e
t
B
u
t
t
o
n
M
a
s
k
(
)
; return value is the 
same as 
g
e
t
B
u
t
t
o
n
(
)
M
O
V
E
The mouse move event
Get the current mouse posi瑩on: 
g
e
t
X
(
)
g
e
t
Y
(
)
K
E
Y
D
O
W
N
/
K
E
Y
U
P
The key up and down 
events of the keyboard
Get the related key value: 
g
e
t
K
e
y
(
)
; the 
return value can be any ASCII character for 
le瑴er keys, or values in the 
K
e
y
_
S
y
m
b
o
l
enumera瑩on (for example 
K
E
Y
_
B
a
c
k
S
p
a
c
e
for the backspace key)
F
R
A
M
E
An event that occurs every 
frame
None
XImage.Barcode Generator for .NET, Technical Information Details
View & Process. XImage.Raster. Adobe PDF. XDoc.PDF. Scanning. XImage.OCR. Microsoft Office. View & Process. XImage.Raster. Adobe PDF. XDoc.PDF. Scanning. XImage.
break pdf password online; pdf splitter
XImage.Twain for .NET, Technical Information Details
View & Process. XImage.Raster. Adobe PDF. XDoc.PDF. Scanning. XImage.OCR. Microsoft Office. View & Process. XImage.Raster. Adobe PDF. XDoc.PDF. Scanning. XImage.
break password on pdf; pdf no pages selected to print
Interac瑩ng with Outside Elements
[
234 
]
Event type value
Descrip瑩on
Related methods
U
S
E
R
A user-defined event for 
more extensions.
Get the user data pointer: 
g
e
t
U
s
e
r
D
a
t
a
(
)
; the user data 
object must be derived from the 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
base class
There is another 
g
e
t
M
o
d
K
e
y
M
a
s
k
(
)
method that can be used to get the current modifier key 
when moving or clicking the mouse or pressing the keys on the keyboard. The return value is 
bitwise OR'ed with values including 
M
O
D
K
E
Y
_
C
T
R
L
M
O
D
K
E
Y
_
S
H
I
F
T
M
O
D
K
E
Y
_
A
L
T
, and so on. 
So we can check to see if the 
C
t
r
l
key is pushed with the following code segment:
{
}
Be aware that the corresponding se瑴ng methods of all ge瑴ng ones above, including 
s
e
t
E
v
e
n
t
T
y
p
e
(
)
s
e
t
X
(
)
s
e
t
Y
(
)
, and so on, are not suitable for use in the 
h
a
n
d
l
e
(
)
implementa瑩on. They are o晴en called by the low-level graphics window system of OSG to 
push new events to the event queue.
Time for action – driving the Cessna
We have learnt how to change the transforma瑩on matrix of a model with the 
o
s
g
:
:
M
a
t
r
i
x
T
r
a
n
s
f
o
r
m
nodes. With the help of the 
o
s
g
:
:
A
n
i
m
a
t
i
o
n
P
a
t
h
class and the 
o
s
g
A
n
i
m
a
t
i
o
n
namespace, we can even create anima瑩on effects on these transformable 
objects. But this is not enough for an interac瑩ve scene. Our further requirement is to control 
scene graph nodes with user input devices. Imagine that we have a submarine, a tank, or a 
familiar Cessna in a modern warfare game. It will be really exci瑩ng if we can simulate driving 
it with the keyboard, mouse, or even joys瑩cks.
1. 
Include the necessary headers:
2. 
Our task is to take control of a Cessna model with some keys. To handle these user 
events, we have to declare a 
M
o
d
e
l
C
o
n
t
r
o
l
l
e
r
class, which is derived from the 
base class, and override the 
h
a
n
d
l
e
(
)
method to 
make sure that all user events are passed in as an 
object. The model pointer is also included in the handler class; otherwise 
there is no way to tell which model is going to be controlled:
Chapter 9
[
235 
]
{
p
u
b
l
i
c
:
:
_
m
o
d
e
l
(
n
o
d
e
)
{
}
 protected:
}
;
3. 
In the implementa瑩on of the 
h
a
n
d
l
e
(
)
method, we will modify the Euler 
angles of the member variable 
_
m
o
d
e
l
, which can be a transforma瑩on node 
represen瑩ng a Cessna or other models. The character keys 
w
s
a
, and 
d
can 
easily describe the heading and pitch rota瑩ons of the aircra晴 via a common 
K
E
Y
D
O
W
N
event. Of course, func瑩on keys and naviga瑩on keys, including 
K
E
Y
_
L
e
f
t
K
E
Y
_
R
i
g
h
t
, and so on, are also available for use here:
{
{
{
b
r
e
a
k
;
b
r
e
a
k
;
b
r
e
a
k
;
b
r
e
a
k
;
d
e
f
a
u
l
t
:
Interac瑩ng with Outside Elements
[
236 
]
b
r
e
a
k
;
}
b
r
e
a
k
;
d
e
f
a
u
l
t
:
b
r
e
a
k
;
 }   return false;
}
4. 
In the main func瑩on, we will first load the Cessna model and add it to an 
o
s
g
:
:
M
a
t
r
i
x
T
r
a
n
s
f
o
r
m
parent. The parent node will be used as the 
controlled object and transferred to a 
M
o
d
e
l
C
o
n
t
r
o
l
l
e
r
handler instance:
)
;
5. 
Ini瑩alize the model controller and pass the transforma瑩on node as an argument:
6. 
We don't want the camera manipulator to work in this example, because it may also 
affect the model-view matrix of the viewer when using the keyboard and mouse, 
and confuse the result of handling GUI events. Therefore, in addi瑩on to adding 
the created event handler, we will prevent the main camera from receiving any 
user events with the 
method, and set a suitable view 
matrix by ourselves (because the manipulator can't contact the camera now):
7. 
Now start the viewer:
r
e
t
u
r
n
v
i
e
w
e
r
.
r
u
n
(
)
;
Chapter 9
[
237 
]
8. 
We will find that the camera manipulator (its default behavior is 
trackball-like) losses control of the main camera, and none of the mouse 
bu瑴ons can navigate in the scene now. However, pressing the four character  
keys has an effect on the Cessna now. Be aware, that the keyboard event here 
only works on the model node, but not on the whole scene graph. You may add 
another sta瑩onary node to the root node and see if it can be changed at any 瑩me:
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
Event handlers can be used for many purposes. In a hander callback, we can move and rotate 
transformable nodes, record anima瑩on paths, add or remove children from a parent node, 
compute frame rates and free memory, and do anything we want. It is triggered in the event 
traversal, thus it is always safe for dynamic data modifica瑩on.
An interes瑩ng ques瑩on here is how to decide the return value of the 
h
a
n
d
l
e
(
)
method. 
The required Boolean value here is used to indicate whether the event has already been 
handled or not. If 
t
r
u
e
is returned, OSG believes that the user event is no longer needed 
by any subsequent handlers, including the camera manipulator. The event will be marked as 
"handled" and will be ignored by other handlers or event callbacks by default. In most cases 
in this book, we don't want this behavior. So 
f
a
l
s
e
will always be returned without any 
doubts in this and subsequent examples.
Documents you may be interested
Documents you may be interested