Jump to content
Unity Insider Forum

Kamera Winkel (Rotation) Berechnen


StolleJay

Recommended Posts

Hallöchen,

ich Melde mich heute mal wieder mit einem kleinen Problemchen an dem ich schon seit 1-2 Tagen hänge und nicht weiter komme.
Ich habe ein Script für meine Kamera mit dem ich das Übergeordnete Objekt (Mein Camera Controller) um jeweils 45 Grad drehen kann. Zusätzlich kann man die Kamera aber auch wenn gewünscht ohne diese 45 Grad Frei Rotieren. Mein Problem dabei ist jetzt jedoch das wenn ich die Kamera Frei Drehe und und bei einem Winkel von zb. 51 lasse wie bekomme ich es hin das wenn ich die Kamera wieder um normale 45 Grad drehen will er erst mal von den 51 auf 90 Grad hoch geht bzw. auf 45 runter bevor diese wieder um ganze 45 Grad Rotiert?

using UnityEngine;

public class CameraController : MonoBehaviour {

    public Camera camera;
    public Transform controller;
    public float moveSpeed = 4;
    public float rotateSpeed = 20;

    public bool leftMove = false;
    public bool rightMove = false;
    public bool upMove = false;
    public bool downMove = false;
    public float zoomMin = 0.75f;
    public float zoomMax = 3;
    public float zoomSpeed = 0.25f;

    // Update is called once per frame
    void Update () {
        // Movement
        moveLeftRight();
        moveUpDown();

        // Rotation
        rotateLeftRight();

        // Zoom
        zoomInOut();
    }

    void moveLeftRight()
    {
        //MoveLR...
    }
    void moveUpDown()
    {
        //MoveUD...
    }
    void rotateLeftRight()
    {
        if (Input.GetKey(KeyCode.E) && Input.GetKey(KeyCode.LeftAlt))
        {
            controller.transform.Rotate(0, -rotateSpeed * Time.deltaTime, 0);
        } else if (Input.GetKeyDown(KeyCode.E))
        {
            controller.transform.Rotate(0, -45, 0);
        }
        if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.LeftAlt))
        {
            controller.transform.Rotate(0, +rotateSpeed * Time.deltaTime, 0);
        } else if (Input.GetKeyDown(KeyCode.Q))
        {
            controller.transform.Rotate(0, +45, 0);
        }
    }
    void zoomInOut()
    {
        //Zoom...
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Verstehe das Script nicht ganz.

- Warum controller.transform.Rotate? controller ist doch bereits als Transform deklariert, müsste es nicht controller.Rotate() heissen?

- Wo drehst du den die Kamera selbst? Wenn ich das richtig verstanden habe ist sie ein child Object vom Controller? aber ich sehe nur dass du den controller drehst?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Script ist noch nicht richtig Optimiert deshalb habe ich noch das .transform. drin ;)
Ja die Camera ist ein Child vom Controller. Die Camera selber drehe ich nicht sondern den Controller. Dadurch wird die Camera ja mit gedreht.
Der Controller ist auch eine Art PoV (Point of View).

Das mit den jeweils 45° klappt ja einwandfrei nur das von "Frei" Drehen zurück zu den jeweils 45° Schritten bekomme ich nicht hin.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aso, ich dachte du willst das parent und child objekt separat drehen, und ich dachte mir noch warum sollte man sowas wollen 🙃

