Improving or alternate ways of creating MC Escher ribbon head effect


#21

Here’s another approach:

headslice transparency matte.c4d (772.7 KB)

Since it’s all being faked via transparency mask, this yields the cleanest result as it does no geo distortions. It also has ridiculously fast render times. Whereas the same render size and similar quality for other methods was anywhere from 30 to 90 seconds, this takes 1 second.

All good, but…

  1. The masked edges come out quite janky regardless of how high object settings are cranked, so anti aliasing on render is a must.

  2. The “bevel” is being faked by using the same flat luma shade for both the inside of the outer head, and the outside of the inner head. The illusion is broken if any diffusion, reflection, etc is used. Flat luma is ass I could get to work, thougu perhaps there’s a way to shade by distance from camera or something like that.

  3. It only works with flat view as perspective would warp the relationship between the helix and head. Quite unfortunate since some other tricks I was looking to do rely on perspective.

  4. Oh, and rotating the helix won’t move it as normal (or as seen in preview), so it has to be moved up / down.

This is certainly much easier and less problematic than other approaches… and MUCH quicker to render. I can live with the flat bevel coloring. My only issue is with being forced to do flat perspective to preserve the relationship between the camera, helix, and head. If that can be fixed, this approach may be ideal.

Only solution I’ve come up with so far isn’t exactly simple. To work properly in perspective, the transparent mask would have to exactly match the contour of the head (the exact intersection of the helix and skin). Furthermore, it would have to be done separately for the outer and inner head, and I’m not aware of a way of separately using two overlapping transparency masks int he same shot, so outer and inner heads would seem to need to be done separately and composited.

This isn’t simple either as the near portion of the head needs the outer head in front of inner, and the back portion of the head needs inner in front of outer, so there would perhaps need to be something like a plane bisecting the head that always faces the camera so the compositing order on the back half of the head can be switched.

That’s theoretically possible, but I’m not sure how to shrink wrap the transparency to the skin surface while retaining the helix’s shape (without again resorting to boole or mesh), and the compositing is kludgey at best.

Any other methods to allow perspective with masking approach?


#22

This reminds me of a test file I made about 5 years ago…

I don’t seem to have the issues you do with the boolean object…


#23

Will take a look, thx.

