2016-06-20 3 views
0

У меня проблема с вращением игрового объекта. Я могу повернуть объект в направлении/углу другого игрового объекта. Но после первого поворота игровой объект i вращается на основе дельта-поворота исходного игрового объекта. Он начинает вращаться в другом направлении, потому что он был повернут один раз, я думаю.Unity Quaternion сбрасывает базовую ориентацию

Итак, есть ли способ, чтобы после первого поворота я мог сбросить вращение, чтобы он снова перемещался в угол/направление вращения другого объекта?

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

Любая помощь приветствуется :).

public class Tilt : MonoBehaviour { 

public GameObject TiltAgainstObject; 
private float rotX; 
private float rotY; 
private float rotZ; 
private float rotW; 
private float deltaX; 
private float deltaY; 
private float deltaZ; 
private float deltaW; 

// Use this for initialization 
void Start() { 

    rotX = TiltAgainstObject.transform.rotation.x; 
    rotY = TiltAgainstObject.transform.rotation.y; 
    rotZ = TiltAgainstObject.transform.rotation.z; 
    rotW = TiltAgainstObject.transform.rotation.w; 
} 

// Update is called once per frame 
void Update() { 

    if(OVRInput.Get(OVRInput.Button.One)) 
    { 
     deltaX = TiltAgainstObject.transform.rotation.x - rotX; 
     deltaY = TiltAgainstObject.transform.rotation.y - rotY; 
     deltaZ = TiltAgainstObject.transform.rotation.z - rotZ; 
     deltaW = TiltAgainstObject.transform.rotation.w - rotW; 
     gameObject.transform.localRotation = new Quaternion(gameObject.transform.rotation.x + deltaX, 
                 gameObject.transform.rotation.y + deltaY, 
                 gameObject.transform.rotation.z + deltaZ, 
                 gameObject.transform.rotation.w + deltaW); 
    } 
    rotX = TiltAgainstObject.transform.rotation.x; 
    rotY = TiltAgainstObject.transform.rotation.y; 
    rotZ = TiltAgainstObject.transform.rotation.z; 
    rotW = TiltAgainstObject.transform.rotation.w; 
} 

}

ответ

0

Вопрос кажется немного запутанным, бур, если вы хотите второй GameObject (где ваш скрипт) для вращения с тем же направлением первого объекта, который вы должны сделать что-то вроде этого:

public class Tilt : MonoBehaviour { 

public GameObject TiltAgainstObject; 
private float rotX; 
private float rotY; 
private float rotZ; 
private float rotW; 
private float deltaX; 
private float deltaY; 
private float deltaZ; 
private float deltaW; 

// Use this for initialization 
void Start() { 

    rotX = TiltAgainstObject.transform.rotation.x; 
    rotY = TiltAgainstObject.transform.rotation.y; 
    rotZ = TiltAgainstObject.transform.rotation.z; 
    rotW = TiltAgainstObject.transform.rotation.w; 

    deltaX = 0; 
    deltaY = 0; 
    deltaZ = 0; 
    deltaW = 0; 

} 

// Update is called once per frame 
void Update() { 
    rotX = TiltAgainstObject.transform.rotation.x; 
    rotY = TiltAgainstObject.transform.rotation.y; 
    rotZ = TiltAgainstObject.transform.rotation.z; 
    rotW = TiltAgainstObject.transform.rotation.w; 

    this.gameObject.transform.localRotation = new Quaternion(rotX + deltaX, 
                 rotY + deltaY, 
                 rotZ + deltaZ, 
                 rotW + deltaW); 


} 

Таким образом, второй объект будет вращаться в одном направлении первого объекта, если вы хотите изменить скорость вращения, просто измените дельты.

Если вы хотите, вращение происходит только при нажатии button.One только Pust это внутри, если заявление вместо:

if(OVRInput.Get(OVRInput.Button.One)) 
    { 
     this.gameObject.transform.localRotation = new Quaternion(rotX + deltaX, 
                 rotY + deltaY, 
                 rotZ + deltaZ, 
                 rotW + deltaW); 
    } 
+0

Извините за запутанный вопрос, моя логика в образце «работает», но только для первого вращения. Во второй раз, когда я поворачиваю его, он больше не вращается в одном направлении, а только первый поворот. Я думаю, это потому, что во второй раз, когда вы поворачиваете углы поворота вращения второго объекта, не больше 0,0,0? Любая идея, как сделать второй раз, когда вы нажимаете кнопку, чтобы повернуть, что второй объект также вращается в одном направлении правильно ?. – LordrAider

0

Я думаю, что проблема в том, что вы присваиваете мир координат rotation к ваша локальная координата localRotation, опечатка может быть? Кроме того, я не уверен, почему вы непосредственно редактируете компоненты Quaternion, как правило, лучше просто добавить их вместе и использовать функции Unity, так как обработка 4-мер часто бывает подвержена ошибкам. Вы можете попробовать что-то вроде этого:

public class Tilt : MonoBehaviour { 

    public GameObject TiltAgainstObject; 
    private Quaternion prevRotation; 
    private Quaternion currentRotation; 

    void Start() 
    { 
    prevRotation = TiltAgainstObject.transform.rotation; 
    } 

    void Update() 
    { 
    currentRotation = TiltAgainstObject.transform.rotation; 
    if (OVRInput.Get(OVRInput.Button.One)) 
     gameObject.transform.rotation *= Quaternion.RotateTowards(prevRotation, currentRotation, 1000f); 
    prevRotation = currentRotation; 
    }