Как повернуть объект по всем 3 осям пальцем? - PullRequest
0 голосов
/ 28 октября 2018

Я работаю над простым приложением AR Vuforia.Как я могу осуществить вращение объекта по всем трем осям одним движением пальца?

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

Здесьэто сценарий:

public float rotSpeed = 30f;

void OnMouseDrag()
{
float rotX = Input.GetAxis("Mouse X")*rotSpeed*Mathf.Deg2Rad;
float rotY = Input.GetAxis("Mouse Y")*rotSpeed*Mathf.Deg2Rad;

transform.Rotate(Vector3.up, -rotX);
transform.Rotate(Vector3.right, -rotY);
} 

Это не то, что мне нужно, как я могу повернуть объект в соответствии с направлением пальца независимо от угла, под которым я на него смотрю?

UPD:
Простой пример, не относящийся к AR, который может помочь вам понять, что мне нужно, - это игра ios "Space Frontier 2" .После успешного запуска ракеты она приземляется на планету, и вы можете вращать планету с помощью пальца.

ЗДЕСЬ ВИДЕО ДЕМО: https://youtu.be/OiNPP1WNIAI

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

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

public float rotSpeed = 30f;

float ClampAngle(float _angle, float _min, float _max)
{
    if (_angle < 0f) _angle = 360 + _angle;
    if (_angle > 180f) Mathf.Max(_angle, 360 + _min);
    return Mathf.Min(_angle, _max);
}

ПРИМЕНЕНИЕ:

void RotateGameObject()
{
    float h = Input.GetTouch(0).deltaPosition.x * Time.deltaTime * rotSpeed*Mathf.Deg2Rad;
    float v = Input.GetTouch(0).deltaPosition.y * Time.deltaTime * rotSpeed*Mathf.Deg2Rad;

    Vector3 rot = transform.rotation.eulerAngles + new Vector3(-v, h, 0f);
    //Change the y & z values to match your expected behaviour.
    rot.x = ClampAngle(rot.x, -5f, 20f);
    //Clamp rotation on the y-axis
    rot.y = ClampAngle(rot.y, -20f, 20f);
    transform.eulerAngles = rot;
}

Посмотрите, работает ли это, и, конечно, попробуйте поиграть со значениями.

0 голосов
/ 02 ноября 2018

Это работает хорошо независимо от вращения вашего объекта и независимо от положения вашей камеры относительно объекта:

public float rotSpeed = 30f;

void OnMouseDrag()
{
    float rotX = Input.GetAxis("Mouse X") * rotSpeed;
    float rotY = Input.GetAxis("Mouse Y") * rotSpeed;

    Camera camera = Camera.main;

    Vector3 right = Vector3.Cross(camera.transform.up, transform.position - camera.transform.position);
    Vector3 up = Vector3.Cross(transform.position - camera.transform.position, right);

    transform.rotation = Quaternion.AngleAxis(-rotX, up) * transform.rotation;
    transform.rotation = Quaternion.AngleAxis(rotY, right) * transform.rotation;
}

Убедитесь, что ваша камера имеет тег "MainCamera", или назначьте камеру внешне при необходимости.

0 голосов
/ 02 ноября 2018

У меня нет точного кода прямо сейчас.

Но если вы не обновили координаты своей точки зрения, это должно быть ожидаемым результатом.

Рассмотрим реальный шарс 2 цветами, синим и красным, разделенными вертикально.Когда вы находитесь перед ним, видя только синюю сторону, поглаживание его заставит синюю сторону подняться, а красная сторона появится снизу.Теперь двигайтесь за ним, видя только красную сторону, и снова поглаживайте его.Синее лицо опустится и появится снизу.Unity применяет физику к виртуальным объектам так же, как мы взаимодействуем с реальными объектами.

Поэтому вам нужно учитывать положение вашей камеры и ориентацию объекта, когда вы применяете движения к нему.Вам нужно применить матрицу трансформации к вашему движению на основе местоположения вашей камеры, связанного с ориентацией источника объекта.

Я надеюсь, что это достаточно ясно, чтобы поставить вас на пути, чтобы исправить это.

...