Okay, so I think I have this conceptually down: For each triangle to be "moved":
1: Clone image 2: Add alpha, fill with black 3: Draw primitive on alpha, white fill 4: Find bounding box of triangle and crop clone to that 5: find bounding box of new triangle and remove top and left (save for later) 6: Use affine distort (with transparent virtual polygons) to distort cropped image to new triangle from original triangle coords 7: Use stored left and top offset of target bounding box to pad new image top and left with transparent 8: Stack onto target image 9: Flatten Repeat and condition. Possibly with the addition of a tiny amount of gaussian blur to the triangle. Does that sound right? BTW: > Note that the control points are floating point numbers and specifying > the center of a pixel, requires the addition of 0.5,0.5 to the number. I won't have to worry about this anyway, I think. UV coordinates are vectors: floating point numbers (properly between 0 and 1), not specific pixel coordinates, so that any size texture can be used. All I will have to do is multiply the width * the U to get the X, and the height times the V to get the Y of each vertex of the triangle. 2009/3/16 Anthony Thyssen <[email protected]>: > On Sat, 14 Mar 2009 22:12:25 -0700 > Dodger <[email protected]> wrote: > > | I'm going to ask this question redundantly, in a few different ways, > | because it's hard to explain without pictures what I'm wanting to do, > | though the concept it pretty simple. Regardless of the simplicity of > | the concept, I can't work out how to do it without a LOT of complex > | work in ImageMagick (specifically using PerlMagick, but I can > | generally 'translate' from convert options to get it right). > | > You are ucky then. Distorts was a recent addition to IM examples > and one that I have worked hard to try to improve. > > | First explanation -- raw form: > | > | I want to select a specific polygon (in this case, simply a triangle > | since I'm dealing with 3d models textures, and they ae imited to tris > | and quads) and 'lift' it out of the image so I can stick it into > | another image and distort it before making it part of the other image. > | I know how to do the distortion with the Distort() method (equivalent > | to the -distort directive for convert). What I don't know is how to > | 'select' the polygon to 'cut and paste' into the new image. > | > I pull out a triangle from an image using a mask in the -sparse-color > gradient example (barycentric, three point color example). > http://www.imagemagick.org/Usage/canvas/#barycentric > > > convert -size 100x100 xc: \ > -sparse-color Barycentric '30,5 red 5,80 blue 95,95 lime' \ > \( -size 100x100 xc:black -fill white \ > -draw 'polygon 30,5 5,80 95,95' \) \ > +matte -compose CopyOpacity -composite \ > -fill white -stroke black \ > -draw 'circle 30,5 30,7 circle 5,80 5,82 circle 95,95 95,97' \ > sparse_bary_triangle.png > > Basically it creates a second image (in parenthesis) consisting of > a black canvas with a white triangle. This is then used as a mask > to extract the triangle from the generated gradient. > > The last draw is just adding fluff to mark the control points. > > Note that the control points are floating point numbers and specifying > the center of a pixel, requires the addition of 0.5,0.5 to the number. > > Draw I do not thing needs that specification, so you may need to > do some check to see how draw coordinates match up to distort coordinates. > I have yet to do this, so if you do, let me know if thy match or not > (I do not think they do) > > | Second explanation -- reason why I want to do this form: > | > | I'm wanting to be able to convert textures for 3D models between two > | separate sets of UV mappings. If I can "grab" pieces of texture and > | then distort them and drop them into place, I will have a new texture > | tat fits the other mapping. The reasoning is this: There are a number > | of 3D models of humans that have 'wide' support in certain 3D > | communities. > | > Very admirable, and I wish you luck. I am wanting to incorporate > some method of inputting triangular meshes for image distortion and > or gradient coloring into IM, and even have some routines for generating > Delaney triangular meshes, from a list of points. > > The current problem is figuring out how to modify the library to > handle data in a more polymorphic way, and how to extend the input > to read such a complex data type that defined pairs of points, > and the triangular mesh over those points (and an overall interpolation > factor) for the points. > > A mesh does not exactly lend itself to the current polymorphic data type > of an list/array of floats. > > | These figures have a lot of texture artists making photorealistic > | textures, bumpmaps etc. for them. There are other figures which have > | almost *no* support. While it's relatively easy to remap the latter > | figures to "take" the former ones textures, sometimes the companies > | selling the former figures try to (falsely) claim copyright on the > | texture coordinates themselves. > | > | A desire to avoid getting into a legal argument, particularly in > | court where they have more money than I do to blow on lawyers even > | though I am right, has inspired the need to make a simple texture > | converter. While some such texture converters exist, they are limited > | in the scope of the number of figures they support. I'd like to > | support more, particularly the human I'm making myself right now. > | > Love to see your results! > > Note you can speed up the distorts by limiting the ouput 'viewport'. > See IM example notes on this. > http://www.imagemagick.org/Usage/distorts/#distort_viewport > > Adding a viewport forces IM to generate a image layer (with offsets) > but reduces the amount of pixels and thus the calculations needed > for each 'layer' image. > > That should be a big speed up when you deal with lots of small images. > > > | Since it's a relatively simple process to remap my figure to take > | their textures, I can just do this *once* to get the affine transform > | coordinates for the actual adjustment of each triangle (and each quad > | is simply two triangles back to back, so I can treat everything as > | triangulated) a texture itself to the new coordinates. > > yes. I have been wanting to add correct forward mapped bilinear mapping > to the distorts listing, and Fred Weinhaus has even worked out the > exact formulas needed. i just need to get four point bilinear distorts > working. > > You could use a four perspective distort instead, but that may not > work well for texture alignment between quads. Stay tuned. > > | While this will > | introduce some artifacts and blurring, it's acceptable because the > | textures in question are generally produced at much higher resolution > | than is ever really necessary anyway (I've seen 2000x2000 maps for > | *teeth*). > | > Don't forget that can distort to a highter resolution and then resize the > final result so as to get super-sampled quality improvements. > > Also remember that all coordinates are floating point, and not integer. > > > | I'd like to include such a converter for free with my figure. I have > | already planned out a semi-automated system for converting conforming > | clothing for the figures, and the textures and morphs are the only > | blockers. > > Again I really like to see you results, and your coding (with sample data > if possible). > > | Morphs are, in addition, easy because I can use the > | "mapped-the-same" figure to generate a simple matrix of the vertices > | in my figure and which morph deltas to interpolate with barycentric > | weighting to calculate the new morph. The textures are the only > | blocker, and I know how to do it *conceptually* -- just not within the > | IM API. > | > the time element just just another dimention of complexity. I have done > a little on it, but not much as yet. Like to do more. > > | Explanation 3: The "Photoshop equivalent" explanation > | > | In Photoshop, I can use the polygonal lasso tool to select a triangle, > | then copy it and paste it into a new image, and then distort it to fit > | a new triangle on the new image, then flatten and repeat for each > | triangle. Of course, doing this manually in Photoshop would be tedious > | and take weeks and be prone to human error in my selections. Moreover, > | I could not distribute the new texture since it's a complete > | derivative work of the original texture. However, if I automated this > | procedure into a script, I could very easily instruct the user on how > | to run the script to convert textures themselves for their own use on > | my figure. > | > | Since I already know how to do the distortion (and it is, in fact, > | better in ImageMagick because I can transform a triangle, instead of > | transforming a bounding box containing a triangle, allowing for more > | precision), I only need to know how to do the equivalent of: > | > | - Select triangle polygon > | - Copy it > | - Paste it into a new image > | > | After this I can easily enough distort it, and then position it on the > | new image (by padding the top and left with transparent pixels to put > | it in place, and then flatten the "layer" onto the new image. > | > | If anyone can explain in IM how I go about this, I would so greatly > | appreciate it! > | > Good luck, and please let me know how it all goes. > > > > > Anthony Thyssen ( System Programmer ) <[email protected]> > ----------------------------------------------------------------------------- > Any sufficently advanced magic is indistinguishable from technology. > -- Rick Cook, "The Wizardry Compiled" > ----------------------------------------------------------------------------- > Anthony's Home is his Castle http://www.cit.gu.edu.au/~anthony/ > -- Dodger _______________________________________________ Magick-users mailing list [email protected] http://studio.imagemagick.org/mailman/listinfo/magick-users
