当前位置:网站首页>Transform 相对位置变换,坐标系转换
Transform 相对位置变换,坐标系转换
2022-08-04 05:57:00 【渐末竹】
1.在开发的时候有遇到需要做对某一个对象进行坐标系转换,比如需要一个对象a,需要时刻保持相对于A不变。 最简单的时 将a作为A的子物体。 这时候无论A怎么变换,a都相对A 是一致的。 这样做肯定是没问题的,而且简单。
2.但是呢! 也会碰到情况复杂,选择a 设置为A的子物体,可能会影响到其他的逻辑,所以不能做样做。那这时候就得通过计算来得到。 这里就要做坐标系转换。那么就需要用到Transform.TransformPoint 以及Transform.TransformDirection 。
3. 首先是做位移的计算。 对某个点进行坐标系转换,用 Transform.InverseTransformDirection 和 Transform.TransformPoint 就可以。
在初始化的时候 使用 Transform.InverseTransformDirection() 方法,将a的世界坐标,转化为相对于A的局部坐标。保存这个局部坐标,这个就是需要a一致保持的位置信息。
然后在A姿态发生变化时, 通过 Transform.TransformPoint 可以将刚保存的局部坐标,从A 坐标系转化到世界坐标系,这时候将得到的坐标赋值给a. 位置就可以实现相对A不变。
4. 然后就是要做角度也要相对A不变。 同样需要保存一个局部的角度信息
(1)第一种,直接保存相对的四元数信息。如下
Quaternion.Inverse(a.rotation) * A.rotation
在A发生变化后,在执行 Quaternion rot = defaultRot * A.rotation;
rot即是变化后a现对A角度一致的rotation.
(2)第二种 采用 transform.TransformDirection 。 这个是对向量进行坐标系转换,,所以就选一个轴在做。 用Forward 比较方便。
首先依旧是初始化的时候,记录相对方向。如下
DefauleDrec = A.InverseTransformDirection(a.forward);
在A发生变化后,在执行
Vector3 Rot01 = A.TransformDirection(DefauleDrec); // 将方向从A的坐标系转化到世界坐标系。
a.rotation = Quaternion.LookRotation(Rot01, transform.up); //然后在将旋转赋值到a
测试代码如下:
public Transform A;
public Transform a;
private Vector3 defaultPos=Vector3.zero;
private Vector3 DefauleDrec = Vector3.zero;
private Quaternion defaultRot;
// Start is called before the first frame update
void Start()
{
//记录子级初始的相对于父级的角度姿态。
DefauleDrec = A.InverseTransformDirection(a.forward);
defaultPos= A.InverseTransformPoint(a.position);
defaultRot = Quaternion.Inverse(a.rotation) * A.rotation;
}
// Update is called once per frame
void Update()
{
//方法一
//变换之后的位置计算
Vector3 Pos = A.TransformPoint(defaultPos);
//变换之后的放向计算
Quaternion rot = defaultRot * A.rotation;
a.position = Pos;
a.rotation = rot;
// 方法二
//变换之后的位置计算
Vector3 Pos01 = A.TransformPoint(defaultPos);
//变换之后的放向计算
Vector3 Rot01 = A.TransformDirection(DefauleDrec);
a.position = Pos01;
a.rotation = Quaternion.LookRotation(Rot01, transform.up);
}
边栏推荐
猜你喜欢
DropBlock: 卷积层的正则化方法及复现代码
VMD combined with ISSA to optimize LSSVM power prediction
NelSon:一款新的适配matlab编程语法的编程工具
Centos通过Docker搭建MySQL的PXC集群
90多款matlab工具箱打包放送
Faster RCNN原理及复现代码
Gramm Angle field GAF time-series data into the image and applied to the fault diagnosis
nacos 返回 403 unknown user 太他么坑了 源码解析
ubuntu18.04安装redis教程
如何用matlab做高精度计算?【第二辑】
随机推荐
unicloud 腾讯云 上传文件 Have no access right to the storage uniapp
90多款matlab工具箱打包放送
matlab封闭曲线拟合 (针对一些列离散点)
SystemVerilog-条件(三元)运算符
Jenkins pipeline 自动部署实践
格拉姆角场GAF将时序数据转换为图像并应用于故障诊断
基于EEMD+GRU+MLR的时间序列预测
电脑知识:台式电脑应该选择品牌和组装,值得收藏
无监督特征对齐的迁移学习理论框架
如何画好业务架构图。
【深度学习实践(二)】上手手写数字识别
Database knowledge: SQLServer creates non-sa user notes
Nacos 原理
MySQL外键(详解)
数组的一些方法
E-R图总结规范
数据库技巧:整理SQLServer非常实用的脚本
系统流量预估、架构设计方案
七夕送礼,心愿直抵!
Error EPERM operation not permitted, mkdir ‘Dsoftwarenodejsnode_cache_cacach两种解决办法