【Blender 小脚本】方向快速对齐

599 阅读2分钟

本文正在参加「金石计划 . 瓜分6万现金大奖」

功能简介

该脚本可以快速的对齐对象的方向,避免手动调校的繁琐与不精确,但是它仅限 三个对象 中的其中一个对齐到其余二者的位置所形成的 方向 上,并且位置还处于其二者之间 中心点 上。

注意:脚本内部会自行判断是否选中的是三个对象,如果不满足该条件,则脚本自动退出

效果展示

运行脚本前

image.png

圆柱体 作为目标对象(最后 选中)

image.png

运行脚本后

  • 目标对象(局部坐标系)的 track 设置为 Zup 设置为 Y 的情况下,脚本运行的效果如下

image.png

可见此时 Z 轴对齐指定方向,Y 轴保持向上

  • 目标对象(局部坐标系)的 track 设置为 -Zup 设置为 Y 的情况下,脚本运行的效果如下

image.png

可见此时 -Z 轴对齐指定方向,Y 轴保持向上

  • 目标对象(局部坐标系)的 track 设置为 Zup 设置为 X 的情况下,脚本运行的效果如下

image.png

可见此时 Z 轴对齐指定方向,X 轴保持向上

  • 目标对象(局部坐标系)的 track 设置为 Yup 设置为 X 的情况下,脚本运行的效果如下

image.png

可见此时 Y 轴对齐指定方向,X 轴保持向上

注意:目标对象的 trackup 的设置需在脚本中手动修改,其设置是基于目标对象的局部坐标系,而不是全局坐标系,对应代码中的函数为 to_track_quat,请参看详细代码与注释 image.png

完整代码与注释

import bpy

def rotate_between_two():
    if len(bpy.context.selected_objects) != 3: return # 判断是否选中三个对象
    objTarget = bpy.context.view_layer.objects.active # 将活跃对象定为目标对象
    # 记录其余两个选中对象的位置
    posA, posB = [ob.location for ob in bpy.context.selected_objects if ob != objTarget] 
    midPoint = (posA + posB)/2 # 计算其余二者的中点
    objTarget.location = midPoint # 将目标对象的位置设为上一步计算的中点
    axis = posA - posB # 计算其余二者的方向向量(轴)
    rotation_mode = objTarget.rotation_mode # 暂存目标对象的旋转模式(用于恢复)
    objTarget.rotation_mode = 'QUATERNION' # 临时置为 “四元数” 旋转模式
    objTarget.rotation_quaternion = axis.to_track_quat('Z','Y') # 将上一步计算的方向向量与指定的 track 和 up 轴结合,得到其旋转四元数,继而旋转目标对象
    objTarget.rotation_mode = rotation_mode # 恢复目标对象的旋转模式
    
rotate_between_two()

(完)

本文正在参加「金石计划 . 瓜分6万现金大奖」