Я пытаюсь реализовать преобразования 3D-деталей в относительных и абсолютных системах координат. Я смог сделать это для относительного движения — движения деталей в локальных системах координат, но не смог правильно реализовать в абсолютных (глобальные/модельные системы координат).
Используемая терминология - 1. 3D-детали - Любая геометрия (комбинация геометрий), нарисованная в 3-х измерениях. Я использую детали, созданные в CATIA. 2. Локальные (относительные) системы координат - Система координат детали. 3. Глобальные (абсолютные) системы координат - Система координат родителя детали. 4. Сборка - детали соединяются друг с другом по типу парет-дочерний. типичная древовидная структура. Эти определения соответствуют моему использованию и пониманию. https://www.opengl.org/discussion_boards/showthread.php/127422-Local-and-global-coordinate-system
Мои входы -
Матрица. У меня есть матрица 4X4, определенная для каждой детали в сборке. Это определяет матрицу преобразования с примененными к ней компонентами вращения, перемещения и масштабирования. Матрица преобразования Его матрица-столбец с переменной в позициях 1-10 для поворота, 12,13 ,14 (справа внизу) предназначены для перевода.
Движения - я получаю движение детали как вектор значений 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.
Мне нужна помощь, чтобы понять, правильно ли я выполняю шаги в своем алгоритме. Я постарался предоставить как можно больше информации. дайте мне знать, если пост стал трудным для понимания. Дайте мне знать ваши взгляды.