世界坐标系的原点为(0,0,0)。是blender默认创建对象的轴心位置,只要你不动游标位置,Blender同其他3D软件不一样,游标优先过坐标原点。
如果进入"编辑"模式,对象的原点是自身的轴心点,顶点坐标值始终相对于对象的原点。
全局与本地
这给我们带来了坐标系统。假设我有两个球体。每个球体在世界坐标中具有不同的位置,也就是说,在全局坐标。不管它现在在世界坐标的什么地方。我可能想要将光标定位到该球体的"中心"(0,0,0),这与该球体的"世界"没有任何关系。所以,我现在说的是那个特定领域的"局部"坐标系。
坐标系也称为变换方向。坐标系是关于 X/Y/Z 轴的方向。
枢轴或变换枢轴点与坐标系没有任何关系,也与对象原点设置没有任何关系。这只是要用作变换(移动、旋转、缩放)或修改器的透视的原点。对于单个对象的操作,我们希望该操作相对于对象的原点执行。对于多个对象,默认值为中心点位置(就是等所有对象原点的平均数)。
当您使用错误的参考框架时
以下代码段的目的是将对象的原点移动到其边界框中心。请注意,对于严重修改的对象,其原点可能不再位于其"质量中心(体积)"中。
示例 1(不正确)
import bpy
from mathutils import Vector, Matrix
obj=bpy.context.active_object
center = 0.125 * sum((obj.matrix_world @ Vector(bound) for bound in obj.bound_box), Vector())
obj.location = center
obj.data.transform(Matrix.Translation(-center))
obj.data.transform(Matrix.Scale(0.998, 4, Vector((-1, 0, 0)) ) )
obj.data.transform(Matrix.Scale(0.998, 4, Vector((0, -1, 0)) ) )
obj.data.transform(Matrix.Scale(0.998, 4, Vector((0, 0, -1)) ) )
示例 2(正确)
中心做以下操作:对于边界框 (8x) 中的每个顶点,求和坐标除以 8。这将导致边界框中心(顶点)的坐标。
对于我们的简单立方体,以局部坐标系坐标表示的界框中心与对象原点 = (0,0,0)
obj.matrix_world 此 Math 函数采用(局部)坐标,并在其世界空间等效项(例如相对于世界原点 (0,0,0)))中表示它们。
obj.location物体在空间中的位置。(X,Y,Z) 坐标值是相对于世界原点的数字。obj.location=中心我们不想在这里这样做。记住中心在局部坐标系中表示。它会将多维数据集移动到世界原点 (0,0,0),这不是我们想要的。obj. location= obj.matrix_world @ center对象的边界框中心使用全局坐标系表示。
应用变换
对所选对象应用多个转换。对象变换坐标将传输到对象数据。如果对象具有子物体,则也会将这些转换应用于其子级。
应用变换值实质上重置对象的位置、旋转或缩放的值,但实际上对对象不执行任何操作。对象原点移动到全局原点,转换值设置为零。在比例方面,比例值将返回到 1。
obj.data.transform(Matrix.Translation(-center))X、Y 和 Z 位置值现在设置为零,无需移动对象。
对象局部原点设置为世界原点,并且每个对象的顶点都将递增/递增以适合对象的局部空间坐标值 ,对象变换坐标将传输到对象数据。
