【问题标题】:C# Getting the rows of MatricesC# 获取矩阵的行
【发布时间】:2019-04-11 19:42:17
【问题描述】:

对于我的一个大学项目,我们需要在 Unity 中编写自己的数学函数。我们可以使用一些预设的数学函数,但我们也必须自己创建其中一些作为课程作业的一部分。

目前,我正忙于转置我的旋转矩阵(俯仰、偏航和滚动),以及获取矩阵的行。 我们已经得到了一个基本信息,我们需要创建一个方法来获取我的 Matrix4by4 的行。

我们已经开始这样做了;

public Matrix4by4 RotationInverse()
{
     //GetRow is a method you'll need to create yourself
     return new Matrix4by4(GetRow(0), GetRow(1), GetRow(2), GetRow(3));
}

我们必须自己创建 GetRow 方法。

这是我的 Matrix4by4 方法的代码

        public static Matrix4by4 operator *(Matrix4by4 lhs, Matrix4by4 rhs)
        {
            Matrix4by4 rv = Identity;

            //vector.w = 1.0f; //Forcing the W component to 1 for translation Matrix. As Unity is converting a Vector4 to a Vector3 implicitly, the W component is set to 0 by default.
                             //With a translation component, the W component must be 1.

            rv.values[0, 0] = lhs.values[0, 0] * rhs.values[0, 0] + lhs.values[0, 1] * rhs.values[1 ,0] + lhs.values[0, 2] * rhs.values[2, 0] + lhs.values[0, 3] * rhs.values[3, 0];
            rv.values[1, 0] = lhs.values[1, 0] * rhs.values[0, 0] + lhs.values[1, 1] * rhs.values[1, 0] + lhs.values[1, 2] * rhs.values[2, 0] + lhs.values[1, 3] * rhs.values[3, 0];
            rv.values[2, 0] = lhs.values[2, 0] * rhs.values[0, 0] + lhs.values[2, 1] * rhs.values[1, 0] + lhs.values[2, 2] * rhs.values[2, 0] + lhs.values[2, 3] * rhs.values[3, 0];
            rv.values[3, 0] = lhs.values[3, 0] * rhs.values[0, 0] + lhs.values[3, 1] * rhs.values[1, 0] + lhs.values[3, 2] * rhs.values[2, 0] + lhs.values[3, 3] * rhs.values[3, 0];

            rv.values[0, 1] = lhs.values[0, 0] * rhs.values[0, 1] + lhs.values[0, 1] * rhs.values[1, 1] + lhs.values[0, 2] * rhs.values[2, 1] + lhs.values[0, 3] * rhs.values[3, 1];
            rv.values[1, 1] = lhs.values[1, 0] * rhs.values[0, 1] + lhs.values[1, 1] * rhs.values[1, 1] + lhs.values[1, 2] * rhs.values[2, 1] + lhs.values[1, 3] * rhs.values[3, 1];
            rv.values[2, 1] = lhs.values[2, 0] * rhs.values[0, 1] + lhs.values[2, 1] * rhs.values[1, 1] + lhs.values[2, 2] * rhs.values[2, 1] + lhs.values[2, 3] * rhs.values[3, 1];
            rv.values[3, 1] = lhs.values[3, 0] * rhs.values[0, 1] + lhs.values[3, 1] * rhs.values[1, 1] + lhs.values[3, 2] * rhs.values[2, 1] + lhs.values[3, 3] * rhs.values[3, 1];

            rv.values[0, 2] = lhs.values[0, 0] * rhs.values[0, 2] + lhs.values[0, 1] * rhs.values[1, 2] + lhs.values[0, 2] * rhs.values[2, 2] + lhs.values[0, 3] * rhs.values[3, 2];
            rv.values[1, 2] = lhs.values[1, 0] * rhs.values[0, 2] + lhs.values[1, 1] * rhs.values[1, 2] + lhs.values[1, 2] * rhs.values[2, 2] + lhs.values[1, 3] * rhs.values[3, 2];
            rv.values[2, 2] = lhs.values[2, 0] * rhs.values[0, 2] + lhs.values[2, 1] * rhs.values[1, 2] + lhs.values[2, 2] * rhs.values[2, 2] + lhs.values[2, 3] * rhs.values[3, 2];
            rv.values[3, 2] = lhs.values[3, 0] * rhs.values[0, 2] + lhs.values[3, 1] * rhs.values[1, 2] + lhs.values[3, 2] * rhs.values[2, 2] + lhs.values[3, 3] * rhs.values[3, 2];

            rv.values[0, 3] = lhs.values[0, 0] * rhs.values[0, 3] + lhs.values[0, 1] * rhs.values[1, 3] + lhs.values[0, 2] * rhs.values[2, 3] + lhs.values[0, 3] * rhs.values[3, 3];
            rv.values[1, 3] = lhs.values[1, 0] * rhs.values[0, 3] + lhs.values[1, 1] * rhs.values[1, 3] + lhs.values[1, 2] * rhs.values[2, 3] + lhs.values[1, 3] * rhs.values[3, 3];
            rv.values[2, 3] = lhs.values[2, 0] * rhs.values[0, 3] + lhs.values[2, 1] * rhs.values[1, 3] + lhs.values[2, 2] * rhs.values[2, 3] + lhs.values[2, 3] * rhs.values[3, 3];
            rv.values[3, 3] = lhs.values[3, 0] * rhs.values[0, 3] + lhs.values[3, 1] * rhs.values[1, 3] + lhs.values[3, 2] * rhs.values[2, 3] + lhs.values[3, 3] * rhs.values[3, 3];

            return rv;
        }

