<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[A5] Trying to understand projection transformations</title>
		<link>http://www.allegro.cc/forums/view/617225</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 25 Jan 2018 04:29:27 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Following <a href="https://www.allegro.cc/forums/thread/617194">my previous thread about Allegro 5 transformations</a>, I&#39;m now trying to understand Allegro&#39;s projection transforms. </p><p>Suppose I have a 3D point <i>(x, y, z)</i> and I want to find out it&#39;s screen coordinates. Allegro uses an orthographic transform by default, does that mean I can simply ignore the <i>z</i> coordinate and draw, say, a rectangle representing that point at <i>(x, y)</i>?.</p><p>What if, instead, I set up a perspective transform using <span class="source-code">al_perspective_transform<span class="k2">(</span><span class="k2">)</span></span> and <span class="source-code">al_use_projection_transform<span class="k2">(</span><span class="k2">)</span></span>? How would I then find the screen coordinates for a point? I thought that using <span class="source-code">al_transform_coordinates_3d<span class="k2">(</span><span class="k2">)</span></span> with the current projection transform would give me the screen coordinates but the results I&#39;m getting are not what I expected. It seems like the resulting values from <span class="source-code">al_transform_coordinates_3d<span class="k2">(</span><span class="k2">)</span></span> lie within <i>(-1, -1)</i> and <i>(1, 1)</i> so I have to multiply those values by the screen -or window- width and height to get the actual screen coordinates, is that correct?. Also, I see there are a couple of new functions in 5.2.4 to simplify this kind of things, <span class="source-code">al_transform_coordinates_4d<span class="k2">(</span><span class="k2">)</span></span> and <span class="source-code">al_transform_coordinates_3d_projective<span class="k2">(</span><span class="k2">)</span></span>; haven&#39;t tried those yet since I&#39;m still using 5.2.3 but they look like what I need in this case, right?.</p><p>Finally, and somewhat related, Allegro&#39;s default projection transform uses near and far values of -1 and 1, respectively. That is not a problem if you&#39;re using only 2D operations but, as soon as you use any of the <span class="source-code">al_<span class="k3">*</span>_transform_3d<span class="k2">(</span><span class="k2">)</span></span> functions, it might be a problem. I know it makes sense that, if you&#39;re going to use any of the 3D transformation functions, you set up a corresponding projection transform but that may not be so obvious at first for unexperienced users, so I guess at least a mention about this in the documentation would be nice.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Wed, 17 Jan 2018 11:34:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The default transformation is given here: <a href="http://liballeg.org/a5docs/trunk/transformations.html#al_use_projection_transform">http://liballeg.org/a5docs/trunk/transformations.html#al_use_projection_transform</a></p><p>And yes, it will just ignore z and draw something at (x, y, z) at (x, y). And yes, it will not scale depth by default and so z outside of [-1..1] would get clipped. It would indeed be a good idea to mention that clipping behavior somewhere.</p><p>al_orthographic_transform says &quot;near/far is the z-buffer range, if there is no z-buffer you can set it to -1/1.&quot; which is misleading.</p><p>Maybe we can just change that to: &quot;near/far is the z range, coordinates outside of that range will get clipped. If you have al_draw_rectangle(0, 0, 100, 100) and rotate around the x axis (&quot;towards the screen&quot;), make sure your z range allows values from -100 to 100 or the rotated rectangle will get clipped.</p><p>Also, if you are using a depth buffer, this z range decides the depth resolution. For example if you have a 16 bit depth buffer you only have 65536 discrete depth values. So if your near/far is set to -1000000/1000000 most of your z positions would not result in separate depth values which could lead to artifacts.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Thu, 18 Jan 2018 00:01:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Something to keep in mind is that when you are setting a perspective projection, near and far must <b>both</b> be positive. They are the z-distance in front of the camera. It would never make sense to clip something behind the camera. Also, values of near near 0 will distort the image, as the values explode.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 18 Jan 2018 00:44:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sorry for the late reply.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617225/1034635#target">Elias</a> said:</div><div class="quote"><p> Maybe we can just change that to: &quot;near/far is the z range, coordinates outside of that range will get clipped. If you have al_draw_rectangle(0, 0, 100, 100) and rotate around the x axis (&quot;towards the screen&quot;), make sure your z range allows values from -100 to 100 or the rotated rectangle will get clipped.
