1
$\begingroup$

I'd like to set the matrix_basis of an object. Unfortunately, the matrix isn't get updated correctly.

This is my test scene, consisting of an plane and a cylinder object: example scene

My objective is to get alpha, the plane's x angle, and apply it in some way to cylinder.

Here is the code:

import bpy
from math import *
from mathutils import *

plane = bpy.data.objects['plane']
cylinder = bpy.data.objects['cylinder']

alpha = plane.rotation_euler[0] # x rotation
print('alpha=%.2f' % degrees(alpha))

'''
# normal rotation matrix around x axis
# works fine
m = Matrix(( \
    [1, 0, 0, 0], \
    [0, cos(alpha), -sin(alpha), 0], \
    [0, sin(alpha), cos(alpha), 0], \
    [0, 0, 0, 1] \
    ))
'''

m = Matrix(( \
    [1, 0, 0, 0], \
    [0, cos(alpha), 0, 0], \
    [0, sin(alpha), 1, 0], \
    [0, 0, 0, 1] \
    ))

cylinder.matrix_basis = m
bpy.context.scene.update() # is this call needed?

# prints different matrix than m
print(cylinder.matrix_basis)

# for debugging
print(cylinder.matrix_world)

This is the console output of it:

alpha=-17.10
<Matrix 4x4 (1.0000,  0.0000, 0.0000, 0.0000)
            (0.0000,  0.9890, 0.1478, 0.0000)
            (0.0000, -0.1478, 0.9890, 0.0000)
            (0.0000,  0.0000, 0.0000, 1.0000)>
<Matrix 4x4 (1.0000,  0.0000, 0.0000, 0.0000)
            (0.0000,  0.9890, 0.1478, 0.0000)
            (0.0000, -0.1478, 0.9890, 0.0000)
            (0.0000,  0.0000, 0.0000, 1.0000)>

The first printed matrix is the matrix_basis. As you can see, it differs from m. For example, the element of the second row, third column have to be 0 but is 0.1478.

I haven't apply any constraints to cylinder. So whats wrong by setting the basis_matrix in this way?

Edit:

In addtion to @mont29 's answer, I've found the following document: issues in orientation-matrix in Blender <2.50

Current implementation of orientation-matrix system in Blender is not reliable: there are limitations / some nasty problems with mirrored/non-uniform-scaled geometry in Blender

Perhaps, it is not a bug, but a system design side-effect: insufficient/incomplete representation method of object orientation data with "all-in-one loc/rot/scale-matrix".

Yes, m isn't orthogonal (m.is_orthogonal == False), so Blender can't handle it.

$\endgroup$
0
$\begingroup$

matrix_basis only supports valid transform matrices - not a specialist, but by the look of it your m looks more like a shearing one?

Note that internally, there is no matrix_basis at all, Blender only stores translation/rotation/scaling separately, and converts them to/from RNA's matrix_basis. So if a matrix cannot be represented by a translation, rotation and scaling, then you cannot expect it to work.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.