Jetzt noch eine Frage zur funktion, soll die Kamera direkt nach dem loslassen von Alt+E / Alt+Q, also nach dem frei drehen, direkt auf den nächsten 45Grad Schritt gehen oder erst wenn man eine Taste Q oder E drückt?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh, Rotation, meine Achillesferse. Rotation geht von  0 bis 180 und von 0 bis -180, euler angels sind wiederum von 0 bis 360, da bekomme ich immer die Kriese.
Also die 0 360 Grad übergänge müsste man nochmals bearbeiten, aber ev. hilft es dir ja soweit?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class rotateTest : MonoBehaviour
{
    public Transform controller;
    public float moveSpeed = 4;
    public float rotateSpeed = 20;



    public bool leftMove = false;
    public bool rightMove = false;
    public bool upMove = false;
    public bool downMove = false;
    public float zoomMin = 0.75f;
    public float zoomMax = 3;
    public float zoomSpeed = 0.25f;

    private Vector3 newPosition;
    public int rotationY;
    public float _rotationY;
    public float testeulerangle;

    // Update is called once per frame
    void Update()
    {
        // Movement
        moveLeftRight();
        moveUpDown();

        // Rotation
        rotateLeftRight();


    }

    void moveLeftRight()
    {
        //MoveLR...
    }
    void moveUpDown()
    {
        //MoveUD...
    }
    void rotateLeftRight()
    {
        if (Input.GetKey(KeyCode.E) && Input.GetKey(KeyCode.LeftAlt))
        {
            //controller.transform.Rotate(0, -rotateSpeed * Time.deltaTime, 0);

            _rotationY -= 1;
        }
        else if (Input.GetKeyDown(KeyCode.E))
        {
            if(_rotationY != 0)
            {
                _rotationY = 0;
            }
            //controller.transform.Rotate(0, -45, 0);
            if(rotationY >=1 )
            {
                rotationY -= 45;
            }
            else
            {
                rotationY =45;
            }

        }
        if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.LeftAlt))
        {
            //controller.transform.Rotate(0, +rotateSpeed * Time.deltaTime, 0);
            _rotationY += 1;
        }
        else if (Input.GetKeyDown(KeyCode.Q))
        {
            if (_rotationY != 0)
            {
                _rotationY = 0;
            }
            //if(controller.eulerAngles.y != )
            //controller.transform.Rotate(0, +45, 0);
            if (rotationY <= 359)
            {
                rotationY += 45;
            }
            else
            {
                rotationY =360;
            }

        }

        float yRoation = Mathf.Lerp(controller.eulerAngles.y, rotationY+_rotationY, rotateSpeed * Time.deltaTime);// lerp smooth out between two values
        controller.eulerAngles = new Vector3(0, yRoation, 0);


        testeulerangle = controller.eulerAngles.y;
    }
}

Ist noch nicht ganz schick und zu Ende gedacht, aber ich hab irgendwie gad ne blockade 🙃

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also das hier funktioniert wesentlich besser, fehlt nur noch ein smoother Übergang beim drücken von Q oder E

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class rotateTest : MonoBehaviour
{
    public Transform controller;
    public float moveSpeed = 4;
    public float rotateSpeed = 20;



    public bool leftMove = false;
    public bool rightMove = false;
    public bool upMove = false;
    public bool downMove = false;
    public float zoomMin = 0.75f;
    public float zoomMax = 3;
    public float zoomSpeed = 0.25f;

    public int rotationY;
    public float _rotationY;




    // Update is called once per frame
    void Update()
    {
        // Movement
        moveLeftRight();
        moveUpDown();

        // Rotation
        rotateLeftRight();

    }

    void moveLeftRight()
    {
        //MoveLR...
    }
    void moveUpDown()
    {
        //MoveUD...
    }
    void rotateLeftRight()
    {
        if (Input.GetKey(KeyCode.E) && Input.GetKey(KeyCode.LeftAlt))
        {
            //controller.transform.Rotate(0, -rotateSpeed * Time.deltaTime, 0);

            _rotationY -= rotateSpeed*Time.deltaTime;
        }
        else if (Input.GetKeyDown(KeyCode.E))
        {
            if(_rotationY != 0)
            {
                _rotationY = 0;
            }
                rotationY -=45;


        }
        if (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.LeftAlt))
        {
 
            _rotationY += rotateSpeed*Time.deltaTime;
        }
        else if (Input.GetKeyDown(KeyCode.Q))
        {
            if (_rotationY != 0)
            {
                _rotationY = 0;
            }

                rotationY += 45;
        }

       
        controller.eulerAngles = new Vector3 (0, rotationY+_rotationY,0);
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...