Как мне экспортировать gltf, который работает с программой просмотра сцен Andorid?

Я пытаюсь использовать three.js для преобразования существующих stls в gltf для использования с программой просмотра сцен Android (компонент просмотра моделей). Однако экспортируемый мной gltf не работает с https://arvr.google.com/scene-viewer-preview с сообщением об ошибке «glTF содержит цвет вершины, который не поддерживается спецификацией Scene Viewer». Он также не работает, когда я загружаю на телефон Android с помощью компонента просмотра моделей, когда я нажимаю кнопку AR.

Если я экспортирую простой куб BoxBufferGeometry как gltf, он работает в программе просмотра сцен. Однако, если я экспортирую BoxGeometry (не Buffered), который также дает ошибку цвета вершины.

Как мне сказать three.js не включать цвета вершин в экспортированный gltf?

Я использую следующий код - функция exportGLTF скопирована из примеров three.js. Файл stl - это всего лишь что-то простое, что я создал из fusion 360.

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );

var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );


var loader = new THREE.STLLoader();
loader.load( 'table.stl', function ( geometry ) {
    var material = new THREE.MeshStandardMaterial();
    mesh = new THREE.Mesh( geometry, material );
    scene.add( mesh );
    exportGLTF(mesh);
}, undefined, function ( error ) {

    console.error( error );

} );

var geometry = new THREE.BoxBufferGeometry( 1, 1, 1 );
var material = new THREE.MeshStandardMaterial();
cube = new THREE.Mesh( geometry, material );
cube.position.set( 0, 0, 0 );
cube.name = "Cube";
scene.add( cube );
exportGLTF(cube);

person wr0ngway    schedule 23.12.2019    source источник
comment
Если я не ошибаюсь, three.js не поможет вам преобразовать сетку с цветными вершинами в текстурированную сетку, поскольку это включает в себя этап развертывания UV, который обычно выполняется в чем-то вроде Blender или MeshLab. Если вы на самом деле не заботитесь о цветах, вы можете удалить цвета из геометрии в three.js перед экспортом в glTF.   -  person brianpeiris    schedule 23.12.2019
comment
Полезно знать, спасибо. Я не очень разбираюсь в 3D-моделировании, я разберусь, что такое распаковка. В краткосрочной перспективе подойдет снятие цветов. Любые советы, которые у вас есть, были бы замечательными!   -  person wr0ngway    schedule 24.12.2019


Ответы (1)


Если вам не важны цвета вершин, вы можете просто удалить этот атрибут из BufferGeometry, создаваемого STLLoader. Я обнаружил, что программе просмотра сцен также не нравится, что геометрия не индексируется. Вы можете обойти это с помощью функции mergeVertices в BufferGeometryUtils.

Вот рабочий пример: https://glitch.com/edit/#!/chartreuse-steed

var loader = new THREE.STLLoader();
loader.load(
  stlUrl,
  function(geometry) {
    // Delete vertex colors, since Scene Viewer doesn't support them.
    geometry.deleteAttribute("color");

    // Apparently Scene Viewer also doesn't support non-indexed geometry,
    // so we do this mergeVertices operation just to get an indexed geometry
    geometry = THREE.BufferGeometryUtils.mergeVertices(geometry);

    var material = new THREE.MeshStandardMaterial();
    material.vertexColors = THREE.VertexColors;

    var mesh = new THREE.Mesh(geometry, material);

    scene.add(mesh);

    exportGLTF(mesh);
  },
  undefined,
  function(error) {
    console.error(error);
  }
);
person brianpeiris    schedule 23.12.2019
comment
Потрясающе, отлично сработало. Созданный файл gltf теперь загружается в программе просмотра сцены без каких-либо предупреждений, так что это дает ответ на вопрос. К сожалению, он по-прежнему не работает в компоненте просмотра моделей, поэтому, если у вас есть какие-либо рекомендации, мы будем признательны. - person wr0ngway; 24.12.2019