2017-10-25 1 views
1

Ich mag Gyro gesteuerte Kamera OnButtonClick Ereignis aktivieren, damit aber ich will es an der Kamera aktueller Position zu starten. Momentan, wenn der Kreisel aktiviert wird, verschiebt er die Kamera in eine neue Position (wahrscheinlich die aktuelle Gyro-Rotation des Geräts), anstatt sie dort zu belassen und von diesem Punkt aus zu gyrogen.Wie Gyroskop Kamera bei aktuellen Geräten Orientierung

Ich hoffe, ich mache Sinn, aber im Grunde möchte ich nicht, dass der Benutzer eine Änderung in dem, was sie im Spiel sehen bemerken (dh. Kamera durch Gyro gesteuert, aber nicht, dass Benutzer diese Änderung bemerken würde). Hier ist der Code Ich verwende:

void Update() 
{ 
    Quaternion attitudeFix = new Quaternion (-gyro.attitude.x, -gyro.attitude.z, -gyro.attitude.y, gyro.attitude.w); 
    Quaternion offsetRotation = initialGyroRotation * attitudeFix; 
    rotation = initialRotation * offsetRotation; 
    transform.rotation = rotation; 
} 

public void EnableGyro() 
{ 
    initialGyroRotation = Input.gyro.attitude; 
    initialRotation = transform.rotation; 

    Debug.Log("initialRotation: " + initialRotation.ToString()); 
    Debug.Log("transform.rotation: " + transform.rotation.ToString()); 
    Debug.Log("initialGyroRotation: " + initialGyroRotation.ToString()); 
} 

**

EDIT: Hier ist ein Bildschirm genau, wie ich die Ansicht aussehen soll, wenn der Benutzer sein Gerät hält vor ihrem Gesicht (Porträt) UND in Richtung Norden. Unabhängig davon, wie das Gerät beim Start der App ausgerichtet ist, sollte es aussehen, wenn es mit dem Telefon im Hochformat nach Norden fährt (wiederum, wenn der Benutzer durch das Telefon schaut).

enter image description here

EDIT 2: Tests wurden immer verwirrend, so habe ich den Code wieder zu genau, wie Sie Ihre Lösung vorschlägt. Es gibt immer noch ein kleines Problem, aber es scheint so, als ob dieses Skript sehr nahe ist. Das Hauptproblem ist, dass der Bildschirm nicht wie das obige Bild aussieht, wenn ich jeden Test starte und die App mit dem Gerät in seltsamen Winkeln starte. Es sollte eigentlich egal sein, welchen Winkel das Gerät hat, wenn die App gestartet wird, es muss wie der obige Bildschirm aussehen, wenn man nach Norden und in das Portrait zeigt.

Ich muss mehr Tests durchführen, und tun dies mit einem neuen/clean-Projekt.

Antwort

1

Sie müssen die Offset-Kameraposition in der Awake oder Start Funktion zu erhalten. In der Update Funktion wenden Sie diesen Offset-Wert auf den Wert vom Gyrosensor an.

Es sieht aus wie Sie bereits wissen, Offset verwendet werden sollte, aber Sie sind nicht, dass die richtige Art und Weise zu tun. Der verwirrende Teil ist das Erhalten des Versatzes, der das Subtrahieren der gegenwärtigen Kameradrehung von dem Gyrosensorwert erfordert.

Um ein Quaternion multiplizieren Sie die Inverse nicht nur die Quaternion zu subtrahieren:

Quaternion = Quaternion *Quaternion.Inverse

ein Quaternion Hinzufügen multiplizieren die Quaternion:

Quaternion = Quaternion * Quaternion. 

Dies ist, was Ihr Code sollte aussehen wie:

Quaternion offset; 

void Awake() 
{ 
    Input.gyro.enabled = true; 
} 

void Start() 
{ 
    //Subtract Quaternion 
    offset = transform.rotation * Quaternion.Inverse(GyroToUnity(Input.gyro.attitude)); 
} 

void Update() 
{ 
    GyroModifyCamera(); 
} 

void GyroModifyCamera() 
{ 
    //Apply offset 
    transform.rotation = offset * GyroToUnity(Input.gyro.attitude); 
} 

private static Quaternion GyroToUnity(Quaternion q) 
{ 
    return new Quaternion(q.x, q.y, -q.z, -q.w); 
} 
+0

Vielen Dank für Ihre Hilfe, Ihr Code hat genau das getan, was er tun sollte. Jetzt, wo ich diese Arbeit habe, hat es natürlich andere Probleme aufgedeckt, die ich mit meiner Implementierung von Gyro auf der Kamera und Kompass auf einem separaten Spielobjekt habe. Ich möchte Ihre Gedanken wissen, ob Sie denken, dass es eine Kamera-Setup möglich ist, die Gyro tut auf 2 Achsen (X/Z) und Kompass auf einem anderen Spiel-Objekt, das die restlichen 1 Achse (Y) der Fall ist. Soll ich eine andere Frage starten? – Valerie

+0

Dies ist ein ganz anderes Thema und eine Frage. Sie können eine neue Frage dazu erstellen.Stellen Sie sicher, klar zu sein, was Sie fragen und bieten Sie an, was Sie versucht haben. – Programmer

+0

Danke Programmierer, hier ist meine neue Frage: https://stackoverflow.com/questions/46943868/gyroscope-with-compass-help-needed – Valerie

Verwandte Themen