I'm trying to write a program that will take two sets of coordinates in space A = [x1, y1, z1] and B = [x2, y2, z2] and then draw a cylinder between the two of them.
I am having a surprisingly hard time of expressing this calculation in Renderman.
For example, I made a sphere that is at [0, 0, 0] and another at [1, 1, 1].
If a horizontal line were drawn through the [0, 0, 0] sphere and a vector drawn to [1, 1, 1] then the angle would be around 35 degrees, while the angle between the line and the x-axis is 45 degrees.
I guess I'm not sure how to make Renderman render this configuration. I've tried the following:
Nevermind! I just found an online copy of Malcolm Kesson's 1994 introductory book on Renderman. In it, he explains how the order of the operations is crucial. I had no idea Renderman computed the transformations in reverse order from when the object is declared. I guess you'd call it a LiFo.
-kedmond
On May 17, 6:44 pm, kedmond <kedm...@gmail.com> wrote:
> I'm trying to write a program that will take two sets of coordinates > in space A = [x1, y1, z1] and B = [x2, y2, z2] and then draw a > cylinder between the two of them.
> I am having a surprisingly hard time of expressing this calculation in > Renderman.
> For example, I made a sphere that is at [0, 0, 0] and another at [1, > 1, 1].
> If a horizontal line were drawn through the [0, 0, 0] sphere and a > vector drawn to [1, 1, 1] then the angle would be around 35 degrees, > while the angle between the line and the x-axis is 45 degrees.
> I guess I'm not sure how to make Renderman render this configuration. > I've tried the following:
On May 17, 6:44 pm, kedmond <kedm...@gmail.com> wrote:
> I'm trying to write a program that will take two sets of coordinates > in space A = [x1, y1, z1] and B = [x2, y2, z2] and then draw a > cylinder between the two of them.
By the way, the best method to do that is not with rotations but with a change of basis. Compute the following vectors:
Z = (B - A) Y = any vector which is perpendicular to Z X = Y x Z (cross product)
then normalize X and Y (to not change the radius of your cylinder) and build a transformation matrix using the 3 vectors as rows (or columns, depending which way the matrices are used). I assumed here that the original cylinder had its length along the Z axis. If not, you need to swap the vectors.
To pick a vector V which is perpendicular to W, use: V = (0, Wz, -Wy) if |Wx| < |Wy| V = (-Wz, 0, Wx) otherwise
You can easily verify that V.W (the dot product) is always zero. The two cases are so V is never (0,0,0) if W isn't.