<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Vectors and Matrices</title>
		<link>http://www.allegro.cc/forums/view/569685</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 28 Feb 2006 12:46:47 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok. I&#39;ve hacked together a little GL program (attached), my goal is to be able to &quot;fly&quot; around the &quot;world&quot; I&#39;ve created, freely. Right now I&#39;m stuck moving in tracks. I have only a basic understanding of the Matrix math included (&quot;borrowed&quot; it from a program of George Foot&#39;s).</p><p>I &quot;think&quot; I can get the movement I want by including the &quot;vel&quot; vector into the matrix equations somehow, but I&#39;m not exactly sure how.</p><p>to build the program,<br />in unix: ./cbuild.c<br />in mingw: gcc cbuild.c -o cbuild.exe &amp;&amp; cbuild.exe</p><p>It requires the latest AllegroGL CVS, and Allegro 4.2+.</p><p>edit, hmm, I realize some here may be a little lazy, so I&#39;ll post some of the relavant code:<br />Camera Class:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">class</span> Camera <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>  public:</td></tr><tr><td class="number">3</td><td>    <span class="k1">static</span> Vector pos<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>    <span class="k1">static</span> Vector vel<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>    <span class="k1">static</span> Vector front<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>    <span class="k1">static</span> Vector right<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>    <span class="k1">static</span> Vector up<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>    <span class="k1">static</span> Camera <span class="k3">*</span>Instance<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">11</td><td>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>instance<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>        instance <span class="k3">=</span> <span class="k1">new</span> Camera<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">14</td><td>      <span class="k1">return</span> instance<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>    <span class="k1">static</span> <span class="k1">void</span> setup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>    <span class="k1">static</span> <span class="k1">void</span> Camera::move <span class="k2">(</span><span class="k1">double</span> dx, <span class="k1">double</span> dy, <span class="k1">double</span> dz<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>    <span class="k1">static</span> <span class="k1">void</span> Camera::roll <span class="k2">(</span><span class="k1">double</span> dz<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    <span class="k1">static</span> <span class="k1">void</span> Camera::pitch <span class="k2">(</span><span class="k1">double</span> dy<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>    <span class="k1">static</span> <span class="k1">void</span> Camera::yaw <span class="k2">(</span><span class="k1">double</span> dx<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>  protected:</td></tr><tr><td class="number">24</td><td>    Camera<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <span class="k2">}</span></td></tr><tr><td class="number">25</td><td>    Camera<span class="k2">(</span><span class="k1">const</span> Camera<span class="k3">&amp;</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>      Camera<span class="k3">&amp;</span> <span class="k1">operator</span><span class="k3">=</span> <span class="k2">(</span><span class="k1">const</span> Camera<span class="k3">&amp;</span><span class="k2">)</span><span class="k2">{</span><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>  private:</td></tr><tr><td class="number">29</td><td>    <span class="k1">static</span> Camera <span class="k3">*</span>instance<span class="k2">;</span></td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>Camera <span class="k3">*</span>Camera::instance <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>&#160;</td></tr><tr><td class="number">34</td><td>Vector Camera::pos <span class="k3">=</span> Vector<span class="k2">(</span><span class="n">1</span>,<span class="n">1</span>,<span class="n">4</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>Vector Camera::vel <span class="k3">=</span> Vector<span class="k2">(</span><span class="n">0</span>.<span class="n">001</span>,<span class="n">0</span>,<span class="n">0</span>.<span class="n">001</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>Vector Camera::front <span class="k3">=</span> Vector<span class="k2">(</span><span class="n">1</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>Vector Camera::up <span class="k3">=</span> Vector<span class="k2">(</span><span class="n">0</span>,<span class="n">1</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>Vector Camera::right <span class="k3">=</span> Vector<span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>&#160;</td></tr><tr><td class="number">40</td><td><span class="k1">void</span> Camera::setup<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">41</td><td><span class="k2">{</span></td></tr><tr><td class="number">42</td><td>  Camera <span class="k3">*</span>cam <span class="k3">=</span> Instance<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>&#160;</td></tr><tr><td class="number">44</td><td>  <span class="c">//Camera::pos += Camera::vel; //cam-&gt;right + cam-&gt;up + cam-&gt;vel;</span></td></tr><tr><td class="number">45</td><td>&#160;</td></tr><tr><td class="number">46</td><td>   glMatrixMode<span class="k2">(</span>GL_PROJECTION<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>   glLoadIdentity<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>   gluPerspective<span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>fov, aspect <span class="k3">*</span> <span class="n">1</span>.<span class="n">333333</span>, <span class="n">1</span>.<span class="n">0</span>, <span class="n">1200</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>   glMatrixMode<span class="k2">(</span>GL_MODELVIEW<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td>   glLoadIdentity<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td>&#160;</td></tr><tr><td class="number">52</td><td><span class="c">//  Camera::front.Normalize();</span></td></tr><tr><td class="number">53</td><td><span class="c">//  Camera::right = Camera::front.Cross(Camera::up);</span></td></tr><tr><td class="number">54</td><td><span class="c">//  Camera::up = Camera::right.Cross(Camera::front);</span></td></tr><tr><td class="number">55</td><td><span class="c">//  Camera::up.Normalize();</span></td></tr><tr><td class="number">56</td><td>&#160;</td></tr><tr><td class="number">57</td><td>  pos <span class="k3">+</span><span class="k3">=</span> vel<span class="k2">;</span></td></tr><tr><td class="number">58</td><td>&#160;</td></tr><tr><td class="number">59</td><td>  <span class="c">/* Note: you have to write matrices transposed in C, for passing to OpenGL */</span></td></tr><tr><td class="number">60</td><td>  GLfloat m<span class="k2">[</span><span class="n">16</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span></td></tr><tr><td class="number">61</td><td>    <span class="n">0</span>, up.x, front.x, <span class="n">0</span>,</td></tr><tr><td class="number">62</td><td>    <span class="n">0</span>, up.y, front.y, <span class="n">0</span>,</td></tr><tr><td class="number">63</td><td>    <span class="n">0</span>, up.z, front.z, <span class="n">0</span>,</td></tr><tr><td class="number">64</td><td>    <span class="n">0</span>, <span class="n">0</span>,    <span class="n">0</span>,       <span class="n">1</span></td></tr><tr><td class="number">65</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>&#160;</td></tr><tr><td class="number">67</td><td>  <span class="c">/* The right vector is the cross product of front with up -- store</span></td></tr><tr><td class="number">68</td><td><span class="c">   * the result in the first row of the matrix. */</span></td></tr><tr><td class="number">69</td><td>  <a href="http://www.allegro.cc/manual/cross_product_f" target="_blank"><span class="a">cross_product_f</span></a> <span class="k2">(</span></td></tr><tr><td class="number">70</td><td>    front.x, front.y, front.z,</td></tr><tr><td class="number">71</td><td>    up.x,    up.y,    up.z,</td></tr><tr><td class="number">72</td><td>    <span class="k3">&amp;</span>m<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>,    <span class="k3">&amp;</span>m<span class="k2">[</span><span class="n">4</span><span class="k2">]</span>,   <span class="k3">&amp;</span>m<span class="k2">[</span><span class="n">8</span><span class="k2">]</span></td></tr><tr><td class="number">73</td><td>  <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>&#160;</td></tr><tr><td class="number">75</td><td>  <span class="c">/* Assume MODELVIEW matrix already selected, and load our rotation */</span></td></tr><tr><td class="number">76</td><td>  glLoadMatrixf <span class="k2">(</span>m<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">77</td><td>  <span class="c">/* Compose with the inverse of the translation to the camera's pos */</span></td></tr><tr><td class="number">78</td><td>&#160;</td></tr><tr><td class="number">79</td><td>  glTranslatef <span class="k2">(</span><span class="k3">-</span>pos.x, <span class="k3">-</span>pos.y, <span class="k3">-</span>pos.z<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">80</td><td><span class="k2">}</span></td></tr><tr><td class="number">81</td><td>&#160;</td></tr><tr><td class="number">82</td><td><span class="c">/* Steer left/right (+ve = right) */</span></td></tr><tr><td class="number">83</td><td><span class="k1">void</span> Camera::yaw <span class="k2">(</span><span class="k1">double</span> dx<span class="k2">)</span></td></tr><tr><td class="number">84</td><td><span class="k2">{</span></td></tr><tr><td class="number">85</td><td>  <span class="c">/* Get rotation about the up vector, and apply it to the front vector */</span></td></tr><tr><td class="number">86</td><td>  <a href="http://www.allegro.cc/manual/MATRIX_f" target="_blank"><span class="a">MATRIX_f</span></a> m<span class="k2">;</span></td></tr><tr><td class="number">87</td><td>  <span class="k1">float</span> v<span class="k2">[</span><span class="n">3</span><span class="k2">]</span><span class="k2">;</span> <span class="c">/* temporary storage for result */</span></td></tr><tr><td class="number">88</td><td>  <a href="http://www.allegro.cc/manual/get_vector_rotation_matrix_f" target="_blank"><span class="a">get_vector_rotation_matrix_f</span></a> <span class="k2">(</span><span class="k3">&amp;</span>m, up.x, up.y, up.z, <span class="k3">-</span>dx<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">89</td><td>  <a href="http://www.allegro.cc/manual/apply_matrix_f" target="_blank"><span class="a">apply_matrix_f</span></a> <span class="k2">(</span><span class="k3">&amp;</span>m, front.x, front.y, front.z, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">90</td><td>  front.x <span class="k3">=</span> v<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span> front.y <span class="k3">=</span> v<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span> front.z <span class="k3">=</span> v<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">91</td><td><span class="k2">}</span></td></tr><tr><td class="number">92</td><td>&#160;</td></tr><tr><td class="number">93</td><td>&#160;</td></tr><tr><td class="number">94</td><td><span class="c">/* Steer up/down (+ve = up) */</span></td></tr><tr><td class="number">95</td><td><span class="k1">void</span> Camera::pitch <span class="k2">(</span><span class="k1">double</span> dy<span class="k2">)</span></td></tr><tr><td class="number">96</td><td><span class="k2">{</span></td></tr><tr><td class="number">97</td><td>  <span class="c">/* Get rotation about the right vector, and apply it to both the others */</span></td></tr><tr><td class="number">98</td><td>  <a href="http://www.allegro.cc/manual/MATRIX_f" target="_blank"><span class="a">MATRIX_f</span></a> m<span class="k2">;</span></td></tr><tr><td class="number">99</td><td>  <span class="c">/* v is doubling up as somewhere to store the right vector now */</span></td></tr><tr><td class="number">100</td><td>  <span class="k1">float</span> v<span class="k2">[</span><span class="n">3</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span></td></tr><tr><td class="number">101</td><td>    up.z <span class="k3">*</span> front.y <span class="k3">-</span> up.y <span class="k3">*</span> front.z,</td></tr><tr><td class="number">102</td><td>    up.x <span class="k3">*</span> front.z <span class="k3">-</span> up.z <span class="k3">*</span> front.x,</td></tr><tr><td class="number">103</td><td>    up.y <span class="k3">*</span> front.x <span class="k3">-</span> up.x <span class="k3">*</span> front.y</td></tr><tr><td class="number">104</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">105</td><td>  <a href="http://www.allegro.cc/manual/get_vector_rotation_matrix_f" target="_blank"><span class="a">get_vector_rotation_matrix_f</span></a> <span class="k2">(</span><span class="k3">&amp;</span>m, v<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, v<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, v<span class="k2">[</span><span class="n">2</span><span class="k2">]</span>, dy<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">106</td><td>  <a href="http://www.allegro.cc/manual/apply_matrix_f" target="_blank"><span class="a">apply_matrix_f</span></a> <span class="k2">(</span><span class="k3">&amp;</span>m, front.x, front.y, front.z, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">107</td><td>  front.x <span class="k3">=</span> v<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span> front.y <span class="k3">=</span> v<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span> front.z <span class="k3">=</span> v<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">108</td><td>&#160;</td></tr><tr><td class="number">109</td><td>  <a href="http://www.allegro.cc/manual/apply_matrix_f" target="_blank"><span class="a">apply_matrix_f</span></a> <span class="k2">(</span><span class="k3">&amp;</span>m, up.x, up.y, up.z, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">110</td><td>  up.x <span class="k3">=</span> v<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span> up.y <span class="k3">=</span> v<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span> up.z <span class="k3">=</span> v<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">111</td><td><span class="k2">}</span></td></tr><tr><td class="number">112</td><td>&#160;</td></tr><tr><td class="number">113</td><td>&#160;</td></tr><tr><td class="number">114</td><td><span class="c">/* Twist (+ve = right/clockwise) */</span></td></tr><tr><td class="number">115</td><td><span class="k1">void</span> Camera::roll <span class="k2">(</span><span class="k1">double</span> dz<span class="k2">)</span></td></tr><tr><td class="number">116</td><td><span class="k2">{</span></td></tr><tr><td class="number">117</td><td>  <span class="c">/* Get rotation about the front vector, and apply it to the up vector */</span></td></tr><tr><td class="number">118</td><td>  <a href="http://www.allegro.cc/manual/MATRIX_f" target="_blank"><span class="a">MATRIX_f</span></a> m<span class="k2">;</span></td></tr><tr><td class="number">119</td><td>  <span class="k1">float</span> v<span class="k2">[</span><span class="n">3</span><span class="k2">]</span><span class="k2">;</span> <span class="c">/* temporary storage for result */</span></td></tr><tr><td class="number">120</td><td>  <a href="http://www.allegro.cc/manual/get_vector_rotation_matrix_f" target="_blank"><span class="a">get_vector_rotation_matrix_f</span></a> <span class="k2">(</span><span class="k3">&amp;</span>m, front.x, front.y, front.z, dz<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">121</td><td>  <a href="http://www.allegro.cc/manual/apply_matrix_f" target="_blank"><span class="a">apply_matrix_f</span></a> <span class="k2">(</span><span class="k3">&amp;</span>m, up.x, up.y, up.z, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="k3">&amp;</span>v<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">122</td><td>  up.x <span class="k3">=</span> v<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span> up.y <span class="k3">=</span> v<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span> up.z <span class="k3">=</span> v<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">123</td><td><span class="k2">}</span></td></tr><tr><td class="number">124</td><td>&#160;</td></tr><tr><td class="number">125</td><td>&#160;</td></tr><tr><td class="number">126</td><td>&#160;</td></tr><tr><td class="number">127</td><td><span class="c">/* Move the camera.  This is really simple now that we have front and up</span></td></tr><tr><td class="number">128</td><td><span class="c"> * vectors already calculated. */</span></td></tr><tr><td class="number">129</td><td><span class="k1">void</span> Camera::move <span class="k2">(</span><span class="k1">double</span> dx, <span class="k1">double</span> dy, <span class="k1">double</span> dz<span class="k2">)</span></td></tr><tr><td class="number">130</td><td><span class="k2">{</span></td></tr><tr><td class="number">131</td><td>  right.x <span class="k3">=</span> up.z <span class="k3">*</span> front.y <span class="k3">-</span> up.y <span class="k3">*</span> front.z<span class="k2">;</span></td></tr><tr><td class="number">132</td><td>  right.y <span class="k3">=</span> up.x <span class="k3">*</span> front.z <span class="k3">-</span> up.z <span class="k3">*</span> front.x<span class="k2">;</span></td></tr><tr><td class="number">133</td><td>  right.z <span class="k3">=</span> up.y <span class="k3">*</span> front.x <span class="k3">-</span> up.x <span class="k3">*</span> front.y<span class="k2">;</span></td></tr><tr><td class="number">134</td><td>&#160;</td></tr><tr><td class="number">135</td><td>  pos.x <span class="k3">+</span><span class="k3">=</span> dx<span class="k3">*</span>right.x <span class="k3">+</span> dy<span class="k3">*</span>up.x <span class="k3">+</span> dz<span class="k3">*</span>front.x<span class="k2">;</span></td></tr><tr><td class="number">136</td><td>  pos.y <span class="k3">+</span><span class="k3">=</span> dx<span class="k3">*</span>right.y <span class="k3">+</span> dy<span class="k3">*</span>up.y <span class="k3">+</span> dz<span class="k3">*</span>front.y<span class="k2">;</span></td></tr><tr><td class="number">137</td><td>  pos.z <span class="k3">+</span><span class="k3">=</span> dx<span class="k3">*</span>right.z <span class="k3">+</span> dy<span class="k3">*</span>up.z <span class="k3">+</span> dz<span class="k3">*</span>front.z<span class="k2">;</span></td></tr><tr><td class="number">138</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Keyboard/Movement:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">double</span> mod1 <span class="k3">=</span> <span class="n">0</span>.<span class="n">0015</span><span class="k2">;</span></td></tr><tr><td class="number">2</td><td><span class="k1">double</span> mod2 <span class="k3">=</span> <span class="n">0</span>.<span class="n">15</span><span class="k2">;</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="k1">int</span> do_keyboard<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">5</td><td><span class="k2">{</span></td></tr><tr><td class="number">6</td><td>  Camera <span class="k3">*</span>cam <span class="k3">=</span> Camera::Instance<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_LEFT<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">9</td><td>    cam-&gt;vel <span class="k3">-</span><span class="k3">=</span> Vector<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, mod1<span class="k2">)</span><span class="k2">;</span><span class="c">//.Normalize();</span></td></tr><tr><td class="number">10</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">11</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_RIGHT<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>    cam-&gt;vel <span class="k3">+</span><span class="k3">=</span> Vector<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, mod1<span class="k2">)</span><span class="k2">;</span><span class="c">//.Normalize();</span></td></tr><tr><td class="number">13</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">14</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_DOWN<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">15</td><td>    cam-&gt;vel <span class="k3">+</span><span class="k3">=</span> Vector<span class="k2">(</span>mod1, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span><span class="c">//.Normalize();</span></td></tr><tr><td class="number">16</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">17</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_UP<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">18</td><td>    cam-&gt;vel <span class="k3">-</span><span class="k3">=</span> Vector<span class="k2">(</span>mod1, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span><span class="c">//.Normalize();</span></td></tr><tr><td class="number">19</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_W<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">23</td><td>    Camera::pitch<span class="k2">(</span><span class="k3">-</span>mod2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">25</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_S<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">26</td><td>    Camera::pitch<span class="k2">(</span>mod2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">28</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_A<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">29</td><td>    Camera::yaw<span class="k2">(</span><span class="k3">-</span>mod2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">31</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_D<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">32</td><td>    Camera::yaw<span class="k2">(</span>mod2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td>&#160;</td></tr><tr><td class="number">36</td><td>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_1<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">37</td><td>    glPolygonMode <span class="k2">(</span>GL_FRONT_AND_BACK, GL_FILL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>  <span class="k2">}</span> </td></tr><tr><td class="number">39</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_2<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">40</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">41</td><td>    glPolygonMode <span class="k2">(</span>GL_FRONT_AND_BACK, GL_LINE<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">43</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Now, it could be just me, but theres got to be a way to include the &quot;pos+vel&quot; into the matrix calculations in Camera::setup.</p><p>edit2, 5+ hours and nothing? Thanks guys.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Mon, 27 Feb 2006 21:17:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Is this camera <b>rotation</b> or camera <b>movement</b>? <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>[edit]<br />Perhaps you could use sin/cos when you rotate the camera.</p><p>I have to go out now but perhaps drawing what you want to happen then connecting the patterns would help you form an idea of what you need to do.<br />Though do the example using only 2 dimensions first.</p><p>^ Disregard that if it doesn&#39;t help you at all. <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Archon)</author>
		<pubDate>Tue, 28 Feb 2006 03:13:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks Archon. Its both really.</p><p>I want to properly move through a 3d environment with all 360 degrees of freedom.</p><p>I&#39;ve attempted to modify my camera update to the following, but it seems I&#39;ve got something totally wrong about the gl matrices:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">void</span> Camera::setup<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  Camera <span class="k3">*</span>cam <span class="k3">=</span> Instance<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>  <span class="c">//Camera::pos += Camera::vel; //cam-&gt;right + cam-&gt;up + cam-&gt;vel;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>   glMatrixMode<span class="k2">(</span>GL_PROJECTION<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>   glLoadIdentity<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>   gluPerspective<span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>fov, aspect <span class="k3">*</span> <span class="n">1</span>.<span class="n">333333</span>, <span class="n">1</span>.<span class="n">0</span>, <span class="n">1200</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>   glMatrixMode<span class="k2">(</span>GL_MODELVIEW<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>   glLoadIdentity<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td><span class="c">//  Camera::front.Normalize();</span></td></tr><tr><td class="number">14</td><td><span class="c">//  Camera::right = Camera::front.Cross(Camera::up);</span></td></tr><tr><td class="number">15</td><td><span class="c">//  Camera::up = Camera::right.Cross(Camera::front);</span></td></tr><tr><td class="number">16</td><td><span class="c">//  Camera::up.Normalize();</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>  pos <span class="k3">+</span><span class="k3">=</span> vel<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>  pos.Normalize<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td>  <span class="c">/* The right vector is the cross product of front with up -- store</span></td></tr><tr><td class="number">22</td><td><span class="c">   * the result in the first row of the matrix. */</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>  right <span class="k3">=</span> front.Cross<span class="k2">(</span>up<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td>  <span class="c">/* Note: you have to write matrices transposed in C, for passing to OpenGL */</span></td></tr><tr><td class="number">27</td><td>  GLfloat mat1<span class="k2">[</span><span class="n">16</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span></td></tr><tr><td class="number">28</td><td>    right.x, up.x, front.x, <span class="n">0</span>,</td></tr><tr><td class="number">29</td><td>    right.y, up.y, front.y, <span class="n">0</span>,</td></tr><tr><td class="number">30</td><td>    right.z, up.z, front.z, <span class="n">0</span>,</td></tr><tr><td class="number">31</td><td>    <span class="n">0</span>,       <span class="n">0</span>,    <span class="n">0</span>,       <span class="n">1</span></td></tr><tr><td class="number">32</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>&#160;</td></tr><tr><td class="number">34</td><td>  GLfloat mat2<span class="k2">[</span><span class="n">16</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span></td></tr><tr><td class="number">35</td><td>    <span class="n">1</span>, <span class="n">0</span>, <span class="n">0</span>, pos.x,</td></tr><tr><td class="number">36</td><td>    <span class="n">0</span>, <span class="n">1</span>, <span class="n">0</span>, pos.y,</td></tr><tr><td class="number">37</td><td>    <span class="n">0</span>, <span class="n">0</span>, <span class="n">1</span>, pos.z,</td></tr><tr><td class="number">38</td><td>    <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">1</span></td></tr><tr><td class="number">39</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>&#160;</td></tr><tr><td class="number">41</td><td>  GLfloat mat<span class="k2">[</span><span class="n">16</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span></td></tr><tr><td class="number">42</td><td>    <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>,</td></tr><tr><td class="number">43</td><td>    <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>,</td></tr><tr><td class="number">44</td><td>    <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>,</td></tr><tr><td class="number">45</td><td>    <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span></td></tr><tr><td class="number">46</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>&#160;</td></tr><tr><td class="number">48</td><td>  <span class="p">#define MAT(m,r,c) (m)[(c)*4+(r)]  </span></td></tr><tr><td class="number">49</td><td>  <span class="p">#define MMUL(a,b,c,d) (MAT(mat1, a, b) * MAT(mat2, c, d))</span></td></tr><tr><td class="number">50</td><td>  </td></tr><tr><td class="number">51</td><td>&#160;</td></tr><tr><td class="number">52</td><td>  MAT<span class="k2">(</span>mat, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>  MAT<span class="k2">(</span>mat, <span class="n">0</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">54</td><td>  MAT<span class="k2">(</span>mat, <span class="n">0</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">2</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">55</td><td>  MAT<span class="k2">(</span>mat, <span class="n">0</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">0</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">3</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td>&#160;</td></tr><tr><td class="number">57</td><td>  MAT<span class="k2">(</span>mat, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>  MAT<span class="k2">(</span>mat, <span class="n">1</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>  MAT<span class="k2">(</span>mat, <span class="n">1</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">2</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">60</td><td>  MAT<span class="k2">(</span>mat, <span class="n">1</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">1</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">3</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">61</td><td>&#160;</td></tr><tr><td class="number">62</td><td>  MAT<span class="k2">(</span>mat, <span class="n">2</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>  MAT<span class="k2">(</span>mat, <span class="n">2</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td>  MAT<span class="k2">(</span>mat, <span class="n">2</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">2</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">65</td><td>  MAT<span class="k2">(</span>mat, <span class="n">2</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">2</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">3</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>&#160;</td></tr><tr><td class="number">67</td><td>  MAT<span class="k2">(</span>mat, <span class="n">3</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">68</td><td>  MAT<span class="k2">(</span>mat, <span class="n">3</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>  MAT<span class="k2">(</span>mat, <span class="n">3</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">2</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">70</td><td>  MAT<span class="k2">(</span>mat, <span class="n">3</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">=</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">1</span>, <span class="n">1</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">2</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">)</span> <span class="k3">+</span> MMUL<span class="k2">(</span><span class="n">3</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">3</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">71</td><td>&#160;</td></tr><tr><td class="number">72</td><td>  <span class="c">//glTranslatef (-pos.x, -pos.y, -pos.z);  </span></td></tr><tr><td class="number">73</td><td>  glLoadMatrixf <span class="k2">(</span>mat<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>&#160;</td></tr><tr><td class="number">75</td><td>  <span class="c">/* Assume MODELVIEW matrix already selected, and load our rotation */</span></td></tr><tr><td class="number">76</td><td>&#160;</td></tr><tr><td class="number">77</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

