When you have a Matrix4 and a Vector3 like this:
Matrix4([ 1.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 1.00 0.00]) Vector3(20.00, 30.00, 10.00)
Then using the vector on the matrix should give you the same effect as if you divided the vector by its z component: Vector3(2.00, 3.00, 1.00)
If you do that now with the current euclid module nothing happens.
This is the part of the mul method of the Matrix3 class that should be changed:
elif isinstance(other, Point2): P = Point2(0, 0) P.x = A.a * B.x + A.b * B.y + A.c P.y = A.e * B.x + A.f * B.y + A.g return P elif isinstance(other, Vector2): V = Vector2(0, 0) V.x = A.a * B.x + A.b * B.y V.y = A.e * B.x + A.f * B.y return V
This should be changed to:
elif isinstance(other, Point2): P = Point2(0, 0) w = A.i * B.x + A.j * B.y + A.k P.x = (A.a * B.x + A.b * B.y) / w + A.c P.y = (A.e * B.x + A.f * B.y) / w + A.g return P elif isinstance(other, Vector2): V = Vector2(0, 0) w = A.i * B.x + A.j * B.y + A.k V.x = (A.a * B.x + A.b * B.y) / w + A.c V.y = (A.e * B.x + A.f * B.y) / w + A.g return V
The same part in the Matrix4 should be changed to this:
elif isinstance(other, Point3): P = Point3(0, 0, 0) w = A.m * B.x + A.n * B.y + A.o * B.z + A.p P.x = (A.a * B.x + A.b * B.y + A.c * B.z) / w + A.d P.y = (A.e * B.x + A.f * B.y + A.g * B.z) / w + A.h P.z = (A.i * B.x + A.j * B.y + A.k * B.z) / w + A.l return P elif isinstance(other, Vector3): V = Vector3(0, 0, 0) w = A.m * B.x + A.n * B.y + A.o * B.z + A.p V.x = (A.a * B.x + A.b * B.y + A.c * B.z) / w + A.d V.y = (A.e * B.x + A.f * B.y + A.g * B.z) / w + A.h V.z = (A.i * B.x + A.j * B.y + A.k * B.z) / w + A.l return V
After the code is switched both vectors and points should work with all types of transformation. I tested it myself and I can't find anything wrong with it except for a ZeroDivisionError that dosen't get in the way if you're doing everything right but will appear when you make a mistake for example:
Matrix4([ 1.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 1.00 0.00]) Vector3(20.00, 30.00, 0.00)
This will cause the error but in normal cases you will keep the matrix like this: Matrix4([ 1.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 1.00 1.00])
Also most of this stuff I just found on wikipedia: http://en.wikipedia.org/wiki/Transformation_matrix#Perspective_projection
Comment #1
Posted on Jan 12, 2009 by Quick BirdPartially fixed with introduction of Matrix4.transform method.
Status: New
Labels:
Type-Defect
Priority-Medium