世界坐標系的原點為(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 位置值現在設置為零,無需移動對象。
對象局部原點設置為世界原點,並且每個對象的頂點都將遞增/遞增以適合對象的局部空間坐標值 ,對象變換坐標將傳輸到對象數據。