我有一个身份矩阵,我每次都将一个新矩阵传入其中

        public static Matrix4by4 Identity
        {
            get
            {
                return new Matrix4by4(
                    new Vector4(1, 0, 0, 0),
                    new Vector4(0, 1, 0, 0),
                    new Vector4(0, 0, 1, 0),
                    new Vector4(0, 0, 0, 1));
            }
        }

我有一个反转翻译的方法

public Matrix4by4 TranslationInverse()
{
   Matrix4by4 rv = Identity;

   rv.values[0,3] = -values[0,3];
   rv.values[1,3] = -values[1,3];
   rv.values[2,3] = -values[2,3];

   return rv;
}

我已经尝试了几个小时试图弄清楚,但我没有运气。

【问题讨论】:

  • GetRow() 作用于什么?是静态方法吗?如果是这样,您需要传入一个矩阵以及要从该矩阵中拉出的行(例如:GetRow(myMatrix, 0))。如果它是作用于矩阵的方法(例如:myMatrix.GetRow(0)),那么它将作用于 myMatrix。一旦你进入一个矩阵,它就非常简单了。只需遍历一行中的所有列并将它们添加到 Row 集合(例如 List Row; Row.Add(somevalue))。
  • 我刚刚和我的讲师谈过了,他给了我一些建议。 ``` 您的构造函数将接受 4x Vector4 参数并将值 (x, y, z, w) 作为第 0、1、2 和 3 列插入到矩阵值中。此函数考虑到这些概念并需要返回一个包含一行的 Vector4(从矩阵值中获取)。传入的数字对应于行号。 ```

标签: c# unity3d math


【解决方案1】:

矩阵类在Unity3D中称为Matrix4x4,这里参考http://docs.unity3d.com/ScriptReference/Matrix4x4.html

例如,您可以使用 GetRow 提取 vector4 并使用 SetRow 将它们设置回来,这样可以实现完整的往返:

    Vector4 row0=matrix.GetRow(0);
    Vector4 row1=matrix.GetRow(1);
    Vector4 row2=matrix.GetRow(2);
    Vector4 row3=matrix.GetRow(3);
    matrix.SetRow(0,row0);
    matrix.SetRow(1,row1);
    matrix.SetRow(2,row2);
    matrix.SetRow(3,row3);

从哪里实现你的任务应该是相当微不足道的。您可以将其重新包装成 float[x,y] 或者更好的 float [x][y] 以保持语法相似但实际上相同 - 我相信四个结构比四个数组快

编辑:既然您提到您的 Matrix4by4 类确实是自定义的,但您没有发布它的代码,我们可以猜测它有一个称为值的二维矩阵内部支持字段。在这种情况下,您的 getRow 方法看起来像

public Vector4 GetRow(int rowIndex)
{
return new Vector4(values[0,rowIndex],
values[1,rowIndex]
values[2,rowIndex]
values[3,rowIndex]);
}

【讨论】:

  • 是的 Matrix4by4 是自定义的。作为课程作业的一部分,我们必须自己实现一些数学函数。所以我们不允许使用 Matrix4x4。
  • 谢谢!是的,矩阵几乎是这样设置的 values[0,0] = column1.x; values[1,0] = column.y; values[2,0] = column.z; values[3,0] = column.w;
猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多