mathutils Vector * Matrix broken in current SVN?

Hello, I’ve built a marble scribble machine with Blender. With a current SVN build, the scribbles aren’t mapping to their true path through the maze.

In the image below: the top scribble was made with the last official 2.55 release, and the bottom scribble was made with a Blender built today. The current build clearly runs through the obstacles, which the marble doesn’t do in the simulation.
The function which determines each path is:
(marble.globalPosition-paper.globalPosition)*paper.globalOrientation

The following Python test isolates the problem:


from mathutils import Vector, Matrix

paper_position = Vector(
    (-5.563757419586182,
     -12.250004768371582,
     5.241084575653076)
)
paper_orientation = Matrix(
    (0.9262828230857849, 0.0, 0.3768291175365448),
    (-0.0, 1.0, 0.0),
    (-0.3768291175365448, -0.0, 0.9262828230857849)
)
marble_position = Vector(
    (-12.16826343536377,
     -4.741597652435303,
     4.758109092712402)
)
print(
    (marble_position-paper_position)*paper_orientation
)

# 2.55.0 (Beta Release) returns
# Vector((-6.299639701843262, 7.508407115936279, 2.041398286819458))

# Dec. 7th, 2010 SVN rev. 33564M returns
# Vector((-5.935641288757324, 7.508407115936279, -2.9361419677734375))

I determined separately that the objects are properly reporting their positions and orientations. Also, the same blend file was used to make both drawings, but they don’t show the same path data.

Does it make sense to file a bug, or am I missing something? Saying I am not a math person is a huge understatement.

No not broken, but there has bean a change, to see print output as matrix input.
Put a transpose to your matrix and you get the old result see:


from mathutils import Vector, Matrix

paper_position = Vector(
    (-5.563757419586182,
     -12.250004768371582,
     5.241084575653076)
)
paper_orientation = Matrix(
    (0.9262828230857849, 0.0, 0.3768291175365448),
    (-0.0, 1.0, 0.0),
    (-0.3768291175365448, -0.0, 0.9262828230857849)
)
marble_position = Vector(
    (-12.16826343536377,
     -4.741597652435303,
     4.758109092712402)
)
pn = paper_orientation.transpose()
print(pn)
res = (marble_position-paper_position)*paper_orientation
print(res)

#gives: Vector((-6.299639701843262, 7.508407115936279, 2.041398286819458))

Fantastic! Thank you!