@fridriekh
Фулл-тайм эникей

Как повернуть камеру против часовой стрелки с использованием кватернионов и углов Эйлера?

На кнопки Q и E назначен поворот камеры на 90 и -90 градусов

Камера на сцене состоит из холдера и камеры внутри него; жестко привязана к персонажу, следует за его движением (как в diablo, titan quest, grim dawn, etc) и вращается вокруг него.

Поворот по часовой (+90 градусов) работает корректно и поворачивается плавно, но когда я делаю поворот против часовой стрелки (-90 градусов): камера начинает дрыгаться, либо поворачивается слишком резко.

void Turning(){
		Quaternion quatertion = transform.rotation;
		Vector3 eulerAngle = new Vector3(0, quatertion.eulerAngles.y, 0);
		
		if(rotationAngle - eulerAngle.y < 0.2f){
			if(rotationAngle == 360){
                rotationAngle = 0;
			}
            eulerAngle.y = rotationAngle;
            isTurning = false;
		} else {
			eulerAngle.y = Mathf.Lerp(eulerAngle.y, rotationAngle, rotationStep * Time.deltaTime);
		}
		m_Compas.rotation = eulerAngle.y;
        quatertion.eulerAngles = eulerAngle;
		parentTran.rotation = quatertion;
	}


Как доработать этот код?

Upd.1:
Хтоническая громадина, которая не работает
void Rotator(float val) {
        rotationAngle += val;
        Quaternion quatertion = transform.rotation;
        Vector3 eulerAngle = new Vector3(0, quatertion.eulerAngles.y, 0);
        if (rotationAngle > 0) {
            if (rotationAngle - eulerAngle.y < 0.2f) {
                if (rotationAngle == 360 || rotationAngle == -360) {
                    rotationAngle = 0;
                }
                eulerAngle.y = rotationAngle;
                isTurning = false;
            } else {
                eulerAngle.y = Mathf.Lerp(eulerAngle.y, rotationAngle, rotationStep * Time.deltaTime);
            }
        }
        else if (rotationAngle < 0) {
            rotationAngle = 360 + rotationAngle;
            if (rotationAngle - eulerAngle.y < 0.2f) {
                if (rotationAngle == 360 || rotationAngle == -360) {
                    rotationAngle = 0;
                }
                eulerAngle.y = rotationAngle;
                isTurning = false;
            } else {
                eulerAngle.y = Mathf.Lerp(Mathf.Abs(rotationAngle), eulerAngle.y, -rotationStep * Time.deltaTime);
            }
        }
        m_Compas.rotation = eulerAngle.y;
        quatertion.eulerAngles = eulerAngle;
        parentTran.rotation = quatertion;
    }


Текущее решение:
void Camera_Rotation() {
        if (rotationAngle > 0) {
            transform.RotateAround(targetGO.transform.position, Vector3.up, -rotationAmount);
            rotationAngle -= rotationAmount;
        }
        if (rotationAngle < 0) {
            transform.RotateAround(targetGO.transform.position, Vector3.up, rotationAmount);
            rotationAngle += rotationAmount;
        }
    }
  • Вопрос задан
  • 971 просмотр
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity
VR for all
Quaternion neededRotation = transform.rotation;
neededRotation *= Quaternion.Euler(0, 90, 0); // this add a 90 degrees Y rotation

transform.rotation = Quaternion.Slerp(transform.rotation, neededRotation , Time.deltaTime * damping);

Очень по быстрому писал, поэтому просто общий смысл:
Запомнить текущий поворот.
Прибавить к нему нужный.
И постепенно как хочешь от текущего к нужному, хоть сразу, хоть через Lerp вращай.

Надеюсь поможет)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы