【发布时间】: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(从矩阵值中获取)。传入的数字对应于行号。 ```