ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-04 16:05:17  阅读:295  来源: 互联网

标签:Inverse parent Quaternion Unity child var 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;

推导过程如下:

  • 已知等式:
    parent.rotation * child.localRotation = child.rotation

  • 两边乘以 Quaternion.Inverse(parent.rotation) 等式变换:
    Quaternion.Inverse(parent.rotation) * parent.rotation * child.localRotation = Quaternion.Inverse(parent.rotation) * child.rotation

  • 左边因为 Quaternion.Inverse(parent.rotation) * parent.rotation = Quaternion.identity ,所以可以不写,那么等式再次变换:
    child.localRotation = 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有