Mapping 3D Line Segments
Date: 10/06/97 at 20:12:39 From: Dave Ice Subject: How do I map 3D line segments onto a 2D perspective as seen from an arbitrary point in space? This thought experiment has me stumped. I'm writing a computer program where a stick figure is seen from different perspectives. When the stick finger moves his limbs, I want the movements to be accurately projected on the 2D computer screen in "correct perspective." I'm looking for a general algorithm that will map 3D movements into 2D perspective no matter where "in space" I view the stick figure from. I *think* I can state the problem this way: PROBLEM: ------- Given: a line segment defined by the following: Length = L Start Point (relative to the origin) = (Xa,Ya,Za) Theta = angle of rotation in the XY plane of the segment about the point (Xa,Ya,Za); measured counterclockwise from the positive X axis Phi = angle of rotation in the YZ plane of the segment about the point (Xa,Ya,Za); measured counterclockwise from the positive Z axis (this is all I know about one of the stick figure's limbs when it is moved) Problem 1: Find the End Point (Xb,Yb,Zb) relative to the origin (0,0,0) Problem 2: Find a 2D representation of the line segment as viewed by an observer at an arbitrary point P = (Xp,Yp,Zp) in space; i.e. (Xa',Ya') = [Function](Xa,Ya,Za) and (Xb',Yb') = [Function](Xb,Yb,Zb) WHAT I'VE DONE -------------- I believe the answer to Problem 1 is: Xb = Xa + (L * cos(Theta) * sin(Phi)) Yb = Ya + (L * sin(Theta) * sin(Phi)) Zb = Za + (L * cos(Phi) We also know that L = SQRT[ (Xb-Xa)^2 + (Yb-Ya)^2 + (Zb-Za)^2 ] In the special case where the observer is located directly on the X or Z axis and the stick figure's waist is located at the origin, my program seems to work ok using the above polar coordinate equations because I don't need to figure out what to do with the Z coordinate. But I'm left with no "perspective"; rotations in the perpendicular plane are "invisible" as illustrated below. Stickman lifts his arm (Theta rotation) in profile; in front view the movement cannot be seen. O O ^ |-- ^ | y | y | | x -> | z -> profile view front view Similar events happen to other limbs that can rotate in two planes; they tend to disappear from the perpendicular view. I think I'm on the right track (maybe not). What I need is a way to simulate this perspective... y | | |________x / / z ...in a 2D coordinate graphing system. But I'm hoping there's a general solution to this problem that works for any perspective. WHAT I THINK I NEED ------------------- Seems to me I'm talking about two things: a coordinate translation and a coordinate projection. I surfed the Geometry Center Home Page at http://www.geom.uiuc.edu and found a section on "Projective Transformations" that I didn't fully understand; it involved a 4x4 matrix acting on 3 coordinates to produce 3 different coordinates. My need seems to be for a matrix (or function) to turn 3 coordinates into 2 coordinates. My math skill: I took first-year calculus in college; I'm okay at geometry knowledge but my spacial visualization isn't good - this problem may be ridiculously simple and I'm just missing it. It's been a long time since I did matrix math, so if the solution turns out to be a matrix, I'd appreciate pointers or references. Thanks for taking a look!
Date: 10/07/97 at 14:37:50 From: Doctor Tom Subject: Re: How do I map 3D line segments onto a 2D perspective as seen from an arbitrary point in space? Hi Dave, Unfortunately, the easiest way to do it (by far) is by using the 4x4 matrix transformations. You actually have to turn 4 dimensions into 2, assuming that you're drawing pictures of 3D items. This is what's taught in a first year course in computer graphics, so I'm not going to list all the details here, but I'll give you a couple of pointers, and you can then look in a book on computer graphics for the details. The great thing about 4x4 matrices is that they represent almost any transformation you might be interested in - rotations, translations, uniform or non-uniform scalings, shear operations, one, two, and three-point perspective transformations, orthogonal transformations, windowing operations, and even more bizarre things. If you need to do a combination of things like a rotation followed by a translation followed by a perspective transformation, you just write down the three different matrices for those 3 operations, multiply them together, and the resulting product of matrices represents the combined operation and you can multiply all the 3D points in your original model by this one matrix to get the transformed points. For technical reasons, you need a fourth coordinate to do this efficiently, but the idea is this: The 3D point you would call (x, y, z) is represented by any 4D "homogeneous" vector like this: (ax, ay, az, a), where a is non-zero. We usually pick a to be 1, so it is represented by (x, y, z, 1). But if after multiplying your input 4D vector by the matrix you get something like this: (2, 11, 18, 2), the a is 2, so this corresponds to (2/2, 11/2, 18/2) in 3 dimensions. The trick with perspective transformations is that although the result will be a 4D homogeneous vector, you can change it (as explained above) to a 3D vector. But it is cleverly done so that the z coordinate of that vector can be ignored - the x and the y represent screen space. The z coordinate is not useless, however. It gives an indication of how "deep" into the picture the object is. This is useful if you're drawing a bunch of items that behind each other from certain points of view. To draw them correctly, you need to draw the stuff behind followed by the stuff in front so that objects that are partly obscured are rendered correctly. I hope that's enough of a start. Now go to a book on computer graphics for the details on all those transformation and projection matrices. A good (but expensive) book is called, _Computer Graphics: Principles and Practice_, second edition, by Foley, van Dam, Feiner, and Hughes. Don't worry if you can't find that one, though, because there are others that are pretty good as well. Good luck. -Doctor Tom, The Math Forum Check out our web site! http://mathforum.org/dr.math/
Search the Dr. Math Library:
Ask Dr. MathTM
© 1994-2013 The Math Forum