What exactly am I doing wrong? I want the camera to be able to fly around as if it were, say a space ship, or a plane, in and arround the cubes and whatnot.</p><p>edit, KittyCat has given me one fix:
</p><div class="source-code snippet"><div class="inner"><pre>  GLfloat mat2<span class="k2">[</span><span class="n">16</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span>
    <span class="n">1</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>,
    <span class="n">0</span>, <span class="n">1</span>, <span class="n">0</span>, <span class="n">0</span>,
    <span class="n">0</span>, <span class="n">0</span>, <span class="n">1</span>, <span class="n">0</span>,
    pos.x, pos.y, pos.z, <span class="n">1</span>
  <span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>
It helps a little, but now the arrow keys cause the camera&#39;s position to slowly rotate around its pos.</p><p>edit2, I&#39;ve commended the pos.Normalize(); and its going better.</p><p>edit3, Now, the camera doesn&#39;t move in the direction of the direction vectors...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 28 Feb 2006 12:23:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I usually store both rotation and position together in a struct (a class actually), and each as a vector, where the rotation vector indicates axis (the vector&#39;s direction) and angle (its length). This &quot;position&quot; struct can be used both for objects and for cameras. To activate it as a drawing offset (as an object position), do a glRotate() first, then a glTranslate(). To use as a camera, you do the translate first and with opposite signs, then the rotate, also with opposite signs.<br />To make the camera move, you&#39;ll need the front vector, which is a bit trickier using this approach. You can use the matrix sample code that comes with the gl documentation, or rip code from allegro, to convert the rotation angle into a matrix. Then all you need to do is use the appropriate row (or column? can&#39;t seem to remember) as front vector. <br />You won&#39;t need to know a lot more about matrix math than this, but it helps to think of a matrix as a local coordinate system with 4 vectors (x, y, z, w), that describe 3 axes and an origin (w). Multiplying a vector by a matrix means taking a local vector and calculating its position in absolute (real-world) space. Matrix multiplication means nesting several of these coordinate systems, and the resulting matrix can be used to transform directly from the innermost coordinate system to world-space.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Tue, 28 Feb 2006 12:46:47 +0000</pubDate>
	</item>
</rss>
