1 <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML
1.0 Strict//EN'
2 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
>
3 <html xmlns='http://www.w3.org/
1999/xhtml' xml:lang='en' lang='en'
>
5 <meta http-equiv='Content-Type' content='text/html; charset=utf-
8'
/>
6 <title>quaternions, vectors, matrices
</title>
7 <link href='reno.css' type='text/css' rel='stylesheet'
/>
14 <h1>QVM: Quaternions, Vectors, Matrices
</h1>
16 <!-- Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc. -->
17 <!-- Distributed under the Boost Software License, Version 1.0. (See accompanying -->
18 <!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
19 <div class=
"RenoIncludeDIV"><div class=
"RenoAutoDIV"><h3>Quaternions, Vectors, Matrices
</h3>
21 <p>Out of the box Boost QVM defines generic yet simple
<i><span class=
"RenoLink"><a href=
"quat.html">quat
</a></span></i>,
<i><span class=
"RenoLink"><a href=
"vec.html">vec
</a></span></i> and
<i><span class=
"RenoLink"><a href=
"mat.html">mat
</a></span></i> types. For example, the following snippet creates a quaternion object that rotates around the X axis:
</p>
22 <pre>#include
<<span class=
"RenoLink"><a href=
"boost_qvm_quat_hpp.html">boost/qvm/quat.hpp
</a></span>>
23 #include
<<span class=
"RenoLink"><a href=
"boost_qvm_quat_operations_hpp.html">boost/qvm/quat_operations.hpp
</a></span>>
26 <span class=
"RenoLink"><a href=
"quat.html">quat
</a></span><float
> rx=
<span class=
"RenoLink"><a href=
"rotx_quat_scalar_.html">rotx_quat
</a></span>(
3.14159f);
</pre>
27 <p>Similarly, a matrix that translates by a given vector can be created as follows:
</p>
28 <pre>#include
<<span class=
"RenoLink"><a href=
"boost_qvm_mat_hpp.html">boost/qvm/mat.hpp
</a></span>>
29 #include
<<span class=
"RenoLink"><a href=
"boost_qvm_vec_hpp.html">boost/qvm/vec.hpp
</a></span>>
30 #include
<<span class=
"RenoLink"><a href=
"boost_qvm_map_vec_mat_hpp.html">boost/qvm/map_vec_mat.hpp
</a></span>>
33 <span class=
"RenoLink"><a href=
"vec.html">vec
</a></span><float,
3> v={
0,
0,
7};
34 <span class=
"RenoLink"><a href=
"mat.html">mat
</a></span><float,
4,
4> tr=
<span class=
"RenoLink"><a href=
"translation_mat.html">translation_mat
</a></span>(v);
</pre>
35 <p>The usual quaternion, vector and matrix operations work on these Boost QVM types, however
<i>the operations are decoupled from any specific types
</i>: they work on any suitable type that has been registered by specializing the
<i><span class=
"RenoLink"><a href=
"quat_traits.html">quat_traits
</a></span></i>,
<i><span class=
"RenoLink"><a href=
"vec_traits.html">vec_traits
</a></span></i> and
<i><span class=
"RenoLink"><a href=
"mat_traits.html">mat_traits
</a></span></i> templates.
</p>
36 <p>For example, a user-defined
3D vector type
<i>float3
</i> can be introduced to Boost QVM as follows:
</p>
37 <div class=
"RenoIncludeDIV"><pre>#include
<<span class=
"RenoLink"><a href=
"boost_qvm_vec_traits_hpp.html">boost/qvm/vec_traits.hpp
</a></span>>
39 struct float3 { float a[
3]; };
43 namespace
<span class=
"RenoLink"><a href=
"qvm.html">qvm
</a></span>
46 struct
<span class=
"RenoLink"><a href=
"vec_traits.html">vec_traits
</a></span><float3
>
48 static int const
<span class=
"RenoLink"><a href=
"vec_traits_Vector_dim.html">dim
</a></span>=
3;
49 typedef float
<span class=
"RenoLink"><a href=
"vec_traits_V_scalar_type.html">scalar_type
</a></span>;
51 template
<int I
> static inline
<span class=
"RenoLink"><a href=
"vec_traits_V_scalar_type.html">scalar_type
</a></span> & <span class=
"RenoLink"><a href=
"vec_traits_V_write_element.html">write_element
</a></span>( float3
& v ) { return v.a[I]; }
52 template
<int I
> static inline
<span class=
"RenoLink"><a href=
"vec_traits_V_scalar_type.html">scalar_type
</a></span> <span class=
"RenoLink"><a href=
"vec_traits_V_read_element.html">read_element
</a></span>( float3 const
& v ) { return v.a[I]; }
54 static inline
<span class=
"RenoLink"><a href=
"vec_traits_V_scalar_type.html">scalar_type
</a></span> & <span class=
"RenoLink"><a href=
"vec_traits_V_write_element_idx.html">write_element_idx
</a></span>( int i, float3
& v ) { return v.a[i]; } //optional
55 static inline
<span class=
"RenoLink"><a href=
"vec_traits_V_scalar_type.html">scalar_type
</a></span> <span class=
"RenoLink"><a href=
"vec_traits_V_read_element_idx.html">read_element_idx
</a></span>( int i, float3 const
& v ) { return v.a[i]; } //optional
59 </div><p>After a similar specialization of the
<i><span class=
"RenoLink"><a href=
"mat_traits.html">mat_traits
</a></span></i> template for a user-defined
3x3 matrix type
<i>float33
</i>, the full range of vector and matrix operations defined by Boost QVM headers becomes available automatically:
</p>
61 <span class=
"RenoLink"><a href=
"accessing_vector_elements.html">X
</a></span>(v) =
0;
62 <span class=
"RenoLink"><a href=
"accessing_vector_elements.html">Y
</a></span>(v) =
0;
63 <span class=
"RenoLink"><a href=
"accessing_vector_elements.html">Z
</a></span>(v) =
7;
64 float vmag =
<span class=
"RenoLink"><a href=
"mag_vec_.html">mag
</a></span>(v);
65 float33 m =
<span class=
"RenoLink"><a href=
"rotx_mat_scalar_.html">rotx_mat
</a></span><3>(
3.14159f);
66 float3 vrot = m
<span class=
"RenoLink"><a href=
"operator_times_mat_vec_.html">*
</a></span> v;
</pre>
67 <p>User-defined quaternion types are similarly introduced to Boost QVM by specializing the
<i><span class=
"RenoLink"><a href=
"quat_traits.html">quat_traits
</a></span></i> template.
</p>
68 </div><div class=
"RenoIncludeDIV"><div class=
"RenoHR"><hr/></div>
69 <p><b>Tutorial navigation:
</b> <span class=
"RenoLink">Quaternions, Vectors, Matrices
</span> |
<span class=
"RenoLink"><a href=
"c_arrays.html">C Arrays
</a></span> |
<span class=
"RenoLink"><a href=
"Views.html">Views
</a></span> |
<span class=
"RenoLink"><a href=
"Swizzling.html">Swizzling
</a></span> |
<span class=
"RenoLink"><a href=
"Interoperability.html">Interoperability
</a></span><span class=
"RenoBR"> </span><br/><span class=
"RenoBR"> </span><br/>See also:
<span class=
"RenoLink"><a href=
"index.html">Boost QVM
</a></span></p>
70 </div><!-- Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc. -->
71 <!-- Distributed under the Boost Software License, Version 1.0. (See accompanying -->
72 <!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
75 <a class=
"logo" href=
"http://jigsaw.w3.org/css-validator/check/referer"><img class=
"logo_pic" src=
"valid-css.png" alt=
"Valid CSS" height=
"31" width=
"88"/></a>
76 <a class=
"logo" href=
"http://validator.w3.org/check?uri=referer"><img class=
"logo_pic" src=
"valid-xhtml.png" alt=
"Valid XHTML 1.0" height=
"31" width=
"88"/></a>
77 <small>Copyright (c)
2008-
2016 by Emil Dotchevski and Reverge Studios, Inc.
<br/>
78 Distributed under the
<a href=
"http://www.boost.org/LICENSE_1_0.txt">Boost Software License, Version
1.0</a>.
</small>