</p></div></div><p>Yeah, that sounds about right. It could&#39;ve saved me, and may save others, a lot of trouble.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617225/1034637#target">Edgar Reynaldo</a> said:</div><div class="quote"><p> Something to keep in mind is that when you are setting a perspective projection, near and far must both be positive. 
</p></div></div><p>Interesting, I&#39;d have to experiment with that to see its effect. What about a transformation like the one mentioned by Elias (rotating a 100x100 rectangle around the X or Y axis)?.</p><p>This following question might be more fitting to my previous thread but since it&#39;s locked I&#39;m going to post it here. Maybe I still don&#39;t quite get the Allegro transforms but I thought these two transformations (one using Allegro and one using OpenGL) would be equivalent, however the result they produce is very different; what am I doing wrong here? Does it have anything to do with the projection transform?. The highlighted lines are where the transformations are defined:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro_opengl.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro_image.h&gt;</span>
<span class="number">  4</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="k1">int</span> SCR_WIDTH <span class="k3">=</span> <span class="n">800</span>, SCR_HEIGHT <span class="k3">=</span> <span class="n">600</span><span class="k2">;</span>
<span class="number">  7</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  8</span><a href="http://www.allegro.cc/manual/ALLEGRO_TRANSFORM"><span class="a">ALLEGRO_TRANSFORM</span></a> t<span class="k2">;</span>
<span class="number">  9</span><span class="k1">float</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 12</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_install_keyboard"><span class="a">al_install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>
<span class="number"> 15</span>    <span class="k1">uint32_t</span> version <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_allegro_version"><span class="a">al_get_allegro_version</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Allegro version: %d.%d.%d\n"</span>, version <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">24</span>, <span class="k2">(</span>version <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">16</span><span class="k2">)</span> <span class="k3">&amp;</span> <span class="n">255</span>, <span class="k2">(</span>version <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">8</span><span class="k2">)</span> <span class="k3">&amp;</span> <span class="n">255</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>    display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span>SCR_WIDTH, SCR_HEIGHT<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_init_primitives_addon"><span class="a">al_init_primitives_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>    <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>    al_orthographic_transform<span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">0</span>, <span class="n">0</span>, <span class="k3">-</span><span class="n">1000</span>, <span class="n">800</span>, <span class="n">600</span>, <span class="n">1000</span><span class="k2">)</span><span class="k2">;</span>   <span class="c">// Change default Z clipping</span>
<span class="number"> 23</span>    al_use_projection_transform<span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>    <span class="c">// al_identity_transform(&amp;t);</span>
<span class="number"> 25</span>    <span class="c">// al_use_transform(&amp;t);</span>
<span class="number"> 26</span>    <span class="k1">while</span> <span class="k2">(</span><span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 27</span>        <a href="http://www.allegro.cc/manual/ALLEGRO_TRANSFORM"><span class="a">ALLEGRO_TRANSFORM</span></a> move<span class="k2">;</span>
<span class="number"> 28</span>
<span class="number"> 29</span>        <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>
<span class="number"> 31</span>        <span class="c">// Using Allegro transforms</span>
<span class="number"> 32</span>        <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>        <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>move<span class="k2">)</span><span class="k2">;</span>
<div class="highlight"><span class="number"> 34</span>        al_rotate_transform_3d<span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">0</span>, <span class="n">1</span>, <span class="n">1</span>, i<span class="k2">)</span><span class="k2">;</span>  </div><div class="highlight"><span class="number"> 35</span>        <a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>move, <span class="n">250</span>, <span class="n">300</span><span class="k2">)</span><span class="k2">;</span>  </div><div class="highlight"><span class="number"> 36</span>        <a href="http://www.allegro.cc/manual/al_compose_transform"><span class="a">al_compose_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, <span class="k3">&amp;</span>move<span class="k2">)</span><span class="k2">;</span>  </div><div class="highlight"><span class="number"> 37</span>        <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>  </div><span class="number"> 38</span>
<span class="number"> 39</span>        <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">100</span>, <span class="k3">-</span><span class="n">100</span>, <span class="n">100</span>, <span class="n">100</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>        <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">10</span>, <span class="k3">-</span><span class="n">10</span>, <span class="n">10</span>, <span class="n">10</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>        <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">0</span>.<span class="n">5</span>, <span class="k3">-</span><span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span>.<span class="n">5</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>        
<span class="number"> 43</span>        <span class="c">// Using OpenGL</span>
<span class="number"> 44</span>        <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span> <span class="c">// Reset Allegro transforms</span>
<span class="number"> 45</span>        <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<div class="highlight"><span class="number"> 46</span>        glTranslatef<span class="k2">(</span><span class="n">500</span>, <span class="n">300</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>  </div><div class="highlight"><span class="number"> 47</span>        glRotatef<span class="k2">(</span>i <span class="k3">*</span> <span class="n">180</span> <span class="k3">/</span> <a href="http://www.allegro.cc/manual/ALLEGRO_PI"><span class="a">ALLEGRO_PI</span></a>, <span class="n">0</span>, <span class="n">1</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>  </div><span class="number"> 48</span>
<span class="number"> 49</span>        <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">100</span>, <span class="k3">-</span><span class="n">100</span>, <span class="n">100</span>, <span class="n">100</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 50</span>        <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">10</span>, <span class="k3">-</span><span class="n">10</span>, <span class="n">10</span>, <span class="n">10</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 51</span>        <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">0</span>.<span class="n">5</span>, <span class="k3">-</span><span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span>.<span class="n">5</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 52</span>
<span class="number"> 53</span>        <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 54</span>        <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">15</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 55</span>        i <span class="k3">+</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">1</span><span class="k2">;</span>
<span class="number"> 56</span>    <span class="k2">}</span>
<span class="number"> 57</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Thu, 18 Jan 2018 11:44:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The equivalent Allegro transform to your OpenGL one would be below, so the only difference should be the 250 vs 500. Are you seeing something different?</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
al_rotate_transform_3d<span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">0</span>, <span class="n">1</span>, <span class="n">1</span>, i<span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">500</span>, <span class="n">300</span><span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Fri, 19 Jan 2018 01:46:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, yeah, the move transformation is only there to draw both on the screen without overlapping, forgot to mention that. The rotation transform, though, I thought should be the same but this is what I get (the GIF has some artifacts not present in the actual output, but you can see the rotation is quite different):</p><p><span class="remote-thumbnail"><span class="json">{"name":"611213","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/1\/7\/1726eed8070a1bd4146aca7b25a5fdcf.gif","w":508,"h":288,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/1\/7\/1726eed8070a1bd4146aca7b25a5fdcf"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/1/7/1726eed8070a1bd4146aca7b25a5fdcf-240.jpg" alt="611213" width="240" height="136" /></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Fri, 19 Jan 2018 09:28:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What if you use al_rotate_transform_3d(&amp;t, 0, -1, 1, i); instead? I.e. flip the y axis - OpenGL has the y axis going up instead of down after all.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Sat, 20 Jan 2018 01:17:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Nope. Same result.</p><p>I&#39;ve noticed something, though.</p><div class="quote_container"><div class="title">al_rotate_transform_3d() documentation said:</div><div class="quote"><p>Combines the given transformation with a transformation which rotates coordinates around the given vector by the given angle in radians.</p></div></div><p>
So, for example, (0, 1, 1) and (0, 2, 2) represent the same rotation vector, right?. The weird scaling for the Allegro version of the transformation you can see in the GIF increases with the size of the vector; using (0, 5, 5) makes the Allegro animation be so huge it won&#39;t fit on the screen. The OpenGL version, on the other side, behaves just as with (0, 1, 1).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Sat, 20 Jan 2018 04:40:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ohh, I suppose it has to be a unit vector. Since changing a function is problematic with backwards compatibility we likely can only update the documentation and tell you to pass a unit vector as rotation axis.</p><p>Does that fix your example?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Sat, 20 Jan 2018 05:10:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh, that makes sense and yes, it does fix the output in my example. </p><p>I think mentioning this little detail in the documentation would indeed be the right thing to do. I think Allegro 4 had a function for normalizing a vector, right? Maybe adding a function like that to Allegro 5 could come in handy; after all, I see a couple new functions being added to the transformations section in 5.2.4.</p><p>Thanks a lot for your help.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Sat, 20 Jan 2018 09:16:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the report and trying the fix, I just filed a pull request to update the documentation: <a href="https://github.com/liballeg/allegro5/pull/880">https://github.com/liballeg/allegro5/pull/880</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Sat, 20 Jan 2018 09:37:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sorry for bumping this thread yet again but I just built Allegro 5.2.4 from git and, what&#39;s the difference between <span class="source-code">al_transform_coordinates_3d<span class="k2">(</span><span class="k2">)</span></span>, <span class="source-code">al_transform_coordinates_4d<span class="k2">(</span><span class="k2">)</span></span> and <span class="source-code">al_transform_coordinates_3d_projective<span class="k2">(</span><span class="k2">)</span></span>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Wed, 24 Jan 2018 06:52:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>al_transform_coordinates_3d takes three parameters, al_transform_coordinates_4d takes four and as the documentation says, al_transform_coordinates_3d_projective is a shortcut which divides by w.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Wed, 24 Jan 2018 06:59:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That does the documentation say, indeed. So, if I&#39;m getting it right, <span class="source-code">al_transform_coordinates_3d<span class="k2">(</span><span class="k2">)</span></span> simply applies the transform while <span class="source-code">al_transform_coordinates_3d<span class="k2">(</span><span class="k2">)</span>_projective<span class="k2">(</span><span class="k2">)</span></span> goes one step further and normalizes the resulting coordinates.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Wed, 24 Jan 2018 21:57:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you search for it on <a href="http://docs.liballeg.org">http://docs.liballeg.org</a>, you can actually click on the &quot;Source Code&quot; link for the function: <a href="https://github.com/liballeg/allegro5/blob/master/src/transformations.c#L467">https://github.com/liballeg/allegro5/blob/master/src/transformations.c#L467</a></p><p>So _projective actually calls the _4d version with w set to 1 then divides the other three coordinates by the resulting w.</p><p>The _3d version is identical to calling the _4d version with a w parameter of 0 (and ignoring the w return).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Thu, 25 Jan 2018 04:29:27 +0000</pubDate>
	</item>
</rss>
