参考w网址
说是以前的GetPos
()干掉了。。
AttributeError: 'c4d.BaseObject' object has no attribute 'GetPos'. Did you mean: 'GetAbsPos'?
不管是Get还是Set,RelPos和AbsPos的位置只有freeze之后才有差别。
移动了父对象并不会对子对象有任何影响,只有拽出来在场景根级别才能叠加父的位置,真正的成为绝对坐标,AbsPos,这或许就是一个bug吧。。那你想要真真的absPos只有手动加父物体的变换了。。
这个跟官方推荐freeze transform有很大关系。场景中创建父子两物体,parent上挂上下面的python,勾选enable
import c4d
def main():doc = c4d.documents.GetActiveDocument()# 创建一个父对象(立方体)和一个子对象(球体)parent_cube = doc.SearchObject("parent")child_sphere = doc.SearchObject("child")# 获取初始相对位置和绝对位置rel_pos_init = child_sphere.GetRelPos()abs_pos_init = child_sphere.GetAbsPos()print("初始相对位置:", rel_pos_init)print("初始绝对位置:", abs_pos_init)# 移动父对象new_position = c4d.Vector(0, 0, 100)parent_cube.SetAbsPos(new_position)# 手动更新场景,确保位置计算正确c4d.EventAdd()# 获取移动父对象后的相对位置和绝对位置rel_pos_after = child_sphere.GetRelPos()abs_pos_after = child_sphere.GetAbsPos()print("移动父对象后相对位置:", rel_pos_after)print("移动父对象后绝对位置:", abs_pos_after)if __name__ == "__main__":main()
反馈
初始相对位置: Vector(0, 0, 100)#冻结前,GetRelPos和GetAbsPos一模一样。
初始绝对位置: Vector(0, 0, 100)#冻结前,GetRelPos和GetAbsPos一模一样。
移动父对象后相对位置: Vector(0, 0, 100)#冻结前,移动父,GetRelPos和GetAbsPos一样。
移动父对象后绝对位置: Vector(0, 0, 100)#冻结前,移动父,GetRelPos和GetAbsPos一样。
发现还真是一样的。这时候选择子物体点freezeP,就把transform里的数据移动到freeze里来了。物体的相对父物体的位置标记为0了,这对角色控制器回归到tpose很有用。设置tpose控制器时候点freeze,动作后坐标设置归0,就到tpose了。
初始相对位置: Vector(0, 0, 0)#冻结后,相对父物体变为0了,位置不变
初始绝对位置: Vector(0, 0, 100)#冻结后,GetRelPos和GetAbsPos就有差别了
移动父对象后相对位置: Vector(0, 0, 0)#冻结后,相对父物体变为0了,位置不变
移动父对象后绝对位置: Vector(0, 0, 100)#移动父对象GetAbsPos()并不能改变什么
这回反馈就不一样了。这时候再把child球体从parent里扯出来
初始相对位置: Vector(0, 0, 100)
初始绝对位置: Vector(0, 0, 200)
移动父对象后相对位置: Vector(0, 0, 100)
移动父对象后绝对位置: Vector(0, 0, 200)#扯出来后GetAbsPos()才真正意义是全局位置,当然也就不关父物体啥事了。所以初始和移动父的数据都是一样的。
发现球体从父对象中移除了,绝对位置竟然加上了父对象的位置。成为了真正的绝对位置。
接着释放掉freeze p,
初始相对位置: Vector(0, 0, 200)#相对位置就加上了freeze的数值
初始绝对位置: Vector(0, 0, 200)
移动父对象后相对位置: Vector(0, 0, 200)#增移父物体也不关数据卵事,以为不是子物体了。
移动父对象后绝对位置: Vector(0, 0, 200)
把父物体的增移改回去,再把子球体拽来当儿子。又跟开始一模一样了。
初始相对位置: Vector(0, 0, 100)
初始绝对位置: Vector(0, 0, 100)
移动父对象后相对位置: Vector(0, 0, 100)
移动父对象后绝对位置: Vector(0, 0, 100)
这说明了啥呢?
不管是Get还是Set,RelPos和AbsPos的位置只有freeze之后才有差别。
移动了父对象并不会对子对象有任何影响,只有拽出来在场景根级别才能叠加父的位置,真正的成为绝对坐标,AbsPos,这或许就是一个bug吧。。那你想要真真的absPos只有手动加父物体的变换了。。
#获取假的绝对位置,其实是相对位置,和relpos一样。
RelPos2 = obj2.GetAbsPos()# 获取obj2父物体的世界位置
GETparent = child.GetUp()
GETparentPos=GETparent.GetAbsPos()
AbsPos= GETparentPos+RelPos2
#这样的abspos才是真的