从更改矩阵右手到左手坐标系(Changing a matrix from right-handed

2019-06-18 09:14发布

我想从一个右手系统中更改4x4矩阵:
x为左,右,Y是前后和z是向上和向下

以左手系统,其中:
x为左,右,z是正面和背面和y是向上和向下。

对于很容易的载体,只是交换的Y和Z值,但你怎么了矩阵做呢?

Answer 1:

让我试着更好一点解释。 我需要导出从搅拌机的模型,其中,z轴朝上,转换成OpenGL,其中y轴朝上。

对于每一个坐标(X,Y,Z),这是简单的; 只是交换y和z的值:(X,Z,Y)。
因为我已经换了所有的Y和Z值,我用任何矩阵也需要被翻转,使得它具有相同的效果。

很多搜索后,我终于找到一个解决方案gamedev :

如果您的矩阵如下所示:

{ rx, ry, rz, 0 }  
{ ux, uy, uz, 0 }  
{ lx, ly, lz, 0 }  
{ px, py, pz, 1 }

从左至右或从右到左改变它,它翻转这样的:

{ rx, rz, ry, 0 }  
{ lx, lz, ly, 0 }  
{ ux, uz, uy, 0 }  
{ px, pz, py, 1 }


Answer 2:

我想我明白你的问题,因为我目前面临着类似的一个。

  • 你开始一个世界矩阵变换的空​​间矢量其中Z高达(如世界矩阵)。

  • 现在你有一个空间,Y是了,你想知道如何处理旧的矩阵做。

试试这个:

有一个给定的世界矩阵

Matrix world = ...  //space where Z is up

这个矩阵改变矢量的Y和Z分量

Matrix mToggle_YZ = new Matrix(
{1, 0, 0, 0}
{0, 0, 1, 0}
{0, 1, 0, 0}
{0, 0, 0, 1})

您正在寻找这样的:

//same world transformation in a space where Y is up
Matrix world2 = mToggle_YZ * world * mToggle_YZ;

其结果是一样的矩阵cmann贴在下面。 但我认为这是更容易理解,因为它结合了以下计算:

1)开关Y和Z

2)做旧改造

3)切换回Z和Y



Answer 3:

我一直在努力将统一SteamVR_Utils.RigidTransform到ROS geometry_msgs /姿势和转换团结左手坐标系右手坐标系统中的ROS权需要。

这是我最后写转换坐标系的代码。

var device = SteamVR_Controller.Input(index);
// Modify the unity controller to be in the same coordinate system as ROS.
Vector3 ros_position = new Vector3(
    device.transform.pos.z,
    -1 * device.transform.pos.x,
    device.transform.pos.y);
Quaternion ros_orientation = new Quaternion(
    -1 * device.transform.rot.z,
    device.transform.rot.x,
    -1 * device.transform.rot.y,
    device.transform.rot.w);

本来我试图使用从@bleater矩阵的例子,但我似乎不能得到它的工作。 很想知道,如果我什么地方搞错了。

HmdMatrix44_t m = device.transform.ToHmdMatrix44();
HmdMatrix44_t m2 = new HmdMatrix44_t();
m2.m = new float[16];
// left -> right
m2.m[0] = m.m[0]; m2.m[1] = m.m[2]; m2.m[2] = m.m[1]; m2.m[3] = m.m[3];
m2.m[4] = m.m[8]; m2.m[5] = m.m[10]; m2.m[6] = m.m[9]; m2.m[7] = m.m[7];
m2.m[8] = m.m[4]; m2.m[9] = m.m[6]; m2.m[10] = m.m[5]; m2.m[11] = m.m[11];
m2.m[12] = m.m[12]; m2.m[13] = m.m[14]; m2.m[14] = m.m[13]; m2.m[15] = m.m[15];

SteamVR_Utils.RigidTransform rt = new SteamVR_Utils.RigidTransform(m2);

Vector3 ros_position = new Vector3(
    rt.pos.x,
    rt.pos.y,
    rt.pos.z);
Quaternion ros_orientation = new Quaternion(
    rt.rot.x,
    rt.rot.y,
    rt.rot.z,
    rt.rot.w);


Answer 4:

它往往是你想从一组向前的改变基质的情况下/右/上约定,另一组向前/右/上约定的。 例如,ROS使用z-起来,虚幻采用Y型的。 这个过程是你是否需要做一个霸道翻转。

请注意,“因开关右手成左手”是不明确的。 有很多左撇子前锋/右/上约定。 例如:前向= Z,右= X,向上= Y; 和正向= X,右= Y,向上= Z。 你真的应该把它看作是“ 我怎么转换着的ROS”概念/右/上虚幻的概念向前/右/上 ”。

所以,这是一个简单的工作,以创建一个公约之间转换的矩阵。 假设我们做到了这一点,现在我们有

mat4x4 unrealFromRos = /* construct this by hand */;
mat4x4 rosFromUnreal = unrealFromRos.inverse();

比方说,OP有来自ROS矩阵,并且她希望在虚幻中使用它。 她原来的矩阵需要ROS式载体,做一些东西给它,并发出ROS风格的载体。 她需要一个矩阵,需要一个虚幻式的载体,做同样的东西,发出虚幻式的载体。 这看起来是这样的:

mat4x4 turnLeft10Degrees_ROS = ...;
mat4x4 turnLeft10Degrees_Unreal = unrealFromRos * turnLeft10Degrees_ROS * rosFromUnreal;

它应该很清楚为什么这个工程。 你把一个虚幻的载体,将其转换为ROS风格,现在你可以使用ROS式矩阵就可以了。 这就给了你一个ROS载体,你转换回虚幻风格。

格里特的答案不是那么完全通用的,因为在一般情况下,rosFromUnreal!= unrealFromRos。 如果你只是反转单个轴,但不正确的,如果你正在做的事情一样转换X-> Y,Y-> Z,Z-> X这是真的。 我发现,这是容易出错少始终使用矩阵及其逆做这些约定开关,而不是试图编写翻转恰到好处的成员的特殊功能。

这种矩阵运算的inverse(M) * X * M谈到了很多。 你可以把它看作是一个操作“的基础上的变化”; 更多地了解它,请参阅https://en.wikipedia.org/wiki/Matrix_similarity 。



Answer 5:

如果由矩阵从左边或右边变换相乘您的积分情况而定。

如果从左侧乘以(例如:斧= X“其中A是一个矩阵和x”的变换点),你只需要交换第二和第三列中。 如果你从右边乘以(如:XA = X'),你需要换第二排和第三排。

如果您的点列向量那么你在第一个场景。



Answer 6:

更改罪因素-sin为swaping协调左右手之间的空间



Answer 7:

因为这似乎是一门功课的答案; 我给你一开始在一个暗示:你能做些什么来使矩阵的行列式负?

进一步的(更好的提示):既然你已经知道如何做个人的载体这一转变,你不觉得你能够与跨越矩阵代表了转型的基础载体做呢? (记住一个矩阵可以作为单位矢量的元组执行的线性transormation查看)



文章来源: Changing a matrix from right-handed to left-handed coordinate system
标签: math graphics