абсолютное перемещение 3D-детали с использованием матрицы

Я пытаюсь реализовать преобразования 3D-деталей в относительных и абсолютных системах координат. Я смог сделать это для относительного движения — движения деталей в локальных системах координат, но не смог правильно реализовать в абсолютных (глобальные/модельные системы координат).

Используемая терминология - 1. 3D-детали - Любая геометрия (комбинация геометрий), нарисованная в 3-х измерениях. Я использую детали, созданные в CATIA. 2. Локальные (относительные) системы координат - Система координат детали. 3. Глобальные (абсолютные) системы координат - Система координат родителя детали. 4. Сборка - детали соединяются друг с другом по типу парет-дочерний. типичная древовидная структура. Эти определения соответствуют моему использованию и пониманию. https://www.opengl.org/discussion_boards/showthread.php/127422-Local-and-global-coordinate-system

Мои входы -

  1. Матрица. У меня есть матрица 4X4, определенная для каждой детали в сборке. Это определяет матрицу преобразования с примененными к ней компонентами вращения, перемещения и масштабирования. Матрица преобразования Его матрица-столбец с переменной в позициях 1-10 для поворота, 12,13 ,14 (справа внизу) предназначены для перевода.

  2. Движения - я получаю движение детали как вектор значений x, y, z в абсолютных или относительных единицах. Или изменение вращения вокруг оси X, Y или Z в градусах.

Что я пробовал -

Я выполняю следующие шаги, чтобы преобразовать ввод для применения к матрице. Я должен всегда преобразовывать абсолютное изменение в относительное изменение, поскольку я могу только изменить матрицу листового узла (который всегда будет в локальной системе координат). вот пошаговые операции, которые я использую - Шаги для новой матрицы

Шаг 1- Участие в LCS. WCS - мировая система координат; LCS - Локальная система координат Шаг 2 - Отменить вращение в LCS. поддержите вращение. Шаг 3 - переместите деталь в WCS. Шаг 4 - Переместите деталь с желаемой дельтой в WCS. Шаг 5. Переместите деталь обратно в LCS. Шаг 6. Поверните заднюю часть снова с вращением, сохраненным на шаге 1.

Фиктивный код, как показано ниже, написан на машинописном языке, но мне подходит любой другой язык. Меня больше интересуют матричные вычисления.

//// STEP 1//////

    let absVals = Matrix 4;

    /*This is accumulation of all matrices from child to parent. I take all the matrices starting from Child to the root parent and append with matrix multiplication.*/
    let localVals = Matrix4 on the child node. In our case the the box shown in image;
    let localRotation: .Matrix4 = new Matrix4(localVals);
    localRotation.setTranslation(0, 0, 0); // only local rotation matrix

    //// STEP 2//////

    let localTranslation = localVals.multiplyMatrix(localRotation.inverse()); // only local translation. Step 2 achived.

    //// STEP 3//////

    let localInGlobalSpace = localTranslation.multiplyMatrix(res); // move the part in WCS. Step 3 achieved.

    let xDelta = this.xMovement;
    let yDelta = this.yMovement;
    let zDelta = this.zMovement;
    let newPos = new Matrix4();
    newPos.setTranslation(new .Vector3(xDelta, yDelta, zDelta));
    // Similarly rotations should be handled but can skipped for first step

    //// STEP 4//////

    let movedLocalInGlobalSpace = localInGlobalSpace.multiplyMatrix(newPos); // Step 4 achived.

    //// STEP 5//////

    let localBackInLocalSpace = movedLocalInGlobalSpace.multiplyMatrix(absVals.inverse()); // Step 5 achived.

    //// STEP 6//////

    let localBackInLocalSpaceWithRotation = localBackInLocalSpace.multiplyMatrix(localRotation); // Step 6 achived.

Мне нужна помощь, чтобы понять, правильно ли я выполняю шаги в своем алгоритме. Я постарался предоставить как можно больше информации. дайте мне знать, если пост стал трудным для понимания. Дайте мне знать ваши взгляды.


person Sumit Kulkarni    schedule 09.07.2018    source источник
comment
Что заставляет вас думать, что ваш алгоритм неверен? Вы видите ошибку при запуске кода?   -  person Richie Thomas    schedule 09.07.2018
comment
Результат движения не правильный. Я перепроверяю это с другим приложением, которое имеет аналогичную функцию. Я уверен, что вывод матрицы после моего алгоритма не дает мне правильных чисел. Но я не могу понять ошибки, которые я делаю в своих вычислениях.   -  person Sumit Kulkarni    schedule 10.07.2018
comment
Чтобы уточнить, какие результаты вы увидели? И каких результатов вы ожидали?   -  person Richie Thomas    schedule 10.07.2018


Ответы (1)


Я думаю, что ваш вопрос больше о математическом преобразовании, чем о коде:

Каждое преобразование можно разделить на одно простое перемещение и три вращения (вдоль каждой оси). Мы пока будем рассматривать только 1 перевод и 1 вращение.

Когда вы применяете свое вращение, вы должны быть уверены, что центр вращения является исходной точкой, то есть 0,0,0.

Пример: если у нас есть фигура, определяемая четырьмя точками P1, P2, P3, P4, и мы хотим применить вращение (матрица M) вокруг точки P1 и перемещение (вектор V).

  1. Вы должны перевести каждую точку, чтобы точка P1 стала точкой отсчета.
  2. Применить матрицу М «слева»
  3. Переведите точки так, чтобы P1 переместился на прежнее место.
  4. Применить вектор перевода

Formula1

Конечно, если центром вашего вращения является что-то другое, например ПК, это будет:

Formula1

Если вы хотите отменить предыдущее вращение (матрица M1) и применить новое вращение (матрица M2), просто учтите следующее:

Формула2

Что касается вашего кода:

Будь осторожен. В большинстве языков/библиотек:

C = A.mulityplymatrix(B)

Означает

Формула2

Что может отличаться от:

Формула3

Применение сначала перевода, а затем поворота даст вам нечто совершенно отличное от поворота, а затем перевода.

person P.Manthe    schedule 11.07.2018