[HN Gopher] Implementing strict three-point perspective ___________________________________________________________________ Implementing strict three-point perspective Author : TheRealPomax Score : 74 points Date : 2021-06-05 19:04 UTC (3 hours ago) (HTM) web link (pomax.github.io) (TXT) w3m dump (pomax.github.io) | [deleted] | whatshisface wrote: | That last image is not how artists draw rotated cubes in three- | point perspective. So, I have to conclude that the author's | formalization only works for lines parallel to the axes. | saltcured wrote: | Indeed. As you stated, mutual vanishing points, as used in | illustration, are when parallel lines of the scene are extended | to infinity and converge. Animation of a rotating object | requires animation of a set of vanishing points for each frame. | | This is nearly deja vu for me, as a conversation that I've seen | several times at the intersection of arts and computer | graphics. I can only conclude that a sub-population have | received instruction on "vanishing points" that were overly | specific and missed the footnote on how it generalizes. | Specifically: the artist and draftsman idioms of 2 or 3-point | perspective or vanishing points are short cuts for perspective | rendering of subjects which have cartesian layouts, such as | rectilinear buildings and street scenes built on a cartesian | grid, with lots of parallel or perpendicular edges. The missing | footnote is that this does not work for arbitrary subjects. | | Real perspective rendering has infinite potential vanishing | points in one scene. Each point represents nothing more than | the infinite continuation of any line segment in the scene, as | it would be rendered by a true perspective rendering. The | vanishing point of any one line is when the viewing ray | converges with that line, to the limit of angular resolution in | your rendering. All more distant segments project into the same | small picture element, whether formed by raster graphics or | your finest pencil, pen, brush, or engraving tool. | | For a complex scene, the skilled artist would choose [edited to | delete typo "three"] different vanishing points appropriate for | each set of parallel lines. E.g. a vineyard with parallel rows | of plantings might use different points than a road passing by | at an odd angle, and a set of high-tension powerlines crossing | the scene would have its own vanishing points as well. If the | power lines follow a ragged course, each segment between two | towers would need its own vanishing points. Furthermore, the | artist would have to approximate the parabolic sag of the wire | below these projected line segments, perhaps using parallel | lines to locate the envelope within which the line sags. | egypturnash wrote: | Artist is my day job and this is a decent approximation of | what a complex perspective drawing entails. And, really, it | probably entails a lot of eyeballing it, too - sketch in | something that feels roughly right against whatever | guidelines you may have constructed, and leave it at that. | | "Two-point perspective" and "three-point perspective" are | good enough approximations for the common problem of "drawing | a scene set within a place built around a lot of right | angles". | | I feel like the computing analogy to make here is "a very | opinionated framework": it makes life a _lot_ easier, _if_ | you want to do things the same way it 's built to do. If you | want to do stuff outside of what it's built to do you're | gonna have to do a lot of the work yourself. | TheRealPomax wrote: | Artists don't draw all the way to the vanishing points, we only | draw in the part that looks normal. Look at the figure showing | off how straight lines behave again, and you'll see that | everything _starts off_ actually looking like normal straight | lines, and things don 't actually go crazy until we start | getting close to our vanishing points. | | Which is why on paper, you place the vanishing points _outside_ | your drawing, so your drawing can stay constrained to the part | of exponential space that looks normal. E.g. if you constrain | the viewport to the unit area (the triangle between 1 /0/0, | 0/1/0, and 0/0/1) and scale your scene down to fit inside of | that, things will actually look perfectly fine, with a gorgeous | perspective (but will also be visually indistinguishable from a | wide angle camera positioned closed to your major scene point, | so just use that). | | However, with computers we can trivially see what will happen | if you _do_ try to use the full space, rather than only working | inside an (incredibly sensible!) crop. The result is pretty | wild. | egypturnash wrote: | _Artists don 't draw all the way to the vanishing points, we | only draw in the part that looks normal_ | | I am a professional artist and I would just like to confirm | this line. 3-point perspective tends to start looking weird | once you get outside of a certain sweet spot; I did _so_ many | beginner drawings with the vanishing points too close, which | resulted in a weirdly exaggerated set of shapes. | cmiles74 wrote: | The effect is also pretty dramatic and I think this is a big | part of illustration work. Comic books in particular use | three point perspective to add drama. | | https://www.youtube.com/watch?v=wyIKZhIAl0k | | The cropping aspect is made pretty explicit in Stan Lee's | video. ;-) | twelvechairs wrote: | I think there's two issues making it this way. The big one is | the use of 'exponential space' based on each distance being | halved along an axis, which is not accurate to how artists | perspective works if drawn properly (someone smarter than me | may do the math to figure out what the real formula is here). | | The second point is the vanishing point for verticals is | ridiculously close to the cube which makes it an incredibly | tortured perspective for the eye to understand to start with. | megameter wrote: | I did set out to make a wireframe two-point perspective dungeon | crawl in PICO-8 once. It worked(I recall the math for making the | height of walls feel correct at different distances was hard to | understand and I probably did resort to the CG approach) but I | eventually abandoned it because I was spending way too much time | trying to deal with occlusion and optimize it for PICO-8's CPU. | | Since then the system constraints have changed and I would | probably just make a tline() raycaster. | TheRealPomax wrote: | PICO-8 is such a fun piece of software. Getting lost in | graphics optimization for it feels like it's more the norm than | the exception =D | hypertele-Xii wrote: | Getting lost in optimization is the opposite of actually | making things, and as an artist, it's at the top of my | reasons why PICO-8 _isn 't_ fun to use. | kragen wrote: | This is not how geometrically-correct pinhole-camera perspective | projection works; Pomax is approaching the vanishing points | exponentially rather than hyperbolically, which is why straight | lines turn into curves. If you work out the geometry of the | pinhole camera setup [edit: _with a flat imaging plane_ ], you | find that you're just doing a division (conventionally, dividing | by the Z-coordinate in camera space, though you don't have to set | it up that way) instead of an exponential. This is a "projective | transformation", and those _do_ map straight lines to straight | lines: https://en.wikipedia.org/wiki/Projective_transformation | | If you have a sufficiently wide field of view, even the standard | projection transformation gives you things that look pretty | "distorted", which is a fun trick often used in art photography. | Also fisheye lenses are often designed to do a non-projective | transformation and get effects you can't theoretically get with a | pinhole camera, like mapping straight lines to curved lines as | Pomax does. | | Pomax's invention is super cool, even though it isn't the usual | 3D-2D mapping motivated by pinhole-camera geometry. Weird is | good! I wonder if there's a version of it in which straight lines | become curves, but _polynomial_ curves of some reasonable degree, | or maybe something involving square roots and division, so we can | rasterize them without computing a bunch of exponentials? Is that | even a reasonable way to seek optimizations in 02021? | | Pomax may have a good point that projective transformations | aren't "strict three-[vanishing]-point perspective" because, | instead of having three vanishing points, they have _an infinite | number of_ vanishing points, a point others have made in the | comments here. The profoundly weird and cool aspect of Pomax 's | invention is that _every_ line converges to one of those three | points. | klodolph wrote: | You can get distorted projections with pinhole cameras too, as | long as your sensor is curved. Fisheye is impractical, but | cylindrical projections are easy. Common way to do pinhole | photography is with an oatmeal box, which is a cylinder. | | https://sdsu-physics.org/assets/PDFs/oatmeal_pinhole_camera.... | | I'm not really trying to nitpick here, just like talking about | pinhole cameras. With a flat image plane the pinhole lens is | "rectilinear", but the beauty of pinhole cameras is that you | can project the image onto any shape you want without affecting | focus. | kragen wrote: | Oh, that's an excellent point! I guess I didn't even _think_ | about that, which shows how much experience I have doing | _actual_ pinhole photography in the physical world :) | cousin_it wrote: | It seems to me that if you want some fancy curvilinear | perspective, the simplest way is to render the scene normally | (or make six renderings in a cubemap if needed), then texture- | map it onto a suitable shape. That should work for any | rearrangement of light rays, as long as they are straight and | come to a point camera. Might get more fun if you want curved | light or a camera extended in space :-) | kragen wrote: | Well, that won't give you the "strict three-point" property, | where all 3-D lines asymptote to just one of those three | points. More broadly, there are a wide range of mappings from | 3-D to 2-D that use information that is lost in the standard | divide-by-Z technique; some of them are used in automated | optical inspection systems, for example. | twelvechairs wrote: | > Pomax is approaching the vanishing points exponentially | rather than hyperbolically | | Exactly this. To put it in drawing terminology, the distance of | a line towards the vanishing point is related to the distance | from the camera (station point). Images like this may be of | assistance for those of a computer and not hand drawing | background | https://guidetodrawing.com/site/assets/files/1082/gtd-235.79... | | An exponential ratio as used by the article could maybe be | described as assuming the camera is 0 distance from every point | drawn. | jiofih wrote: | > Except that's not "true" three point perspective | | Is "strict 3-point perspective" a known concept or the author | just invented it? | | > That's the easy-for-computer-graphics version of three point | perspective | | It was devised for people, not computers, over 600 years ago. | | I can't find any other references or why you'd want this odd | infinite representation of space, it makes little sense except as | a mathematical curiosity. | robbrown451 wrote: | Agree, none of this makes sense. Three point perspective is | best explained by the concept of a pinhole camera with a planar | film surface, and simply assumes that we are most interested in | the theoretical directions of the 3 major axes, X Y and Z. | | For it to really duplicate the geometry you see with your eyes, | you need to look at the resulting photo from the spot where the | pinhole is (related to the paper, and presumably turning it | upside down first). This of course means you need to close one | eye, or show a different image to each eye). | | But computer graphics, to my knowledge(see 1 below), almost | never thinks of it in terms of vanishing points, this is a | convenient concept (essentially, a shortcut) for humans who are | drawing on paper. Do computers ever even calculate where the | vanishing points are on the drawing plane? (other than niche | uses, such as an art composition app or the like?) I have never | seen computer graphics software "care" about the concept of | vanishing points, such as by having a variable that represents | said point. | | I feel weird having such a negative reaction to this article | since I have used the author's bezier library for ages and have | a lot of respect for his writing regarding beziers and related | curves. | | [1] I implemented view controls in CAD systems 25 years ago | that are still in use today, and which concentrated especially | on perspective views, so I have some knowledge of the subject. | Also I learned perspective drawing skills in my industrial | design education prior to that, and previous to that was into | photography and mechanical drawing and obsessed over such | geometrical stuff, starting 40 years ago now. | TheRealPomax wrote: | Computers graphics based on linear algebra can't do true | vanishing points, so... no? | | This isn't a tutorial on how to implement a useful three | point perspective, this is an analysis of how three point | perspective behaves if we don't make any computing | concessions and examine the full space. You're never going to | use that in 3D graphics, it looks terrible and I can't even | think of a fun game mechanic that could be based on it. Just | use a wide FOV camera in your software of choice and you'll | get something much better. But it _is_ a programming exercise | that is worth running through. | | Remember, when we draw perspective on paper, we _never_ draw | all the way up to the vanishing points, we keep them far away | enough that every straight line we draw still behaves like a | straight line. Things don 't get crazy until you get close | enough to the vanishing points for the exponential mapping to | become really pronounced, and starts doing really wild | things. | | So obviously for an analysis of the space I'm going to draw | something that is intentionally close enough to the vanishing | points to show that insanity off =) | TheRealPomax wrote: | In drawing, it's just "three point perspective", and it's this. | In computer graphics, every resource you look for explains | three point perspective as a plane intersection (because then | computers can draw it using a camera), which is not the same | thing as pen and paper three point perspective. The word | "strict" here is just the natural language version of the word, | not a technical term. We're implementing three point | perspective following the pen and paper rules, not the "let's | subtly change how it works so a 3D camera can do this" rules =) | | > I can't find [...] why you'd want this odd infinite | representation of space. | | Like I say in the post: _you_ almost certainly don 't ever want | it. When drawing three point perspective using pen and paper we | typically pick vanishing points that aren't even on the paper | itself (you tape down your paper and mark them on your desk | instead) to get sweet looking faux architectural drawings while | effectively working on a "crop" where the effects of | exponential space are subtle, instead of super obvious, so it | never gets weird. (heck, even adding secondary vanishing points | that are further apart for working at different scales for | different parts of your picture so people will never see the | effect of exponential space is pretty common) | | Similarly, you can get something "close enough" in any 3D | software with a wide angle camera positioned close to your | subject, so unless you've very explicitly setting out to do | exponential space graphics, there is _literally_ no reason for | you to ever need, let alone implement this. | | But it _is_ fun to work out what the real behaviour is if we | try to implement strict three point perspective on a computer, | because we like programming puzzles, and (also as mentioned) | there aren 't any pages on the web that I've been able to find | that cover this extremely niche projection so now there is at | least one. | j4yav wrote: | Do you have animations generated from this? I would love to | see rotations in motion. | | I feel like there is some game that could be created from | needing to manipulate objects in this space. | TheRealPomax wrote: | https://twitter.com/TheRealPomax/status/1400974346160533508 | zozbot234 wrote: | It looks like the OP has come up with their own variation on | some sort of curvilinear perspective (which is a known concept | in visual design, and may even be useful to model, e.g. | distortion introduced by a lens) but this is not how actual 3D | projection works. | kragen wrote: | Well, you _can_ do actual 3D projection using a fisheye lens! | It might even be a worthwhile thing to do. | TheRealPomax wrote: | Very much not, that's the whole point of this post. This is | what happens when you take the maths associated with 2 and 3 | point perspective, and work out what the non-cartesian | properties actually mean if you were to implement it "the way | it really is" on a computer. | | At which point you should go "this is silly, let's never do | this" because: it's really silly, let's never do this. And | now we know why. | captainmuon wrote: | Isn't regular point perspective that all _axis-aligned_ lines | meet at the one of the three points, whereas here all lines | _whatsoever_ eventually converge there? | | This reminds me of the mathematical trick to make a "hollow | earth" work, with us living on the inside: All rays of light | are bent. You can never see the curvature of the earth (or it | seems that we are living on the outside). The stars that seem | to be at ~infinity are at the center of the sphere, and the sun | is a ball of fire orbiting around the center, and so on. | TheRealPomax wrote: | Almost: all equal ratio lines (x=z+c, x=y+c, y=z+c where c is | some constant) head off in a straight line towards their | respective horizons, but all other non-axis-aligned lines | converge at the vanishing points. | mpetrovich wrote: | Back in college I wrote a 3D rendering engine using what seems to | be a similar method as the OP. I always thought the results | looked a little strange... https://github.com/mpetrovich/CUB3D | TheRealPomax wrote: | Neat! ___________________________________________________________________ (page generated 2021-06-05 23:00 UTC)