Реализация transform.Rotate с использованием матрицы вращения - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь реализовать преобразование. Поворот по оси Y в Unity с использованием матрицы вращения, возможно ли это?Я написал эту функцию, но она, похоже, не работает, 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);
 }

У вас есть идеи?Спасибо

1 Ответ

0 голосов
/ 18 декабря 2018

Если вы хотите углубиться во вращение вектора вручную, вы вроде как все делаете правильно, однако я не уверен насчет типа 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);

Положение объекта не имеет никакой игры во вращении.

...