Unity中无需添加对象,如何获取相对于父物体的本地坐标?
无需实例化对象获取Unity父物体本地坐标的方法
完全可以不用实例化对象,直接计算目标坐标相对于父物体的本地坐标。
当前代码结果不匹配的可能原因
你调用SetParent(_ballsParent, false)时,会保持对象的世界位置不变,此时对象的localPosition理论上应该等于_ballsParent.InverseTransformPoint(leftTargetPosition)。如果结果不匹配,大概率是以下两种情况:
leftTargetPosition并非世界空间坐标,而是其他局部空间的坐标值- 父物体
_ballsParent存在非均匀缩放(x/y/z轴缩放比例不一致),InverseTransformPoint在这种场景下会产生偏差
正确的计算方法
根据父物体的缩放情况,选择对应的计算方式:
父物体为均匀缩放
直接使用InverseTransformPoint即可得到正确的本地坐标:
Vector3 localPos = _ballsParent.InverseTransformPoint(leftTargetPosition);
该方法会将世界坐标转换为父物体的本地坐标,同时考虑父物体的位置、旋转和均匀缩放。
父物体存在非均匀缩放
此时InverseTransformPoint的结果可能不符合预期,建议直接使用世界转本地矩阵计算:
Matrix4x4 worldToLocalMatrix = _ballsParent.worldToLocalMatrix; Vector3 localPos = worldToLocalMatrix.MultiplyPoint3x4(leftTargetPosition);
矩阵运算能更精准地处理非均匀缩放场景下的坐标转换。
结果验证
如果想确认计算结果是否正确,可以在实例化对象后做对比:
Transform target = Instantiate(_leftTargetPrefab, leftTargetPosition, Quaternion.identity); target.SetParent(_ballsParent, false); Debug.Log(localPos == target.localPosition);
内容的提问来源于stack exchange,提问作者Operator
相关产品推荐
相关产品推荐

