Re: texture mapping/memory leak?
- To: mathgroup at smc.vnet.net
- Subject: [mg86794] Re: texture mapping/memory leak?
- From: michael.p.croucher at googlemail.com
- Date: Fri, 21 Mar 2008 01:53:33 -0500 (EST)
- References: <frt5i1$t28$1@smc.vnet.net>
On 20 Mar, 08:00, "Fred Klingener" <gigabitbuc... at gmail.com> wrote: > Ref: Mathematica 6.0.2, WinXP, mid-range Intel dual core, 1GB RAM. > > Lately, I've been trying to work out texture mapping with Mathematica. > By 'texture mapping' I mean transforming and applying the contents of > an image file onto the surface of a 3D object. > > I'll describe the approach I've taken, the results so far, then try to pose > some questions. The example problem I'll use is a more-or-less standard > one - mapping a Mercator global map onto a sphere. > > I copied a map image from Google Images ("earth map Mercator"), picking a > small thumbnail, maybe 100 or 130 pixels wide, and using it to define a > variable > > map = First[*paste image here*] > > map is a Raster, in my case specified as a List of 3-Lists interpreted as > RGBColors. After a long time foundering around, I discovered that the > specification for the Option Mesh-> has to be: > > grid = Take[Dimensions[map[[1]], 2] - 1 > > This gives a pixel count of the form {width, height}. > > Testing with a rectangular mapping: > > RegionPlot[-2<=x<=2&&-1<=y<=1,{x,-3,3},{y,-2,2} > ,MeshStyle->None > ,Mesh->Reverse[grid] > ,MeshShading->Map[RGBColor,map[[1]],{2}]] > > seems to do what I want after, for completely inscrutable reasons, I Reverse > the Mesh Option spec to represent {height, width}. > > Then I tried a sphere, added a red axis line, and finally got this: > > grid = Take[Dimensions[map[[1]]], 2]-1; > Timing[Graphics3D[{ > First[SphericalPlot3D[ > 1.0, > ,{\[Theta],0,Pi} > ,{\[CurlyPhi],0,2 Pi} > ,Mesh->Reverse[grid] > ,MeshStyle->None > ,MeshFunctions->{#5 &,-#4&} > ,MeshShading->Map[RGBColor,map[[1]],{2}] > ]] > ,Red,Thick,Line[{{0,0,-1.5},{0,0,1.5}}]} > > ,ImageSize->{400,400} > ]] > > and the result is at least recognizable. If you choose an image that's not a > true Mercator, Greenland and South America might extend to the poles - > insignificant details. At least North, South, East, and West are right. > > To get this to work required a vast amount of thrashing, not helped at all > by SphericalPlot3D's parameterization inverting that advanced by Mathworld. > I can't even dope out whether SP3D is internally consistent, considering the > odd form required for the MeshFunctions. The (/[CurlyPhi]) is the azimuth, > the second in the SP3D parameter list, but first in the return order (#4 > before the #5 (/[Theta]) elevation.) > > I can't quite make sense of the minus sign in front of the #4 either. Even > though \[Theta] runs the direction opposite to latitude, its direction is > consistent with the direction of x in the 2D example, which seemed to work > ok. > > Converting #5 to latitude is evidently not necessary, because the image rows > count from the top. > > I'm left, though, with a pile of imponderables. > > 1. Why so slow? As written, Timing[] in the code fragment above reports > around 1.5 seconds, but the actual meat clock elapsed time is more like a > minute. How come? > > 2. Is there a pattern I can't discern in the way the coordinate defnitions > relate to the MeshFunctions and the orientation of the MeshShading. > > 3. Are there any reported memory leakage problems associated with these > calculations? When I work with MeshShading, my page file usage (as reported > in my Windows Task Manager) gradually climbs to a point where the system > hangs. If I put it into a Manipulate, I've had to pull the power and the > battery. > > 4. Is there a faster or otherwise preferred way to do this? > > TIA, > Fred Klingener Hi Fred I recently did something like this while mucking around with 'Easter Eggs.' No idea if its any better or worse than what you have done but you may find it useful - Essentially I make use of color function to take care of the mapping. Its very hackish and I made no attempt to optimise it or anything but the details can be found here http://www.walkingrandomly.com/?p=79 Cheers, Mike