Argon.js: ошибка: состояние кадра еще не получено

Я пытаюсь использовать серверную часть argon.js, чтобы я мог преобразовать координаты lla в предопределенную систему отсчета. Разумеется, я не отрисовываю графику, я просто использую ее для преобразования значений. См. Вопрос SO Использование Geo-координаты вместо Cartesian для рисования в аргоне и A-Frame для деталей.

В соответствии с этим потоком я пытаюсь создать цезиевый объект для фиксированной координаты, который позже я буду использовать для создания других объектов, относящихся к нему. Когда я это делаю, все работает, пока я не доберусь до последней строки программы var gtrefEntityPose = app.context.getEntityPose(gtrefEntity); где я получаю Error: A frame state has not yet been received,

Сначала я подумал, что это может быть связано с установкой эталонной сущности по умолчанию app.context.setDefaultReferenceFrame(app.context.localOriginEastUpSouth); так как у меня еще не было локального пользователя из-за того, что он был на стороне сервера. Я посмотрел документацию для setDefaultReferenceFrame, а также возможность того, что мне может понадобиться использовать convertEntityReferenceFrame, а также исходный код для каждого, но я не могу понять это, учитывая мои знания о программе.

Я поместил ошибку, а также код моего приложения ниже.

Спасибо за вашу помощь!

/home/path/to/folder/node_modules/@argonjs/argon/dist/argon.js:4323
    if (!cesium_imports_1.defined(this.serializedFrameState)) throw new Error(
                                                                ^
Error: A frame state has not yet been received
at ContextService.Object.defineProperty.get [as frame] (/home/path/to/folder/node_modules/@argonjs/argon/dist/argon.js:4323:89)
at ContextService.getTime (/home/path/to/folder/node_modules/@argonjs/argon/dist/argon.js:4343:32)
at ContextService.getEntityPose (/home/path/to/folder/node_modules/@argonjs/argon/dist/argon.js:4381:37)
at Object.<anonymous> (/home/path/to/folder/test.js:27:35)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
at startup (node.js:129:16)

Вот мой код:

var Argon = require('@argonjs/argon');

var Cesium = Argon.Cesium;


var Cartesian3 = Cesium.Cartesian3;
var ConstantPositionProperty = Cesium.ConstantPositionProperty;
var ReferenceFrame = Cesium.ReferenceFrame;
var ReferenceEntity = Cesium.ReferenceEntity;
//var degToRad = THREE.Math.degToRad;

const app = Argon.init();
app.context.setDefaultReferenceFrame(app.context.localOriginEastUpSouth);

var data = { lla : { x : -84.398881, y : 33.778463, z : 276 }};

var gtref = Cartesian3.fromDegrees(data.lla.x, data.lla.y, data.lla.z);
var options = { position: new ConstantPositionProperty(gtref, ReferenceFrame.FIXED),
            orientation:  Cesium.Quaternion.IDENTITY
          };

var gtrefEntity = new Cesium.Entity(options);
var gtrefEntityPose = app.context.getEntityPose(gtrefEntity);

1 ответ

Решение

В настоящее время argon.js не будет работать на стороне сервера. В частности, локальный координатный фрейм не устанавливается до тех пор, пока argon.js не получит геопространственную позицию и ориентацию для "пользователя", что получается либо из Argon4 (если вы работаете в веб-браузере Argon4), либо из комбинации API веб-геолокации и ориентации устройства (если вы работаете в другом браузере).

При полной позе 6D (3D-позиция + 3D-ориентация) система не знает положение и направление просмотра пользователя и не может установить локальную евклидову систему координат. таким образом app.context.localOriginEastUpSouth остается неопределенным (сущность цезия существует, но ее положение и ориентация не установлены), и app.context.getEntityPose(gtrefEntity) не удастся.

Чтобы использовать argon.js на стороне сервера, вам нужно изменить его, чтобы позволить программе вручную устанавливать положение и ориентацию зрителя. Я мог бы представить себе это и даже использовать его в системе, в которой мобильный клиент периодически отправляет позу обратно на сервер (например, через socket.io). В ситуациях, когда вас не волнует направление просмотра (например, если вы просто беспокоитесь о положении пользователя), вы можете просто установить ориентацию на идентичность и игнорировать ориентацию в возвращенной позе.

Другие вопросы по тегам