<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-21561373</atom:id><lastBuildDate>Fri, 09 May 2008 19:29:54 +0000</lastBuildDate><title>WorldWinding</title><description/><link>http://www.urbanrobots.com/Blogs/WW/</link><managingEditor>noreply@blogger.com (Geoff)</managingEditor><generator>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-21561373.post-114056438352462532</guid><pubDate>Tue, 21 Feb 2006 23:18:00 +0000</pubDate><atom:updated>2007-01-17T06:59:35.383-08:00</atom:updated><title>What_nick's PHP script for dishing out BILs...</title><description>Tisham (&lt;a href="http://www.worldwindcentral.com/wiki/User:Whatnick"&gt;What_Nick&lt;/a&gt;, see his blog at &lt;a href="http://whatnick.blogspot.com"&gt;http://whatnick.blogspot.com&lt;/a&gt;) of Apogee (&lt;a href="http://www.apogee.com.au"&gt;http://www.apogee.com.au&lt;/a&gt;) sent me his PHP script for dishing out BILs behind a web server or a geo-trawler. It will take a source TIF, use GDAL to cut up the source elevation data into WW tiles (and corresponding directory structure), and then GZip the files for delivery.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$szMapCacheDir="G:/CFSImagery/wwcache/DEM";&lt;br /&gt;/* create the main cache directory if necessary */&lt;br /&gt;if (!@is_dir($szMapCacheDir))&lt;br /&gt;    makeDirs($szMapCacheDir);&lt;br /&gt;&lt;br /&gt;/* get the various request parameters &lt;br /&gt; * also need to make sure inputs are clean, especially those used to&lt;br /&gt; * build paths and filenames&lt;br /&gt; */&lt;br /&gt;$X = isset( $_REQUEST['X'] ) ? intval($_REQUEST['X']) : 0;&lt;br /&gt;$Y = isset( $_REQUEST['Y'] ) ? intval($_REQUEST['Y']) : 0;&lt;br /&gt;$L = isset( $_REQUEST['L'] ) ? intval($_REQUEST['L']) : 0;&lt;br /&gt;$T = isset( $_REQUEST['T'] ) ? intval($_REQUEST['T']) : 103;&lt;br /&gt;$szExt = ".7z";&lt;br /&gt;&lt;br /&gt;$szLevelcache = $szMapCacheDir."/$L";&lt;br /&gt;$szYcache = sprintf($szLevelcache."/%04d",$Y);&lt;br /&gt;if (!@is_dir($szYcache))&lt;br /&gt;    makeDirs($szYcache);&lt;br /&gt;$szCacheFile = sprintf($szYcache."/%04d_%04d".$szExt,$Y,$X);&lt;br /&gt;$szIntFile = sprintf($szYcache."/%04d_%04d.bil",$Y,$X);;&lt;br /&gt;/* Hit Test the cache tile */&lt;br /&gt;if (!file_exists($szCacheFile) || $bForce){&lt;br /&gt; $lzts = 1.0;&lt;br /&gt; //Our Layer Zero Tile Size&lt;br /&gt; &lt;br /&gt; $lat1 = ($Y*$lzts*pow(0.5,$L))-90;&lt;br /&gt; $lon1 = ($X*$lzts*pow(0.5,$L))-180;&lt;br /&gt; //Lat2 and Lon2 as figured from tile size and level&lt;br /&gt; $lat2 = $lat1 + $lzts*pow(0.5,$L);&lt;br /&gt; $lon2 = $lon1 + $lzts*pow(0.5,$L);&lt;br /&gt; if($T==103){&lt;br /&gt; if(($lat1&gt;-33)||($lon1&lt;138)||($lat2&lt;-36)||($lon2&gt;140)){&lt;br /&gt;  header("HTTP/1.0 404 Not Found");&lt;br /&gt;  exit();&lt;br /&gt; }&lt;br /&gt; else{&lt;br /&gt;  $gdalwarp = "gdalwarp.exe -te $lon1 $lat1 $lon2 $lat2 -ot Int16 -ts 150 150 -of ENVI ".&lt;br /&gt;  "G:/CFSImagery/latlong/dem/hillsdem.tif ".$szIntFile;&lt;br /&gt;  exec($gdalwarp);&lt;br /&gt;  $za7 = "7za.exe a ".$szCacheFile." ".$szIntFile;&lt;br /&gt;  exec($za7);&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; if($T==104){&lt;br /&gt; if(($lat1&gt;28)||($lon1&lt;9)||($lat2&lt;27)||($lon2&gt;11)){&lt;br /&gt;  header("HTTP/1.0 404 Not Found");&lt;br /&gt;  exit();&lt;br /&gt; }&lt;br /&gt; else{&lt;br /&gt;  $gdalwarp = "gdalwarp.exe -te $lon1 $lat1 $lon2 $lat2 -ot Int16 -ts 250 250 -of ENVI ".&lt;br /&gt;  "G:/CFSImagery/latlong/dem/LibyaDuneslatlonint ".$szIntFile;&lt;br /&gt;  exec($gdalwarp);&lt;br /&gt;  $za7 = "7za.exe a ".$szCacheFile." ".$szIntFile;&lt;br /&gt;  exec($za7);&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;$h = fopen($szCacheFile, "r");&lt;br /&gt;header("Content-Type: "."application/x-7z-compressed");&lt;br /&gt;header("Content-Length: " . filesize($szCacheFile));&lt;br /&gt;header("Expires: " . date( "D, d M Y H:i:s GMT", time() + 31536000 ));&lt;br /&gt;header("Cache-Control: max-age=31536000, must-revalidate" );&lt;br /&gt;fpassthru($h);&lt;br /&gt;fclose($h);&lt;br /&gt;&lt;/PRE&gt;</description><link>http://www.urbanrobots.com/Blogs/WW/2006/02/whatnicks-php-script-for-dishing-out.html</link><author>noreply@blogger.com (Geoff)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-21561373.post-114055702533389970</guid><pubDate>Tue, 21 Feb 2006 21:04:00 +0000</pubDate><atom:updated>2006-02-21T23:02:16.846-08:00</atom:updated><title>Viewing BIL files...</title><description>You've got a BIL, but want to look at the data. Here's how:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Make sure its not 7zip'd -- if it is, then unzip it. Usually you do not have to worry about this, as WW unzips them for you.&lt;/li&gt;&lt;li&gt;Make a copy of the file, and rename it to .raw&lt;/li&gt;&lt;li&gt;Figure out the dimensions of the file: you can do this by math or by looking at the .XML description. For instance, the SRTM30 has the following description inside C:\Program Files\NASA\World Wind 1.3\Config\Earth.xml&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;&lt;samplespertile&gt;&lt;p&gt;SamplesPerTile: 150&lt;br /&gt;DataFormat: Int16&lt;br /&gt;&lt;/ dataformat&gt;FileExtension: BIL&lt;br /&gt;CompressonType: 7z&lt;/p&gt;&lt;p&gt;This says that each tile is 150 x 150 pixels, with 16 bit integers. To use math, just take the file size of the uncompressed BIL (e.g. 45000 bytes for SRTM30 data), then divide by 2 (2 bytes per pixel), then square root (assuming all BILs are square). (45000 / 2) ^ 0.5 = 150 pixels.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Now, choose your poison to view the BILs. For quickness, I use IrfanView:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Load the .RAW file copy into Irfan View.&lt;/li&gt;&lt;li&gt;Set the RAW Parameters:&lt;br /&gt;The image width and height are calculated in step 3 above&lt;br /&gt;The file header is 0 bytes&lt;br /&gt;The BIL is 16 bits per pixel (or different, as spec'd in the XML file)&lt;/li&gt;&lt;li&gt;The color will give you only a rough idea, as it is using three channels to display a monochrome color.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;To view it in Photoshop:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Open the .RAW file in Photoshop&lt;/li&gt;&lt;li&gt;Set the RAW Parameters:&lt;br /&gt;The image width and height are calculated in step 3 above&lt;br /&gt;The number of channels is 1&lt;br /&gt;The Depth is 16 bits per pixel (or different, as spec'd in the XML file)&lt;br /&gt;The Byte order is IBM.&lt;br /&gt;The file header is 0 bytes&lt;/li&gt;&lt;li&gt;Pull up the levels adjustment (Ctrl-L)&lt;br /&gt;Move the gamma (center grey) tab to see the intermediate height values. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;More information:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.worldwindcentral.com/wiki/Add-on:Colored_SRTM_elevation_data_add-on"&gt;http://www.worldwindcentral.com/wiki/Add-on:Colored_SRTM_elevation_data_add-on&lt;/a&gt;&lt;br /&gt;&lt;a href="http://forum.worldwind.arc.nasa.gov/lofiversion/index.php?t5508.html"&gt;http://forum.worldwind.arc.nasa.gov/lofiversion/index.php?t5508.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://support.intergraph.com/Geospatial/Downloads/Tools.asp?ID=70&amp;SORT=Title"&gt;http://support.intergraph.com/Geospatial/Downloads/Tools.asp?ID=70&amp;amp;SORT=Title&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;i&gt;Note: the referenced TIF2BIL tool from Integraph above requires zifl00.dll -- which comes with INGR's I/RasC and ImageViewer. It also may be available in their &lt;a href="http://support.intergraph.com/Geospatial/Downloads/Tools.asp?ID=77&amp;SORT=Title"&gt;raster utilities&lt;/a&gt; (thanks &lt;a href="http://www.worldwindcentral.com/wiki/User:Mazop"&gt;Mazop!&lt;/a&gt;). &lt;/i&gt;&lt;em&gt;Also:from Pangloss: actually it's bil2tif not tif2bil; ISRUStandalone contains zirfl01.dll not zirfl00.dll.&lt;/em&gt;&lt;/p&gt;</description><link>http://www.urbanrobots.com/Blogs/WW/2006/02/viewing-bil-files.html</link><author>noreply@blogger.com (Geoff)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-21561373.post-113855573665434024</guid><pubDate>Sun, 29 Jan 2006 17:24:00 +0000</pubDate><atom:updated>2006-04-26T02:35:37.503-07:00</atom:updated><title>Working to a Solution in Precision issues</title><description>&lt;p&gt;GOOD NEWS/UPDATE: Chris has just implemented a much quicker, novel solution in the latest source code. As a result, I'm tabling this problem until we get to 1" pixels :-). Thank you Chris!&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;It's getting close to implementation time for solving the precision problems in the WorldWind base. To review, worldwind uses a lat,lon,meters coordinate system. When navigating in this space, any given location is subject to the precision of the numbers being used to represent your position (and the precision of all objects in the space). WW is constrained (as are most PC-based 3D applications) to Single precision 32 bit floating point precision. This works great for viewing the earth from outerspace, all the way down to a few meters. But, starting dealing with items below a few meters and the precision errors cause a number of problems, including jitter in the camera.&lt;br /&gt;&lt;br /&gt;For more background, please see the earlier post (I believe the &lt;em&gt;first&lt;/em&gt; post).&lt;br /&gt;&lt;br /&gt;There are several potential implementation solutions, but lets first talk about why some of the quick hacks don't work (to remind ourselves why TANFL):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color:#ffcc00;"&gt;Why not just switch to doubles?&lt;/span&gt; Great idea! Except the graphics cards these days do not support doubles in hardware. All rendering would become software based, and there goes those lovely framerates.&lt;/li&gt;&lt;li&gt;&lt;span style="color:#ffcc33;"&gt;Why not just use doubles everywhere, and then switch to singles at the last moment?&lt;/span&gt; This actually does help -- anytime you multiply/add/trig-ify single precision floating point numbers you worsen their error. Making all these calcs be double precision minimizes that error. This is a necessity in any solution. But the end problems still exist inside WW the moment you do your final double to single conversion. The viewpoint is inherent constrained to be at the finite and discrete set of numbers representable by single precision. You camera and objects will always be jumping to those points.&lt;/li&gt;&lt;li&gt;&lt;span style="color:#ffcc33;"&gt;What if we just make the viewpoint be super high res through some custom method (e.g. doublizing), and then just update the viewpoint calculations to be CPU based instead of native GPU based?&lt;/span&gt; Great... except you've got all the objects on the planet too... what coordinate space are they in? -- still the same old single-fp coordinate system. How do you map the two together? Ultimately, they will have to be mapped together, and as long as you are using geodetic lat/lon/alt centered in the earth, you'll hit the issue.&lt;/li&gt;&lt;li&gt;&lt;span style="color:#ffcc33;"&gt;What if we maximize our coordinate system around zero by using smaller numbers? &lt;/span&gt;The discrete space representated by floating points inherently have more precision around zero. When not make lat/lon be represented by radians, and altitude to be representated by kms? I actually like this as a quick fix... but at most it will give you a 2-3X improvement, which will get you down to 2 foot resolution, but still with areas of inconsistency. And the solution has its limits -- significant digits are significant digits in the end, despite the radial nature of the floating point implementation around zero.&lt;/li&gt;&lt;li&gt;&lt;span style="color:#ffcc33;"&gt;What if we just put the fix into QTS? &lt;/span&gt;I like it, but this is still problematic... think of the lat/lon grid lines. Ultimately, they must all share the same rendered coordinate system in order to be visually consistent.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ok.. quick hacks are a no go. What next?&lt;br /&gt;&lt;br /&gt;In his paper at &lt;a href="http://planet-earth.org/cw05/FloatingOrigin.pdf"&gt;http://planet-earth.org/cw05/FloatingOrigin.pdf&lt;/a&gt;, Chris Thorne points out three classes of solutions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;On the fly shifting of coordinates&lt;/li&gt;&lt;li&gt;Multiple local coordinate systems&lt;/li&gt;&lt;li&gt;Piecewise shifting of coordinates in a continuous virtual world&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I've taken the bent that we should strive to have Worldwind operate in as much of a continuous world as possible. The user should be able to zoom in smoothly to any spot on the globe... This presents problems with nearly all approaches, except his FO solution.&lt;br /&gt;&lt;br /&gt;A problem that Chris Thorne does not seem to address in his paper regarding his Floating Origin solution lies in the updating of all those objects to be moved around the now constant eyepoint. Before, with a roaming eyepoint, we allowed the GPU to perform one last matrix operation near the end of the pipeline to construct the rendered image. With the FO approach, however, you've taken that operation out of the pipeline and have placed it in the object's position earlier in the pipeline. But worse, you've likely taken it out of the GPU and into the CPU. All objects must be recalced with a viewpoint change.&lt;br /&gt;&lt;br /&gt;There are likely some ways to ensure that the change stays in the GPU. (Need to think more here).&lt;br /&gt;&lt;br /&gt;But until then, I personally am leaning towards a piecewise solution of multiple local coordinate systems. Here, we make the origin be to some local location, and then move the eyepoint within this state. Recalculation of all the object locations only occurs when you transition from this local coordinate space to another.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ffcc33;"&gt;First question: what grid structure?&lt;br /&gt;&lt;/span&gt;Well.. what do you know... Worldwind already has a grid structure in place as defined by its QTS naming scheme. Granted, this structure varies from one QTS to the next, but the underlying SRTM terrain grid effectively is always loaded. I am thinking to use this SRTM level 0 (or more likely 1 or 2) gridding to be basis for the local coordinate systems.&lt;br /&gt;&lt;br /&gt;The grid structure needs to be not just lat/lon based, but altitude based. This allows us to retain our current earth centered coordinate system when zoomed completely out. We can then rotate the earth like crazy without incurring coordinate system shifts.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ffcc33;"&gt;Next question: how do we implement the local coordinate system?&lt;br /&gt;&lt;/span&gt;Well, first off, we base the coordinate system on the lat/lon/alt of level 1 or 2 of SRTM. All objects call a single routine (usually) to convert a lat/lon/altitude into the final coordinate space. This function needs to be updated to take into account the local coordinate system if present. All objects drawing items into the coordinate space must use this function to translate from lat/lon/alt to coordinate space. If they don’t, then they won’t work. Furthermore, this function needs knowledge of the current coordinate system in place. I don’t think it will always be derivable from the current camera position, so better to store it directly in the drawArgs, which gets passed into these coordinate translation routines.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ffcc33;"&gt;Next question: how do we handle the transition – specifically the recalculation of all the objects? &lt;/span&gt;Doing the smoothly is the biggest question, and one that I’m not going to try and solve. Why?... read on&lt;br /&gt;&lt;br /&gt;The recalculation to the new coordinate space is effectively like performing a device reset (e.g. resize the window). I believe that the coordinate system switch should even force such a path of execution to occur in the code. Force all items to dispose themselves (or at least their MDX resources) and reconstruct themselves based on the new coordinate space. This seems drastic yes... but think about it... after a device reset, the various (well-behaved) layers do what they can immediately on the primary render thread, and then use the background update thread to load up their various resources. This will allow us to do all of the moving of the objects on the background thread with no new code. The downside is that after a transition, you’ll see data disappear and then reappear.&lt;br /&gt;&lt;br /&gt;That’s not too bad.. But bad enough that I think a fix for QTS is warranted to prevent it from doing an actual dispose of the MDX resources, but rather, just a remapping (it’s the reloading of those textures from disk that scares me).&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ffcc33;"&gt;Next question: how do we prevent jitter on the transition boundaries?&lt;br /&gt;&lt;/span&gt;First.. remember how I suggest that we make the coordinate systems be 3D? This is to allow us to keep our existing global coordinate system at zoomed out locations.&lt;br /&gt;&lt;br /&gt;Noting this makes it clear that transitions, however, occur in a 3D space. You can hover between two coordinate systems in both lat,lon locations as well as altitude.&lt;br /&gt;&lt;br /&gt;Now, how to handle these 3D boundaries? We should have plenty of room in the precision of the coordinate spaces to not worry about being a full grid off. Therefore, we should have a “tolerance” of grid changes to be a full grid size. That is, don’t switch to the next coordinate system until we’ve gone two coordinate systems away. This effectively makes each coordinate system have a bleeding edge of one additional unit.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ffcc33;"&gt;Next question: how do we handle flight? What if we are going from one location in one coordinate space to another location in another coordinate space?&lt;br /&gt;&lt;/span&gt;The camera movement class must also be aware of coordinate space transitions.&lt;br /&gt;&lt;br /&gt;So, in going with a local coordinate system, we incur a frame rate spike on a coordinate system switch.&lt;br /&gt;&lt;br /&gt;Open Item : adjusting the clipping planes and z-buffer&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description><link>http://www.urbanrobots.com/Blogs/WW/2006/01/working-to-solution-in-precision.html</link><author>noreply@blogger.com (Geoff)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-21561373.post-113840550088345966</guid><pubDate>Fri, 27 Jan 2006 23:44:00 +0000</pubDate><atom:updated>2006-12-24T19:11:49.160-08:00</atom:updated><title>Why are there no comments in Worldwind?</title><description>Obvious no? It ensures faster checkout times.</description><link>http://www.urbanrobots.com/Blogs/WW/2006/01/why-are-there-no-comments-in-worldwind.html</link><author>noreply@blogger.com (Geoff)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-21561373.post-113835444215063350</guid><pubDate>Fri, 27 Jan 2006 09:33:00 +0000</pubDate><atom:updated>2006-03-01T22:18:39.013-08:00</atom:updated><title>Struts, Struts, Struts</title><description>&lt;span style="font-family:trebuchet ms;"&gt;Ok -- struts -- what are they? how do I get rid of them? and why are they there?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.urbanrobots.com/Blogs/WW/uploaded_images/Struts-751109.jpg" border="0" /&gt;&lt;br /&gt;Ever seen something like the above picture? You've inserted your own image, particularly one that has been converted to a QuadTileSet (QTS) -- e.g. with dstile -- and then display it, and you get this bizarre under structure, seemingling holding up your picture off the ground. These are what I call struts.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#ffcc00;"&gt;Why are struts there?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Struts are part of WorldWind code base ironically to solve another problem: intra-tile seams/cracks. Imagine if you were to take a white sheet of paper, cut it into 50 equal tiles, and then reassemble that piece of paper into its original shape on top of a flourescent orange desktop. No matter how good you are at putting those tiled pieces of paper together, you are bound to see through the tiles to the underlying desk, particularly if you were to take a look at it from various directions. Imagine this piece of paper was crumbled up first, then "flattened" again, and the texture of the "terrain" of the paper would make the problem even worse.&lt;br /&gt;&lt;br /&gt;Well, that "even worse" example is exactly what the 3D rendering engine has to do inside WorldWind and your graphics card. You eventually start to see through the spaces in between the tiles. Plus, the tile to terrain mapping varies from one QTS to the next, exacerbating the problem. Each point is calculated uniquely, with potentially different parameters -- leading to disconnect between tiles.&lt;br /&gt;&lt;br /&gt;Struts were a novel solution for this problem. Effectively, they created a similarly colored structure at the corners of each tile projected down to the spherical geoid that WW uses as the "sea level" earth. Furthermore, the z buffer is cleared before displaying the QTS layer, allowing you to see the struts on top of what should otherwise be displayed underneath it.&lt;br /&gt;&lt;br /&gt;If your imagery is largely continuous, then this really presents no problem, as there will be no location where you can see the imagery from the side. That's why it works great for the primary data sources. For your own imagery, however (such as the example above), you'll hit the problem. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;More info can be found at: &lt;/span&gt;&lt;a href="http://www.worldwindcentral.com/chat/irclog/worldwind-dev/2006-01-19.log"&gt;&lt;span style="font-family:trebuchet ms;"&gt;http://www.worldwindcentral.com/chat/irclog/worldwind-dev/2006-01-19.log&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;span style="color:#ffcc33;"&gt;Quick Fix: Removing Struts&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Let's say you want to prevent the struts from drawing. Well, Chris put in a simple quick fix for removing the struts from view. With 1.3.3.1, WorldWind supports alpha blended layers. As you can imagine, alpha blended layers with struts can cause havoc to a scene. Therefore, WW is set to remove struts from the render loop when an image is in any way transparent. Therefore, as ddh and mazop have suggested, switch your layer's opacity to 254 and set the blending to bothsrcalpha. This is the quick and easy fix with no programming necessary. Note: in doing this, however, you've just traded the struts problem for the underlying seams problem -- which will now rear its ugly head.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;Another way to remove the struts is just to modify the code to expose a UseStruts property off of the QTS. This UseStruts property should map to a UseStruts boolean inside the QuadTileArgs setting. Then, in your QuadTile::CreateElevatedMesh() routine, simply add the check for the UseStruts boolean:&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;if ((!QuadTileArgs.UseStruts m_CurrentOpacity &lt;&gt;&amp;&amp;amp;&lt;br /&gt;heightData != null) {&lt;br /&gt;radius = layerRadius +&lt;br /&gt;heightData[terrainLatitudeIndex + latitudePoint,&lt;br /&gt;terrainLongitudeIndex + longitudePoint] *&lt;br /&gt;verticalExaggeration;&lt;br /&gt;} else {&lt;br /&gt;radius = meshBaseRadius;&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;color:#ffcc33;"&gt;Other solutions&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;The above trick, just trades one problem for another. The solution space to the strut problem is divided into two camps: #1) use the struts, but make them not visible, and #2) removing the struts altogether, and solving the underlying seams problem a different way. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;span style="color:#ffcc33;"&gt;Ideas for #1: Making the struts invisible&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Here are my brainstormed ideas on how to make the struts still present but just not visible on non continuous imagery:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;A quick hack would be to not clear the Zbuffer, and let the previous terrain hide it. Problem is, you start to have zbuffer fighting from data placed on top of each other. Plus, you will always have to have underlying data.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;What if we implement a global ImageAccessor that behaves more like the TerrainAccessor in WW? Here, we have one global image, on which textures are rendered. Then, we just logically replace the image space for that pixel area. Then, at the final render, we map that accumulated screen-sized texture down to the mesh. The downside with this is that it moves the heavy lifting out of the GPU -- effectively modeling your own frame buffer. Overkill and not a good idea.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;What about just shortening the struts, or even varying their length based on the obliquity of the camera?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;What about some funky experimentation with backface culling? I noticed that the fact that the struts do have backface culling doesn't seem to interrupt their ability to solve the problem when they should be being backfaced culled. What if we turned on back &lt;em&gt;and &lt;/em&gt;front culling!? possible?&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;span style="color:#ffcc33;"&gt;Ideas for #2: Solving the Seams problem a different way&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;More ideas, this time to solve the seams through a different method. Note: these all assume that you've removed the struts.&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Use vertex shaders on the edge vertices of a tile, similar to what &lt;/span&gt;&lt;a href="http://research.microsoft.com/~hoppe/"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Hoppe&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; proposes.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;The seams are exacerbated by the tiles being drawn on a grid different than the source mesh data. If you were to match your QTS parameters of your imagery to that of the terrain data, you should have imagery/texture tiles being mapped one-to-one (at least on the edges) to the underlying terrain/mesh tiles. Then, interpolation becomes almost irrelevant, and in theory, the seams disappear. (not sure if this really works though -- more thought needed)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Similarly, if you map your imagery to the underlying "reference" imagery texture QTS tile parameters, then you should be guaranteed to generate the exact same altitude values for each mesh vertex. Then, make the Zbuffer to not be cleared. Then, you should see identical z values stored for your mesh, and your imagery's texture should replace the reference imagery (i.e. z-fighting won't be an issue). This works assuming a) only one reference imagery underneath, and b) the two layers have their Update()'s called relatively simultaneously. This solution hints more at the need for a common grid. More thought is needed -- and keep in mind this reminder from DDH: "the TerrainAccessor is only used to get a elevation from a lat/lon, it's not part of the mesh system. but the problem is that the QTS layers are not defined in a single well-defined grid, they can be arbitrarily defined."&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Similarly, can we draw directly onto the landsat mesh, instead of creating our own?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;I'm not sure the tiles are always using the TerrainAccessor at the best resolution. This difference could easily cause disparities in the mesh, exacerbating the seams. Look into possible fixes like one that &lt;span style="color:#ffcc00;"&gt;always force the highest resolution terrain tile&lt;/span&gt; (on GetElevationAt()) with the highest #of samples per degree for all mesh points on the edge vertices of a tile. More thought needed - not sure if it does this already.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Trebuchet MS;"&gt;Also, each tile may be calling the TerrainAccessor with different values -- those in the distance may be using a lower samples-per-degree number than nearby tiles. Where these tiles butt up against each other will show seams. Perhaps force a mesh-wide tile level inside QTArgs?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Similarly, I've noticed that the seams go away if you've got better imagery at a higher tile level. This makes me&lt;span style="color:#ffcc00;"&gt; continue to think that having one or two more levels of finer grain mesh and/or imagery than your current visible would alleviate much of the problem&lt;/span&gt;. This can be easily implemented using QTSubset.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Similarly again, what if we were to use QTSubset to draw something else underneath, e.g. a quad that is slightly larger than the tile, and a colors that match the four corners. Hacky, yes. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;There are hints from Mashi that there is a bug in the WW code that makes the seams worse than they should be. From dpatton: "150 samples in a terrain tile, and Chris was using 150 as an upper bound, rather than 149(i.e. 0-149)". This would cause a problem -- and &lt;span style="color:#ffcc00;"&gt;worth looking into&lt;/span&gt;. I can't imagine it would solve it completely -- but would help make the tiles line up tighter.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;What am I personally going to do to solve it? For me, with higher resolution data, the seams actually are manageable, as long as you wait for the higher res terrain+imagery tiles to come in. Thus, I've just disabled the strut code as above -- which appears to handle the problem sufficiently for short term needs. I think the best next-round solution is to force higher res on the mesh/texture -- or at least figure out conclusively why it is solving the seams problem for me. This would start to lean towards some of the solutions proposed in #2 above.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/p&gt;</description><link>http://www.urbanrobots.com/Blogs/WW/2006/01/struts-struts-struts.html</link><author>noreply@blogger.com (Geoff)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-21561373.post-113835024536408638</guid><pubDate>Fri, 27 Jan 2006 07:25:00 +0000</pubDate><atom:updated>2006-01-27T15:57:35.916-08:00</atom:updated><title>What is the relationship between QuadTile, QuadTileSet, and QuadTileSubset?</title><description>You know, I've had to re-answer this question so many times to myself, that its overdue that I write it down. If you want to do much with spatial data in world wind, the QTS is a must-know.&lt;br /&gt;&lt;br /&gt;I don't want to explain what QuadTiles are in general, or why they are there. Suffice it to say, it is WorldWind's mechanism for preprocessing large areas of imagery to be more quickly rendered. It is effectively the LOD solution in WW for spatial data. It handles mipmapping and chunking, and simultaneously/parallel downloading of individual small chunks - among many things.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ffcc00;"&gt;QTS:&lt;/span&gt; QuadTileSet is the master object in the QTS tree. It contains the QuadTileArgs, and the topmost QuadTiles (as stored in m_topmostTiles hash).&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ffcc00;"&gt;QTA:&lt;/span&gt; QuadTileArgs are the base class for storing all the information on how a QTS tree is to be rendered, and is used to communicate rendering data between the parent QuadTileSet (which "owns" the QTA object) and its QT's.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ffcc00;"&gt;QT:&lt;/span&gt; A QuadTile represents a single QuadTile in the tree. It represents a single block of imagery out of the larger QTS tree, and each is rendered separately. It also contains pointers to its four children in the quadtree. It maintains its own vertices for each quadrant. Of important note: a QT actually renders itself by breaking its own tile into four quadrants with corresponding vertices, using the corresponding quadrant subsets of the tile's imagery as its texture. That is why it needs vertices for each quadrant. Lastly, it has pointers to its QTSub's.... which lead's us to....&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ffcc00;"&gt;QTSub&lt;/span&gt;: Everything above is as you'd expect. So what's this QuadTileSubset stuff? Subset of what? QTSubs are special variations of the QuadTile that are at the leaves of a QuadTileSet tree (only created at level+1 &gt;= QTA.IA.LevelCount). QTSubs allow continued tiling at and after the furthest level is reached for a QTS tree. They link back to the parent QT tile that has imagery stored in a texture. Much of the QTSub code is copy/pasted from QT, with minor tweaks.&lt;br /&gt;&lt;br /&gt;Now -- the obvious question -- why is there a QTSub? Why do you need to keep tiling and tiling once you've run out of imagery? The answer lies in the fact that you are rendering not just spatial imagery, but terrain. The QTSub objects forces the imagery to be shown with full terrain detail, ** particularly when the terrain detail exceeds the resolution of your spatial imagery.&lt;br /&gt;&lt;br /&gt;Other QTS Questions:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color:#ffcc00;"&gt;Does it render all QTS tiles from level 0 to n (where n is the level currently visible)? &lt;/span&gt;&lt;span style="color:#cccccc;"&gt;Because a tile is actually rendered by rendering the quadrant subsections of its image, it can check for success when passing a render call to its children. If it fails, then it draws itself. Therefore, each QTS QuadTile will render a tile only if its child hasn't taken care of rendering the quadrant, and so on, and so on.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#ffcc00;"&gt;What does the surface renderer due? is it used?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#ffcc00;"&gt;How are tile sizes calc'd in the infamous row/col/level tuple &lt;-&gt; lat/lon coordinate mapping functions?&lt;/span&gt;: tile sizes are always determine from the distance beween north and south (lat). &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;What would I do if I could run the candy store? I'd start by getting rid of the variations between QTS, QT and QTSub. It should be a relationship similar to .NET collection and collection members. QTS should be a lightweight collection-like class (tree oriented), with a single root tile (it's 80% there). QT and QTSub should be merged, with the access to the imagery being better abstracted to handle "subset" cases.&lt;/p&gt;</description><link>http://www.urbanrobots.com/Blogs/WW/2006/01/what-is-relationship-between-quadtile.html</link><author>noreply@blogger.com (Geoff)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-21561373.post-113834260301063185</guid><pubDate>Fri, 27 Jan 2006 06:16:00 +0000</pubDate><atom:updated>2007-01-16T04:05:23.936-08:00</atom:updated><title>Running WorldWind without a net connection or with local storage...</title><description>This seems to be a common question and need. I'm going to jot down my notes as I go along. I don't have a solution yet (not for complexity, just time).&lt;br /&gt;&lt;br /&gt;First, if a net connection is "kind of" there, but not really (e.g. a net connection in need of repair, or a bad url), the underlying .NET infrastructure is ruthlessly persistent at trying to make a broken connection work -- gladly running off for up to 100 seconds before failing. Multiply this by the 25 or so tiles that are trying to be shown at any given moment, and your Update thread will be spinning for hours (well... 41:40 minutes to be exact). You will be left with spin lat/lon lines over an empty earth for at least 4-5 minutes before it really gives up.&lt;br /&gt;&lt;br /&gt;Quick simple hack it to adjust the request.Timeout to be ~3-4 seconds in WorldWind.Net.WebDownload's Download() routine. This is still hacky, as it waits around for still 10's of seconds, while potentially killing downloads for those with slow net connections.&lt;br /&gt;&lt;br /&gt;One real solution is to maintain some knowledge of the net connection across all of the quad tile requests, and ideally allocate one thread for testing connectivity to each potential datasource on the net. This will not tie up the main update thread with connection requests, as a tile can gladly check the state of the connectivity before doing anything.&lt;br /&gt;&lt;br /&gt;Caveat/Todo: I have not yet looked closely at the GeoSpatialDownloadRequest DownloadRequest inside a Quadtile to see if it is shared by all tiles in a QTS (assuming a QTS will have a common server). If this is the case, then perhaps this code really does the universal connection management or just needs augmenting (e.g. to force it off the main update thread). From all accounts, the download queues held in QuadTileArgs should do all this, haven't had time yet to figure out why not.&lt;br /&gt;&lt;br /&gt;It would also be nice to have the imageAccessor be smart about accessing data for "permanent" directory data -- a discussion in a previous post. The quadtiles are set up to fail frequently, instead of flagging incompletes. See &lt;a href="http://issues.worldwind.arc.nasa.gov/browse/WW-478"&gt;http://issues.worldwind.arc.nasa.gov/browse/WW-478&lt;/a&gt; as an example.</description><link>http://www.urbanrobots.com/Blogs/WW/2006/01/running-worldwind-without-net.html</link><author>noreply@blogger.com (Geoff)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-21561373.post-113833819990983574</guid><pubDate>Fri, 27 Jan 2006 04:58:00 +0000</pubDate><atom:updated>2006-01-27T19:22:02.893-08:00</atom:updated><title>What's this blog about?</title><description>OK, I've made a few posts, and found that it can be helpful to me.&lt;br /&gt;&lt;br /&gt;So what is this blog all about?&lt;br /&gt;&lt;br /&gt;It's captures my mental state when coding and extending elements of WorldWind. &lt;strong&gt;If you are a WorldWind user, then this blog is not for you.&lt;/strong&gt; If you are a WorldWind &lt;strong&gt;coder&lt;/strong&gt;, then you might find it useful.&lt;br /&gt;&lt;br /&gt;And as for you, dear reader.... I assume nothing about you, as it is written primarily for my own purposes. I just need a place to jot notes down about the WorldWind code base. So -- everything I write here can be wrong, poorly worded, naive and incomplete. I am posting it up to the world for the sake of openness, ala the spirit of OpenSource.&lt;br /&gt;&lt;br /&gt;Lastly, because these are notes, I am frequently updating blog entries from previous days as new data/info comes available.&lt;br /&gt;&lt;br /&gt;But also to the spirit of opensource, feel free to comment and contact me, though, if you have questions. Enjoy!</description><link>http://www.urbanrobots.com/Blogs/WW/2006/01/whats-this-blog-about.html</link><author>noreply@blogger.com (Geoff)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-21561373.post-113833787627743313</guid><pubDate>Fri, 27 Jan 2006 04:54:00 +0000</pubDate><atom:updated>2006-01-27T01:09:47.116-08:00</atom:updated><title>What is an ImageAccessor anyways?</title><description>&lt;p&gt;I keep thinking the ImageAccessor is the answer to all my problems, and I keep getting disappointed (with all due respect to ddh, it's just the name that's killing me). I keep thinking the ImageAccessor is a onestop shop for all WW objects to access the current imagery at any particular lat lon across all layers. Not too much different than the terrainAccessor.&lt;br /&gt;&lt;br /&gt;Alas, it's almost, but no. There has been plenty of discussion about implementing a global mesh and/or a global imagery/texture object -- but the image accessor is not that. (at least for now, in 1.3.3.1) &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Foremost, there is one and only one ImageAccessor per QTS tree, as specified in its QuadTileArgs. Essentially, you should always create a new ImageAccessor before creating a new QuadTileSet.&lt;/li&gt;&lt;li&gt;It really is just a class to help translate, for any given QTS, the level/row/col tuple for the QTS into a specific filename of an image.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Real Basic.... but for potential to be so much more :-)&lt;/p&gt;</description><link>http://www.urbanrobots.com/Blogs/WW/2006/01/what-is-imageaccessor-anyways.html</link><author>noreply@blogger.com (Geoff)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-21561373.post-113833554276872804</guid><pubDate>Fri, 27 Jan 2006 04:13:00 +0000</pubDate><atom:updated>2006-12-16T09:06:52.456-08:00</atom:updated><title>Dynamic QTS</title><description>One of the things we've been working on is a dynamic QTS solution. We need to have support for QTS trees that are created underneath us dynamically on our local drive. Why? Imagine spawning a dstile &lt;em&gt;from within WorldWind &lt;/em&gt;when a user clicks on a local image.&lt;br /&gt;&lt;br /&gt;Implementing this bumps up against several issues inside WW. First, QTS trees must be implemented to spawn the task request to tile an image (e.g. to dstile). Second, it must be able to "fix" the exception handling inside a QTS tree for missing tiles (which now becomes acceptable, assuming you are waiting for that particular tile to render). Thirdly, it must implement a dynamic timeout for finding tiles in a QTS tree.&lt;br /&gt;&lt;br /&gt;To solve the first task (spawning the request), the solution is trivial.&lt;br /&gt;&lt;br /&gt;To solve the second task (fixing the exception in 1.3.3.1), see the bug I posted in &lt;a href="http://issues.worldwind.arc.nasa.gov/browse/WW-478"&gt;http://issues.worldwind.arc.nasa.gov/browse/WW-478&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lastly, to implement the dynamic timeout for a tree tile, simply follow the suggested solution inside the above JIRA bug notice.&lt;br /&gt;&lt;br /&gt;Now... here's the tricky part. What if you're imagery is not contiguous, or has areas where no imagery is present. In this case, your QTS tree file generator (e.g. dstile) should be smart enough to not create the file to begin with. But... with a dynamic QTS, you'll not know how to distinguish between a valid tile that just hasn't had its file written yet, and a blank one that will never be written. Worse yet, in the normal case, you'll frequently be doing disk checks (hopefully just fstats, underneath the .net hood) for the file's existence on the update worker thread.&lt;br /&gt;&lt;br /&gt;To solve this last problem really requires better integration with your tiler, e.g. dstile.&lt;br /&gt;&lt;br /&gt;If you'd like sample source of what I've done, let me know. But... we've got our own dstile'r.</description><link>http://www.urbanrobots.com/Blogs/WW/2006/01/dynamic-qts.html</link><author>noreply@blogger.com (Geoff)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-21561373.post-113832425701385276</guid><pubDate>Fri, 27 Jan 2006 00:43:00 +0000</pubDate><atom:updated>2006-01-28T21:32:51.390-08:00</atom:updated><title>Solving the coordinate precision problems in WorldWind</title><description>&lt;p&gt;This posting is meant to store away relevant material for solving the coordinate system precision problems in WorldWind. It's written for me as notes for me, but maybe it will help you!&lt;br /&gt;&lt;br /&gt;#1 -- Statement of problem: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://issues.worldwind.arc.nasa.gov/browse/WW-76"&gt;http://issues.worldwind.arc.nasa.gov/browse/WW-76&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://issues.worldwind.arc.nasa.gov/browse/WW-477"&gt;http://issues.worldwind.arc.nasa.gov/browse/WW-477&lt;/a&gt;&lt;/li&gt;&lt;li&gt;ht&lt;a href="http://www.terrainmap.com/rm45.html"&gt;tp://www.terrainmap.com/rm45.html&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;#2 -- Problem manifestations &lt;/p&gt;&lt;ul&gt;&lt;li&gt;"Jitter" at high resolution&lt;/li&gt;&lt;li&gt;Poor Picking Rays -- difficulty with moving the camera in high res&lt;/li&gt;&lt;li&gt;tiling naming output : &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;#3 -- Google search terms: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;worldwind jitter&lt;/li&gt;&lt;li&gt;gamasutra jitter&lt;/li&gt;&lt;li&gt;global coordinate scenery jitter &lt;/li&gt;&lt;li&gt;Heizenberg range&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;#4 -- Possible solutions / Problem discussions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.surak.com.au/~chris/PrecisionInVRML/PrecisionInVRML.htm"&gt;http://www.surak.com.au/~chris/PrecisionInVRML/PrecisionInVRML.htm&lt;/a&gt; for the same issue in GeoVRML&lt;a href="http://www.surak.com.au/~chris/PrecisionInVRML/SinglePrecisionGeoVRML.html"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;nhv suggestion: FlightGear, &lt;a href="http://www.flightgear.org"&gt;http://www.flightgear.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blitzcoder.com/cgi-bin/ubb-cgi/postdisplay.cgi?forum=Forum4&amp;topic=000352"&gt;http://www.blitzcoder.com/cgi-bin/ubb-cgi/postdisplay.cgi?forum=Forum4&amp;amp;topic=000352&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://planet-earth.org/cw05/FloatingOrigin.pdf"&gt;http://planet-earth.org/cw05/FloatingOrigin.pdf&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gamasutra.com/features/20020712/oneil_01.htm##"&gt;http://www.gamasutra.com/features/20020712/oneil_01.htm##&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ai.sri.com/~reddy/geovrml/double/"&gt;http://www.ai.sri.com/~reddy/geovrml/double/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pastebin.com/527915"&gt;http://pastebin.com/527915&lt;/a&gt; -- ddh's recent work (splitting lat SP into two separate values -- haven't evaluated yet)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gameprogrammer.com/4-fixed.html"&gt;http://www.gameprogrammer.com/4-fixed.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_2_API/j3dguide/VirtualUniverse.doc.html#49034"&gt;http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_2_API/j3dguide/VirtualUniverse.doc.html#49034&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.surak.com.au/~chris/PrecisionInVRML/SinglePrecisionGeoVRML.html"&gt;http://www.surak.com.au/~chris/PrecisionInVRML/SinglePrecisionGeoVRML.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/retinax/"&gt;http://sourceforge.net/projects/retinax/&lt;/a&gt; and &lt;a href="http://sourceforge.net/forum/forum.php?forum_id=523573"&gt;http://sourceforge.net/forum/forum.php?forum_id=523573&lt;/a&gt; for scene graphs&lt;/li&gt;&lt;li&gt;If someone is interested, Celestia has already solved this problem. I don't know specifically how they do it, but apparently, they are able to render a "BigInt" or something that is the equivalent of a 128 or 256-bit number. I'm going to assume it's the manipulation of the Matrix stack from global to local coordinate systems. &lt;/li&gt;&lt;li&gt;Look at Worldwind logs for 5-26-2005, 5-27-2005, 5-28-2005&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;#5 -- Methods:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Force Camera at 0,0,0 -- get the most precision possible.&lt;/li&gt;&lt;li&gt;Localized camera coordinate space - e.g. shift the mantissa at established camera positions&lt;/li&gt;&lt;li&gt;Doublize by methods in above locations (although, alledgedly, this is quickly runs out too).&lt;/li&gt;&lt;li&gt;Doublize by software-based vp (ugh)&lt;/li&gt;&lt;li&gt;Add a decimal camera position, at least compute picking rays on decimal. Solve the jitter by forcing consistent roundoff error, or weighting based on altitude&lt;/li&gt;&lt;li&gt;Perhaps force a localized zclipping that is more impervious (search on imposters)&lt;/li&gt;&lt;li&gt;Finish reading items in #4 for more alternatives.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;#6 -- My solution:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;My personal solutions was constrained by: a) lack of time, and b) desire to impact the Worldwind code base to the least amount possible (I hate branching and merging).&lt;/li&gt;&lt;li&gt;Thus I have gone with a localized solution that bumps up the coordinate projection system by several powers of two after a certain altitude is reached. This allows me to preserve adequate precision. It of course has ramifications throughout worldwind code, but I think I've gotten it fairly managed. I still need more testing to see if additional tweaks are necessary.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description><link>http://www.urbanrobots.com/Blogs/WW/2006/01/solving-coordinate-precision-problems.html</link><author>noreply@blogger.com (Geoff)</author></item></channel></rss>