本文正在参加「金石计划 . 瓜分6万现金大奖」
功能简介
该脚本可以快速的对齐对象的方向,避免手动调校的繁琐与不精确,但是它仅限 三个对象 中的其中一个对齐到其余二者的位置所形成的 方向 上,并且位置还处于其二者之间 中心点 上。
注意:脚本内部会自行判断是否选中的是三个对象,如果不满足该条件,则脚本自动退出
效果展示
运行脚本前
将 圆柱体 作为目标对象(最后 选中)
运行脚本后
- 目标对象(局部坐标系)的 track 设置为
Z,up 设置为Y的情况下,脚本运行的效果如下
可见此时 Z 轴对齐指定方向,Y 轴保持向上
- 目标对象(局部坐标系)的 track 设置为
-Z,up 设置为Y的情况下,脚本运行的效果如下
可见此时 -Z 轴对齐指定方向,Y 轴保持向上
- 目标对象(局部坐标系)的 track 设置为
Z,up 设置为X的情况下,脚本运行的效果如下
可见此时 Z 轴对齐指定方向,X 轴保持向上
- 目标对象(局部坐标系)的 track 设置为
Y,up 设置为X的情况下,脚本运行的效果如下
可见此时 Y 轴对齐指定方向,X 轴保持向上
注意:目标对象的 track 与 up 的设置需在脚本中手动修改,其设置是基于目标对象的局部坐标系,而不是全局坐标系,对应代码中的函数为
to_track_quat,请参看详细代码与注释
完整代码与注释
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万现金大奖」