Файл GLTF плохо позиционируется Цезием

Я хочу отобразить ураган (большой объект изоповерхности) в Цезии. Для этого я преобразовал файл OBJ со столбцами долготы, широты и высоты для каждой вершины изоповерхности, представляющей ураган, в новый файл OBJ, воспроизведенный в проекции ECEF (по центру Земли).

Итак, окончательный файл OBJ содержит теперь X, Y, Z для каждой вершины вместо долготы, широты, высоты. После окончательного переформатирования с помощью obj2gltf я пытаюсь отобразить файл GLTF "ураган" в Cesium.JS, используя следующий код:

console.log('loading hurricane.gltf';
var mymodel = viewer.scene.primitives.add(Cesium.Model.fromGltf({
                         url : 'data/hurricane.gltf',
                         modelMatrix : Cesium.Matrix4.IDENTITY,
                         asynchronous: false
                   }));

Я вижу свой ураган на земле, но не с хорошей позиции. Подозреваю проблема матрицы. Матрица IDENTITY кажется не очень удачной. Я мог бы попробовать создать новую матрицу, но я не могу найти достаточно информации об ориентации осей, используемой Цезием.
Я проверил координаты X, Y, Z ECEF, они хороши. Кто-нибудь уже сталкивался с этой проблемой?


person Dominique    schedule 13.09.2019    source источник


Ответы (1)


Если источник вашей модели glTF находится в центре урагана, вы можете разместить ее с помощью объекта Cesium Entity, примерно так:

// Longitude degrees, Latitude degrees, height in meters
var position = Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, height);
var heading = Cesium.Math.toRadians(0);
var pitch = 0;
var roll = 0;
var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpr);

var entity = viewer.entities.add({
    name : 'Hurricane',
    position : position,
    orientation : orientation,
    model : {
        uri : 'data/hurricane.gltf'
    }
});
viewer.trackedEntity = entity;

Более полные рабочие демонстрации этого есть на Sandcastle.

Но если ваш ураган виден на поверхности Земли с использованием матрицы идентичности, это, вероятно, означает, что источник этой модели находится далеко от центра урагана. Вам может потребоваться отредактировать файл glTF, чтобы убедиться, что модель центрирована на ее собственном источнике и не имеет фиксированного местоположения Земли, предварительно запеченного во внутренние преобразования модели.

person emackey    schedule 13.09.2019
comment
Большое спасибо, но исходной точкой модели должен быть центр Земли, потому что ее координаты - ECEF. Я вижу модель (ураган) на поверхности земли, но она плохо расположена. Вот почему я полагаю, что это матричная проблема. - person Dominique; 14.09.2019
comment
Нет, модели glTF, как и вся графика GPU, используют 32-битные числа с плавающей запятой для позиций вершин. Если исходить из центра Земли, то точность измерения отдельных вершин на поверхности составляет всего 1 метр. Форма урагана будет колебаться, когда камера приблизится достаточно близко, чтобы увидеть отдельные метры, потому что источник находится на расстоянии 6,3 миллиона метров. Чтобы правильно отобразить, вам нужна точка начала рядом с ураганом. - person emackey; 15.09.2019
comment
Цезий использует 64-битную математику для связи камеры с источником модели. Но отдельные вершины используют только 32-битное для описания отношения от начала до любой конкретной точки. Таким образом, источником любой модели в идеале должен быть центр модели или какое-то место внутри модели. - person emackey; 15.09.2019
comment
Еще раз спасибо EmacKey. Я отказался от проекции ECEF и, наконец, использовал проекцию EastNorthUp с центром в центре урагана. Теперь положение объекта в порядке. Спасибо !!! - person Dominique; 16.09.2019