Unity - Sin & Cos круговое движение с вращением - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь вычислить круговое движение (орбиту) вокруг объекта.Код, который я имею, дает мне хорошую круговую орбиту вокруг объекта.Проблема в том, что когда я вращаю объект, орбита ведет себя так, как будто объект не вращался.

Ниже я привел очень простую диаграмму, чтобы попытаться объяснить ее лучше.Слева - то, что я получаю, когда цилиндр находится в вертикальном положении, середина - то, что я получаю, когда объект вращается.Изображение справа - это то, что я хотел бы получить.

enter image description here

float Gx = target.transform.position.x - ((Mathf.Cos(currentTvalue)) * (radius));
float Gz = target.transform.position.z - ((Mathf.Sin(currentTvalue)) * (radius));
float Gy = target.transform.position.y;
Gizmos.color = Color.green;
Gizmos.DrawWireSphere(new Vector3(Gx, Gy, Gz), 0.03f);

Как я могу заставить орбиту меняться при вращении объектов?Я попытался умножить положение орбиты "новый вектор 3 (Gx, Gy, Gz)" на вращение объекта:

Gizmos.DrawWireSphere(target.transform.rotation*new Vector3(Gx, Gy, Gz), 0.03f);

но это, похоже, ничего не дало?

1 Ответ

0 голосов
/ 24 сентября 2018

Это происходит потому, что вы вычисляете вектор (Gx, Gy, Gz) в координатах мирового пространства , где повороты target объекта не принимаются во внимание.

Oneспособ удовлетворить ваши потребности - вычислить это вращение, используя *1007* локальные пространственные координаты объекта , а затем преобразовать их в мировые космические координаты .Это правильно заставит ваши вычисления учитывать вращение объекта target.

float Gx = target.transform.localPosition.x - ((Mathf.Cos(currentTvalue)) * (radius));
float Gz = target.transform.localPosition.z - ((Mathf.Sin(currentTvalue)) * (radius));
float Gy = target.transform.localPosition.y;

Vector3 worldSpacePoint = target.transform.TransformPoint(Gx, Gy, Gz);

Gizmos.color = Color.green;
Gizmos.DrawWireSphere(worldSpacePoint, 0.03f);

Обратите внимание, что вместо target.transform.position, который возвращает координаты мирового пространства данного преобразования,Я делаю вычисления, используя target.transform.localPosition, который извлекает локальные пространственные координаты данного преобразования.

Также я вызываю метод TransformPoint () , который преобразует координаты, которые я вычислил в локальном пространстве , в соответствующие значения в мировом пространстве .

Тогда вы можете смело вызывать метод Gizmos.DrawWireSphere(), которыйдля правильной работы требуются координаты мирового пространства.

...