Проблема с вращением объекта лицом к другому.[C ++] - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу повернуть объект лицевой стороной к центру другого, но у меня есть некоторые проблемы с ним: когда я пытаюсь повернуть объект к другому, и он лежит на оси X, он работает правильно [сначаладва скриншота], но когда я пытаюсь повернуть его, как на скриншоте, все ломается [два вторых скриншота].

Before1 After1

Before1:
1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

After1:
0 0 -1 0 
-0 -1 0 0 
1 0 0 0 
0 0 0 1 

Before2 After2

Before2:
0 0 -1 0 
-0 -1 0 0 
1 0 0 0 
0 0 0 1 

After2:
0 0 -0.707107 0 
0.5 -0.5 0 0 
0.707107 -0.707107 0 0 
0 0 0 1 

Вот мой код:

void ConcreteObject::faceObjectTo(ConcreteObject otherObject) {
    Vector<double> temp = {0, 1, 0};

    Vector<double> forward = otherObject.getCenter() - this->getCenter();
    forward.normalize();

    Vector<double> right = temp.cross(forward);
    right.normalize();

    Vector<double> up = forward.cross(right);

    Matrix<double> newMatrix = this->getTransformMatrix().getCurrentState();

    newMatrix(0, 0) = right[0];
    newMatrix(0, 1) = right[1];
    newMatrix(0, 2) = right[2];

    newMatrix(1, 0) = up[0];
    newMatrix(1, 1) = up[1];
    newMatrix(1, 2) = up[2];

    newMatrix(2, 0) = forward[0];
    newMatrix(2, 1) = forward[1];
    newMatrix(2, 2) = forward[2];

    TransformMatrix newObjectMatrix(newMatrix);

    this->setTransformMatrix(newObjectMatrix);
}

1 Ответ

0 голосов
/ 21 февраля 2019

Вам нужно нормализовать вправо, нет причин для того, чтобы темп и прямая были ортогональными, поэтому даже если они являются единичными векторами, их кросс-продукт не должен быть.

...