Hi Andrew, On 12/02/2011 12:47 PM, Andrew Hale wrote: > I've written a proposal to change the current handling of transfomations of > vectors and remove the use cases for 4D vectors. The proposal can be found > here: > http://wiki.blender.org/index.php/User:TrumanBlending#Proposal:_Four_Dimensional_Mathutils_Vectors
A few comments on your proposal: (x1, y1, z1, 1) + (x2, y2, z2, 1) = (x1+x2, y1+y2, z1+z2, 2) This addition doesn't make much sense. You're adding two 3D points here, i.e. 3D coordinates, for which there is no sensable geometric interpretation. Addition of two 3D *vectors*, i.e. 3D directions, does make sense, but in that case the w component should be 0. E.g. (x1, y1, z1, 0) + (x2, y2, z2, 0) = (x1+x2, y1+y2, z1+z2, 0) The value of w is also the major difference between representations of points and vectors in homogenous coordinates. When sticking to w=0 for vectors and w=1 for points things like subtraction actually make sense: (4, 4, 4, 1) - (1, 1, 1, 1) = (3, 3, 3, 0) That is, subtracting two 3D points results in a vector that points from the second point to the first. Subtraction of vectors also just works: (0, 1, 0, 0) - (1, 0, 0, 0) = (-1, 1, 0, 0) Adding a vector to a point gets you a new point: (1, 2, 3, 1) + (4, 4, 4, 0) = (5, 6, 7, 1) The point being that in these cases you don't need to explicitly worry about the w component, as for the sensible operations the results are correct. It's only with applying transformation matrices that you need to normalize the result by dividing by the w-component of the result (but only if it is non-zero). In general I would say, just like Stephen Swaney did somewhere in this thread, that there's two kinds of users: 1. The first type of user doesn't need/want to know about the underlying complexities of 3D math. He/she just wants to do simple manual transformations on 3D geometry. The easiest interface would be to provide methods in the Matrix class for transforming points, vectors and normals specified as 3-tuples (e.g. transformPoint(Vector3), transformVector(Vector3), transformNormal(Vector3)). These methods can then hide the underlying assumptions about the value of the w component and the different method needed for transforming vectors versus normals. The results from these methods would be 3-tuples as well. By using multiplication of transformation matrices you can simply compose transformations from separate steps. I think that's about all the operations this group of users wants to do (but correct me if I'm wrong). 2. The second type of user knowns his 3D math and just wants to work with general 4x4 transformation matrices and the operations on length-4 tuples. They will worry themselves about homogenous coordinates and such. These users also know that v*M and M*v produce different results and ignore the fact that v plays the role of column-vector versus row-vector here, etc. I consider myself to be in the second category and completely removing vectors with homogenous coordinates from the Blender API makes me nervous. I don't think the two types of usage conflict, it's more about providing different APIs for accomplishing the same thing and educating users in the first category what methods to use, providing good example scripts, etc. Just my 2 euro-cents, Paul _______________________________________________ Bf-committers mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-committers
