理解ue4的坐标转换

问题1:一个actor的component的relativetransform包含location、rotator、scale是相对于谁来说的?
猜想:是相对于就近component来说的
证明:通过getrelativelocation,一层一层往上层component坐标系移动(transformlocation)直到转到世界坐标系,在ue4 editor中,选中你要转的actor,然后修改transform中location的相对位置,把relative改成world,与转出来的值做对比,如果一致,证明是对的或者直接将算出来的值覆盖原来关卡中操作Actor的值,观察Actor是否与原来的一致

问题2:如何证明自己是否理解坐标转换?
证明:通过在ue4 editor中,拼一个多层嵌套,操作其中一个component,通过一层一层向世界坐标系转,记录值,在editor中同思考1去验证结果,然后再一层层转向原来的本地坐标,如果能还原actor,证证明理解对了

结论:如果问题1验证正确,问题2也验证正确,则多层嵌套中的component不能直接通过该actor的transform,直接转向世界坐标系

问题3:如何快速将多层嵌套的component的位置、旋转、缩放转到根component的做坐标系
思路:ue4提供直接转世界坐标系的接口,所以先转到世界坐标系,然后通过transformlocation转到rootcomponent坐标系

问题4:查看getworldlocation的实现,证明问题1?

问题5:位置是一个vector,模型中的点也是一个vector,对于坐标系的转换,是否也是一样?

测试总结:基本思路是对的,但是通过ue4 GetWorldLocation和一层层转化到世界坐标系不是完全一样;但是基本一致,GetWorldLocation里面的实现是算出最终的Transform然后通过点转换,而一层层转换是拿到每一层转换后的点与上层再次转换得到,中间有浮点数,会因为精度问题造成最终值的不同。在关卡中选中操作的Actor,查看Transform中绝对坐标也与算出来的基本一致;GetWorldRotator与一层层算出的结果相差很大,因为欧拉角有万象锁问题,即同一个方向对应多个欧拉值造成的,算出的值与editor的也不一样。

问题6:证明世界旋转值,三种方法值不一样,是由欧拉角造成的?
猜想:将算出的值,将在关卡并选中Actor,切换Actor旋转的坐标系,把值赋值给旋转,看关卡中表现是否一样,如果一样证明是对的

问题7:如何判断当前坐标系属于左手还是右手坐标系?

问题8:如何判断轴的旋转方向?
猜想:将右手大拇指指向轴延伸方向,即值越来越大的方向,然后其余手指弯曲,弯曲方向即为顺时针方向
验证:通过控制pawn的摄像机,看摄像机看向的方向是否与除大指姆外,其余指姆指尖指向的方向,切旋转值在变大

问题9:拿到一个transform值,能想象到在场景中的物体应该是什么样子或者说我能能拿现实中的物体,通过transform能知道物体最终的状态?
猜想:明确Rotator的正值,表示是延顺时针方向旋转;根据左手法则和右手法则,即通过坐标系选择是左手法则【对应左手坐标系】还是右手坐标系判断正方向;明确ue4中,Z轴旋转是按左手坐标系旋转;X轴和Y轴是延右手坐标系旋转;明确ue4中相对坐标系的旋转顺序是Yaw-Pich-Roll【Z-Y-Z】;世界坐标系的旋转坐标系是Roll-Pich-Yaw【X-Y-Z】;明确旋转一个轴后,坐标轴方向也在旋转,在确定下一个旋转方向时,要在新的坐标系进行判断;所以拿到具体的旋转值,要看该值是相对值,还是世界坐标值,然后通过旋转顺序去旋转,通过左右手法则以及ue4在实际旋转轴对应的坐标系来确定往什么方向旋转,旋转多少度;旋转一个轴后,要在新的坐标系下进行下一个轴旋转

你可能感兴趣的:(UE4)