Как рассчитать новое положение камеры и поворот в трехмерном пространстве, чтобы получить точно такой же вид трехмерного объекта после его перемещения? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть 3D-объект (Obj) и камера (Cam), указывающая на объект. FOV камеры, разрешение, положение и поворот задаются вместе с положением и поворотом объекта. Затем мы меняем положение и поворот Obj на некоторые случайные числа (известные). То, что мне нужно, это получить точно такой же вид на Obj, как и в исходном положении, только изменяя положение и вращение Cam. Как рассчитать положение и поворот новой камеры?

1 Ответ

1 голос
/ 12 февраля 2020

(1) if Obj moves

Создать атрибут Vector3 deltaPosition в коде Cam. Инициализируйте его, оценив расстояние между Cam и Obj.

void Start(){
    deltaPosition = transform.position - Obj.transform.position;
}

В Update() убедитесь, что Cam находится на том же расстоянии от Obj, где оно находится:

void Update(){
    transform.position + deltaPosition;
}

(2) if Obj rotates

Предположим, что Obj находился под углами Эйлера (x0, y0, z0) и повернулся к углам Эйлера (x1, y1, z1). Все, что вам нужно сделать, это повернуть deltaPosition (x1 - x0, y1 - y0, z1 - z0) градусов вокруг положения Obj. Для этого вы также должны сохранить начальное вращение Obj в другом атрибуте Vector3 objRotation:

void Start(){
    deltaPosition = transform.position - Obj.transform.position;
    objRotation = Obj.transform.eulerAngles;
}

и убедиться, что он корректно корректируется каждый кадр:

void Update(){
    deltaPosition = RotatePointAroundPivot(
        deltaPosition, 
        Obj.transform.position,
        Obj.transform.eulerAngles - objRotation
    );
    transform.position + deltaPosition;
    objRotation = Obj.transform.eulerAngles;
}

public Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles) {
    return Quaternion.Euler(angles) * (point - pivot) + pivot;
}

Это должно сделать трюк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...