【问题标题】:Implement transform.Rotate using rotation matrix使用旋转矩阵实现 transform.Rotate
【发布时间】:2018-12-18 18:39:47
【问题描述】:

我正在尝试使用旋转矩阵在 Unity 中的 y 轴上实现 transform.Rotate,这可能吗?我写了这个函数,但它似乎不起作用,pos是要旋转的对象的位置,theta是角度

public static MyQuaternion Rotate(Vector3 pos, float theta)
 {
         pos = pos.normalized;
         pos -= pos;
         float[,] m = new float[3, 3];

         m[0, 0] = Mathf.Cos(theta); 
         m[0, 1] = 0; 
         m[0, 2] = Mathf.Sin(theta);
         m[1, 0] = 0; 
         m[1, 1] = 1; 
         m[1, 2] = 0;
         m[2, 0] = -Mathf.Sin(theta); 
         m[2, 1] = 0; 
         m[2, 2] = Mathf.Cos(theta);

         Vector3 newPos = new Vector3();
         float temp;

         for (int i = 0; i < 3; ++i)
         {
             temp = 0;
             for (int j = 0; j < 3; ++j)
             {
                 temp += m[i, j] * pos[j];
             }
             newPos[i] = temp;
         }

         newPos += pos;

         return new MyQuaternion(newPos.x, newPos.y, newPos.z, 0);
 }

你有什么想法吗?谢谢

【问题讨论】:

  • but it doesn't seems to work - 以什么方式?最终结果不正确吗?你从哪里得到这个等式?您是要旋转点pos 本身,还是创建一个围绕pos 旋转对象的矩阵?
  • 您似乎在旋转矢量排序,但最后您将旋转的矢量推入四元数 - 这显然是错误的。您的方法返回 Vector3,而不是旋转。如果您需要旋转,已经有一些方法可以从内置到 Quaternion 类中的方向生成四元数
  • @meowgoesthedog 我想将对象本身旋转 90 度,所以我获取它的坐标并使用它来平移到原点并为 y 轴应用基本旋转矩阵,然后我转换位置将对象转换为将应用于对象的四元数(不确定转换)。问题是对象不旋转,它只是保持静止。
  • 为此,您需要返回一个 4x4(不是 3x3)变换矩阵,即 3-D 中的 仿射 变换。仅仅返回一个四元数是不够的,更不用说你以 @zambari 提到的错误方式构造它了。
  • 你为什么要这样做:pos -= pos;

标签: unity3d matrix rotation geometry


【解决方案1】:

如果您想深入了解手动旋转矢量,您可以这样做,但是我不确定您返回的 MyQuaternion 类型。

如果您只想将矢量旋转任意角度,您可以使用 Unity 在 Quaternion 类中的构建。 Vector3 的乘法被定义为该向量的旋转,所以你可以这样做

Quaternion q=Quaternion.Euler(theta,0,0); // or however you want to map it
Vector3 rotatedVector=q*inputVector;
return rotatedVector;

单位旋转通常通过四元数乘法完成。要将其应用于游戏对象,只需将其变换乘以您要执行的旋转即可。

transform.rotation*=Quaternion.Euler(0,0,theta);

物体的位置在旋转中没有任何作用。

【讨论】:

  • 我看到了Rotate的这个实现,我也尝试在MyQuaternion中实现Euler。我在euclideanspace.com/maths/geometry/rotations/conversions/… 找到的那个给出了错误的结果,导致我的对象旋转错误,而我在stackoverflow.com/questions/12088610/… 找到的那个似乎与 Quaternion.Euler 完全一样,但我不明白为什么两者之间存在不匹配两种方法。
  • 您是否有理由需要重新发明轮子? Unity 对开箱即用的大量旋转提供了不错的支持,滚动你自己的方法意味着处理很多奇怪的边缘情况
  • 我知道你的意思,但是我正在做一个大学项目,我需要自己实现这种功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
相关资源
最近更新 更多