其他分享
首页 > 其他分享> > Unity - 搬砖日志 - 获取 child 相对 parent 下的 rotation

Unity - 搬砖日志 - 获取 child 相对 parent 下的 rotation

作者:互联网


今天有位小伙伴问我如何获取 child 相对 parent 下的 rotation
也就是 child 相对 parent 下的 世界坐标下的四元数

但是啊,四元数,我一直还没去啃这块老骨头

后面都是搜索得到结果,到时推导过程很简单


推导过程:

已知 Unity 中 Transform parent, Transform child

想要获取:child 相对 parent 下的 Quaternion 应用变换,如下:

Transform parent, Transform child;
child.SetParent(parent);
var localQ = child.localRotation;

可以写成:

var localQ = Quaternion.Inverse(parent.rotation) * child.rotation;

推导过程如下:

// jave.lin : 写成代码方式
Quaternion.identity 		= Quaternion.Inverse(parent.rotation) * parent.rotation; 	// (1) Q * Q^-1 = I
var childWorldRotation 		= child.rotation;    										// (2) child  世界坐标下的 rotation
var childWorldLocalRotation = child.localRotation;    									// (3) child  世界坐标下的 rotation
var parentWorldRotation 	= parent.rotation;  										// (4) parent 世界坐标下的 rotation
var invParentWorldRotation 	= Quaternion.Invser(parent.rotation);						// (5) parent 世界坐标下的 逆 rotation

已知:
Quaternion.identity				= I
var childWorldRotation 			= C_W
var childWorldLocalRotation		= C_L
var parentWorldRotation 		= P_W
var invParentWorldRotation 		= P_IW

parentWorldRotation * childWorldLocalRotation = childWorldRotation
代数化:

P_W * C_L = C_W
两边乘以 P_IW : 
P_IW * P_W * C_L = P_IW * C_W
因为:P_W * P_IW = I

I * C_L = P_IW * C_W
I 可省略,得最终式子:
C_L = P_IW * C_W


还原代数,得:
var childWorldLocalRotation = invParentWorldRotation * childWorldRotation


引用大佬的简化推导

                        cam_rotation * q = obj_rotation  
inverse(cam_rotation) * cam_rotation * q = inverse(cam_rotation) * obj_rotation  
                                       q = inverse(cam_rotation) * obj_rotation

References

标签:Inverse,parent,Quaternion,Unity,child,var,rotation
来源: https://blog.csdn.net/linjf520/article/details/121144374