Boolean overall was working in general for slicing a single object with another, but a few things I noticed:

  1. If subtracting two items (large and small head) from another (corkscrew), it’s critical that the two items being subtracted don’t intersect (eyeballs, mouth cavity, etc)

  2. Boole “Containment” technique in general applies (the higher the geo, the more contained (and thus, less noticeable) the boole edge isseus are.

  3. Edge issues become much more noticeable if the create single option is engaged for boolean… warping both the “bevel” and the inne / outer faces. In most cases, it’s not noticaeable that they’re not connected anyway.

  4. Generally speaking, the boole has problems subtracting items that cross over the same intersection twice (again with the eyeballs, etc)

  5. If a single boole is creating the outlines for both inner and outer head and the loft between, the rectangle used to create that sweep that becomes the loft must have subdivisions such that the polygon that intersects the inner head is separate from the one that intersects the outer head… or the boole will glitch during animation during certian frames.

EDIT: Took a look at vid sample. Are you using similar setup with rectangle sweeping helix for the slice? Eyeball looks intact, but that could just be perspective and cut hadn’t hit it yet. You didn’t find issues with animation glitches as it hit eyeballs, mouth cavity, etc? Generally easier to cut a single head. Issue tends to be with adding thickness (inner / outer head) If I cu them separately, boole doesn’t seem to want to connect them, and I can’t do it procedurally since I’d have to re-grab outlines to loft in each frame. This leaves cutting both simultaneously… which is where the boole becomes more problematic… unless there’s another approach.


#24

facematte cloth.c4d (449.3 KB)

Here’s another approach. Too many kludges to list, but the takeaway is it uses 3d wrapped transparency masks which allows the illusion to be preserved with pespective and different viewing angles. It avoids all the geo issues with booleans, all the UV issues with Volume Meshing, and yields the cleanest lines of anything I’ve tried.

I haven’t quite dialed in the mask mapping for the inner portion of the head, but it’s close enough to share. It also renders in less than a third of the time of even a halfway decent boole.

On the negative side, the "bevel is an illusion, and that illusion breaks when a bit of eyeball is visible, or you can see through to the other side. Ribbon is also trimmed to make sure it never extends beyond head. If it did, you might notice if viewed at extreme high or low angles.

Note that inner head is a heavily smoothed version of external shrink wrap… thus eliminating most issues of internal bits like eyeballs, mouth cavity, etc. Not quite perfect, but easy to see the improvement such an approach delivers.

This strikes me as the best overall approach yet, but the major improvement I would want would be a way to actually fill in the “bevel”. Since the inner and outer bits are rounded planes, this would require a way to essentially loft between them. I would think that would be easy to do, but haven’t found a way yet.

Any ideas on how to procedurally loft between two planes to create a solid, then select the newly lofted sides?

Also, any idea how the exess material from a shrink wrap can be procedurally trimmed? (The bits that didn’t wrap because they extended beyond the edges of the target)


#25

Here is my test file with your geometry. I think one of the biggest issues with your setup is the poor quality of the mesh you are testing with. And eyes, mouthbag, etc. should probably be separated into separate meshes so that they can be handled differently if necessary.
Escher Face troubleshoot.c4d (391.1 KB)


#26

Boole geo issue seems to always come down to containment, so the higher the subdivisions, the better it will look.

It’s definitely true, though, that the real killer comes down to animation glitches as a result of the multiple boole crossings for items like eyes, mouth cavity. This is just a stand-in for a (hopefully higher quality) animated mesh I expect to import in a couple days. I don’t know enough about poly modeling to know exactly what makes a good vs bad mesh, but clearly the boole doesn’t like all the multi-cross eelements.

I’ve grown disenchanted with cloth surface for the edges as it compounds the boole geo issues by projecting out along haphazard normals. Not too noticeable at this thickness, but a ridiculous mess if you go thicker.

Taking a closer look at your file in a minute to see if I missed anything on initial review.

I’ve nearly worked out a hybrid method that uses volume meshes, booles, and 3d transparent masking surfaces where each does only what it does best. It should effectively solve all geo, UV, and masking issues to the point where you can swap in any (reasonable?) dynamic shape and subtract it from another, and view it from any angle without losing any UV or geo integrity.

… just in case you need to cut a writhing octopus shaped peephole into a dancing papaya.


#27

Here’s a simplified take on my new hybrid method.

peeling an easter egg.c4d (311.1 KB)

The technique can be adapted to essentially cut any reasonably simple dynamic shape out of any other procedurally while retaining all the UV’s and doing no damage to the actual geometry allowing cutouts that would cause glitches for a boole.

Volume meshers create transparency masks as thin as your voxel settings will allow which wrap the objects they reveal so they look right from any angle. In this case, separate masks reveal the original red and green objects, and the blue is a procedurally generated volume to fill in he gaps.

The secret sauce is in the spacing (cloth surface, displacer), and the compositing tags (note which are seen by transparency vs camera and vice versa.) Apply a solid color to the inner and outer transsparency meshers to understand better what they are doing.

it just works.

Two improvements Maxxon definitely should make are:

  1. Give easy access to the poly groups as created by the mesher. The whole reason it created the new geo the way it did is because it already knows which edges are intersections vs original object a/b, etc. This is an obvious thing many users would want to do, and the data already exists.

  2. Add the ability to select a target object for transparency masking so it is only masked / revealed by transparency from the object actually designed for that purpose. Lots of things already work this way, and it would open up a world of new possibilites for masking which is generally a much better (and quicker to render) way of doing many cutouts.

Both are perfect candidates for improvements as they expand functionality of existing tools using existing data with no downside or redesign issues. With those mods, this would be a breeze and render in a fraction of the time.

Until that day, this is the best method I’ve found.

It gets a bit more sophisticated in the case of the heads to subtract out inside elements like eyeballs (requires high poly boole hidden behind so you don’t see boole geo), smooth out the inner surface, etc. but the concept is the same.

I need sleep, and don’t have time to clean up the proect at the moment, but it’s fairly easy to navigate. The first three nulls contain the cutout object (helix in this cae), the outer object (stretched red sphere), and the inner object (green pill). Everything else is driven procedurally by instances of whatever is in those nulls, so each can be swapped out for anything else, and each can be separately animated.

Thx for all the help.

Enjoy.


#28

This works for me under most circumstances and does the best job with the problem areas like eyse, mouth cavity.

Because I see no way to auto poly select post mesh, this does require running 3 meshers, so tiny voxel sizes can add up quickly. I’d definitely be interested in any input as to how this could be made to run more efficiently. It’s my first time using instances, etc so not sure if it can be improved.

If you are using thin settings or internal bits like eyeballs become visible, just instance inner head, scale up slightly, and use it to boole out from outer head. Janky boole edges will be hidden behind face.

Ignore / delete the top “inner head sizer” null if using your own objects. It’s part of the inner object, but I needed to separate it due to issues with shrink wrap order of operations.

It’s pretty much plug and play. Just swap your own items into the designated nulls. Everything you need is in controls. Single voxel size control also automatically sets all other tolerances optimally

meshmatte.c4d (770.4 KB)

EDIT to add: The upside and downside here comes down to the meshers. Much like bitmap vs vector. Each has it’s place. If you need to zoom in, the voxels give themselves away.

The ideal method if you need to zoom in would be more like the facematte cloth project a few posts up that wraps planes along helix to form ribbons, then shrink wraps those ribbons to surface of outer and inner head to form transparency masks (the red and green bits in pic above). Problems that stopped me from fully developing that method are:

  1. How to auto-trim excess spline or plane post shrink wrap that extended beyond the shirink wrap target (Using example above, excess red or green ribbon that doesn’t wrap because it extends above or below face). In clothmatte project, I just trimmed the ribbon first before wrapping to head which is ok, but if the head moves too much, it will jump if ribbon extends beyond head at any point.)

  2. How to procedurally loft between two planes to crate solid (connect red and green ribbons to create blue)


