当前位置:网站首页>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);
}边栏推荐
- Provide 和 Inject 的用法
- A priori box (Anchor) in target detection
- Unable to preventDefault inside passive event listener due to target being treated as passive. See
- Error EPERM operation not permitted, mkdir ‘Dsoftwarenodejsnode_cache_cacach两种解决办法
- Sql优化总结!详细!(2021最新面试必问)
- 基于爬行动物搜索RSA优化LSTM的时间序列预测
- Database knowledge: SQLServer creates non-sa user notes
- MySQL配置文件配置
- Triton部署mmdeploy导出的TensorRT模型失败篇
- MMDeploy部署实战系列【第三章】:MMdeploy pytorch模型转换onnx,tensorrt
猜你喜欢

Computer software: recommend a disk space analysis tool - WizTree

Error ER_NOT_SUPPORTED_AUTH_MODE Client does not support authentication protocol requested by serv

Detailed explanation of DenseNet and Keras reproduction code

Based on the EEMD + + MLR GRU helped time series prediction

网络技巧:教你给路由器装上电池,断电照样可以上网!

ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法

matlab的2DCNN、1DCNN、BP、SVM故障诊断与结果可视化

MySQL(4)

Software: Recommend a domestic and very easy-to-use efficiency software uTools to everyone

基于子空间结构保持的迁移学习方法MLSSM
随机推荐
目标检测中的IoU、GIoU、DIoU与CIoU
微软电脑管家2.0公测版体验
七夕专属程序员的浪漫
格拉姆角场GAF将时序数据转换为图像并应用于故障诊断
硬件知识:RTMP和RTSP传统流媒体协议介绍
数据库技巧:整理SQLServer非常实用的脚本
元素的增删克隆以及利用增删来显示数据到页面上
搭建redis哨兵
Database Skills: Organize SQL Server's Very Practical Scripts
ubuntu18.04安装redis教程
七夕送礼,心愿直抵!
目标检测中的先验框(Anchor)
软件稳定性思考
Faster - RCNN principle and repetition code
有人试过用NPGsql驱动连接openGauss开发应用的吗?
[漏洞问题] log4j漏洞 关于2.17.0升级到2.18.0 方案
mysql基础(4)
FCN——语义分割的开山鼻祖(基于tf-Kersa复现代码)
Time Series Forecasting Based on Reptile Search RSA Optimized LSTM
代码小变化带来的大不同