Система координат сцены 3d.io
В настоящий момент я пишу код, который определяет координаты предметов мебели в трехмерной сцене.
Из того, что я собираю, каждый предмет мебели имеет свои собственные координаты, которые основаны на родительском предмете мебели. Будь родитель уровня или группы и т. Д...
Если родитель оказывается "уровнем", то координаты предметов мебели напрямую влекут за собой то, где предмет мебели находится в трехмерной сцене.
Однако, если у предмета мебели есть неуровневый родительский элемент, координаты предмета мебели основываются на родительском (ых) элементе (ах).
По сути, в своем коде я пишу рекурсивную функцию, которая принимает мебельный узел и получает его координаты.
Поскольку рекурсивная функция повторяется, она поднимается по уровням родителей и увеличивает исходные координаты в соответствии с координатами узла, который в данный момент находится в функции.
Если класс узла, который в данный момент находится в функции, относится к классу "io3d-level", рекурсивная функция остановится и вернет увеличенные координаты. Это связано с тем, что узел с классом "io3d-level" должен иметь объект координат {0, 0, 0}.
Опять же, рекурсивная функция будет повторяться с уровня мебельного узла и подниматься по структуре родителей, собирая и добавляя их координаты к исходным координатам мебельного узла, пока текущий класс узла внутри функции не станет уровнем, на котором point функция останавливается и возвращает координаты.
Эта рекурсивная функция, по-видимому, дает первичные результаты почти во всех случаях.
Однако эта функция не возвращает изначально точные координаты для меньшего количества узлов мебели, отправленных через нее.
Предположение, лежащее в основе этой рекурсивной функции, состоит в том, что истинные координаты узлов мебели относительно уровня могут быть получены путем захвата координат всех родителей узлов мебели и их суммирования. Очевидно, что с учетом того, что координаты x суммируются с координатами x, а координаты z суммируются с координатами z.
Это предположение неверно?
Возможно, я неправильно истолковываю систему координат, которая противоречит сценам 3d.io?
2 ответа
Это можно сделать напрямую, без неточностей, используя дескриптор three.js.
let worldCoordinates = obj.data3dView.threeParent.getWorldPosition();
Я полагаю, что-то идет не так в вашем коде
Так что лучше всего поделиться своим кодом, чтобы нам не приходилось догадываться.
Вот небольшой фрагмент, который применяет родительское местоположение для элемента при работе со структурой сцены.
// apply parent location
function applyLocation(element, parent) {
// Rotate element on the XZ plane around parent's center
var angleY = -parent.ry * Math.PI / 180
var rotatedX = element.x * Math.cos(angleY) - element.z * Math.sin(angleY)
var rotatedZ = element.z * Math.cos(angleY) + element.x * Math.sin(angleY)
// Get parent space coordinates for our element
element.x = parent.x + rotatedX
element.y += parent.y
element.z = parent.z + rotatedZ
element.ry += parent.ry
return element
}