1.新建一個空物體,命名為parent設置坐標為(3, 0, 0)
2.在parent下新建一個cube,設置坐標為(3, 0, 0)
給cube添加一個Test腳本,在Start方法里添加如下代碼
1 print("transform.position" + transform.position); 2 print("transform.localPosition"+transform.localPosition);
運行輸出結果為:
transform.position(6.0,0.0,0.0)
transform.localPosition(3.0,0.0,0.0)
我的理解:transform.localPosition值局部坐標,相對父親的原點來設置的,無論父坐標怎么改變,localPosition的坐標是不會改變的。好比你坐在一輛行駛的汽車里,無論車開到哪里,你還是坐在你的座位上,你相對汽車的位置是不變的。
transform.position指的是世界坐標,根據世界的原點來設置的。這時候如果父坐標發生改變,那么子物體的世界坐標也會隨着改變。好比你坐在一輛行駛的汽車里,汽車位置改變了,你用經緯度描述的位置也會發生改變。這里經緯度就好比世界坐標。
矩陣變換:
1.物體坐標轉換到世界坐標M矩陣
Vector3 posWorld = transform.parent.localToWorldMatrix.MultiplyPoint(transform.localPosition);
print("posWorld"+posWorld);
輸出為psWorld(6.0,0.0,0.0)
2.世界坐標轉換到相機坐標V矩陣
1 Vector3 viewportPos = cameraGameObj.transform.worldToLocalMatrix.MultiplyPoint(transform.position); 2 print("viewportPos"+viewportPos);
輸出為viewportPos(6.0, -1.0, 10.0) cameraGameObj指的是MainCamera,坐標為(0, 1, -10)
把Cube拖放到MainCamear下,cube的transform組件中的position顯示為(6.0, -1.0, 10.0),證明矩陣變換無誤。