From BlenderWiki

Jump to: navigation, search
Note: This is an archived version of the Blender Developer Wiki. The current and active wiki is available on wiki.blender.org.

Hex Root

A fun one, this is the 'hex', like the square, if you have a hexagon this is how to know the total number of hexagons in the center from the number on 1 side as well as the hex root.

import math
 
def hex(x):
    a = (((x - 1.0) * 3.0) * x) + 1.0
    return a
 
def hex_root(a):
    x = (3.0 + math.sqrt(9.0 - (12.0 * (1.0 - a)))) / 6.0
    return x

or more info http://en.wikipedia.org/wiki/Centered_hexagonal_number

Align Matrix Axis

Used this to create all possible axis flipping for blender python.

from mathutils import Vector, Matrix
 
def align_matrix(mat, axis, vec, eps=0.000001):
    if axis == 'X':
        ori = mat[2].copy()
        if abs(vec.dot(ori)) > (1.0 - eps):
            ori = mat[1].copy()
        x = vec
        y = ori.cross(x)
        z = x.cross(y)
    elif axis == 'Y':
        ori = mat[0].copy()
        if abs(vec.dot(ori)) > (1.0 - eps):
            ori = mat[2].copy()
        y = vec
        z = ori.cross(y)
        x = y.cross(z)
    elif axis == 'Z':
        ori = mat[1].copy()
        if abs(vec.dot(ori)) > (1.0 - eps):
            ori = mat[0].copy()
        z = vec
        x = ori.cross(z)
        y = z.cross(x)
 
    mat[0] = x.normalized()
    mat[1] = y.normalized()
    mat[2] = z.normalized()
 
 
def world_transform(axis, up):
 
    axis_vec = Vector()
    up_vec = Vector()
 
    axis_vec[ord(axis[-1]) - ord('X')] = -1.0 if axis.startswith('-') else 1.0
    up_vec[ord(up[-1]) - ord('X')] = -1.0 if up.startswith('-') else 1.0
 
    mat = Matrix()
    mat = mat.to_3x3()
    mat.identity()
 
    align_matrix(mat, 'Y', up_vec)
    align_matrix(mat, 'Z', axis_vec)
 
    # print(mat)
    return mat
 
 
import bpy
# bpy.context.object.matrix_world = world_transform('Z', '-X').to_4x4()
opts = ('X', 'Y', 'Z', '-X', '-Y', '-Z')
 
for a in opts:
    for b in opts:
        if a[-1] != b[-1]:
            mat = world_transform(a,  b)
            exp = tuple([tuple([j for j in k]) for k in mat])
            print("%s: %s," % ((a, b), exp))