#29

ribbon mesh resize.c4d (510.0 KB)

Triple mesh approach in previous post is the most flexible so far… as long as you don’t mind paying a heavy render time penalty for dialing in smoother edges if zooming in.

In an attempt to find a better balance for other circumstances, like flythroughs where voxels might become visible, this approach has much lower render times, and does a reasonably good job of hiding the tolerance issues in ways that are unlikely to be noticed. View from any angle, decent zoomability, smooth masks, etc. One downside is that it relies on the helical ribbon being shrink wrapped which means if it’s not trimmed first (as it is here), it will jump off head when it extends past). May not be an issue if this exact look is what you want, but limiting if you want to spin the cutout shape around, etc.

Ultimately, the biggest downside and main reason tolerances aren’t dialed tighter comes back to the fact that it still uses a (single) mesher to generate the solid fill.

I’ve been looking for any third party plugs or scripts that can either connect the inner and outer ribbons (wrapped planes), or turn their outlines into splines (python script?) so they can be lofted. Doing this would allow tighter tolerances and get rid of the mesher speeding up renders.

Any leads on that?


#30

single mesh solid matte.c4d (794.0 KB)

A single 3d solid transparent object rather than the two thin ones… allowing all mesher approach to use 2 meshers rather than 3. (File is misnamed. I was trying to boil down to 1 mesher.)

Again, I’ve pre-wired its o you can just drop in any objects, and adjust a single voxel size control to tighten / loosen all tolerances in one step. Still a bit of a wait for a great render, but it’s faster this way, and free of any other issues I’m aware of outside of typical voxel issues.

This and other approaches could all be greatly improved if there was some way to auto-select the polys post mesh such that you could texture the inner cutout separate from the bevel sides, etc. Anyone worked out a way to do this?


#31

With all due respect…

The final result might work well (I don’t know) but with the voxel count you now have a file that is unwieldy to open, scrub, tweak and render.

I’m guessing this shot is going to be 3-5 seconds of your video. Is it worth the 60+ hours invested?


#32

I meant to bump up the voxel size to my working space setting of 5 beforfe saving. I might have forgotten. Renders are at 0.25 voxel size and took about a minute and a half at 1280 x 720. I have no frame of reference for how long things generally take to render in c4d.

It’s slated to be in 1/5 or so of video, and will probably re-use in one form or another iin other videos, but it definitely took longer than I planned to work out. Been working on other things simultaneously, though. It’s heavy enough, I’m planning on just rendering it out separately, and compositing it.

I also agree that main issue is that it’s too heavy… trying to make it more efficient was probably a third of the time I spent on it.

EDIT: Just realized I may not have a choice for another reason. Even theough I’m using alpha rather than transparency tab in shader to get alpha text, it’s triggering the trasparency masking on head elements… so I will need to find a way to do them separately and comp together. Multi-out the head plus luma maskis first, then the text? If so, need to see if there’s a way to reference the head render while working out the text.