Threejs: Как можно экспортировать с GLTFExporter индексированную геометрию с диапазоном рисования? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть конкретная проблема, я хотел бы экспортировать индексированную геометрию, которая имеет дальность полета.Используя GLTFExporter, после того, как я столкнулся с проблемой интеграции машинописного текста (очевидно, известная проблема), мне не повезло обнаружить, что это не было реализовано в экспортере:

// @TODO Indexed buffer geometry with drawRange not supported yet

https://github.com/mrdoob/three.js/blob/master/examples/js/exporters/GLTFExporter.js строка564

Проверка истории коммитов показала, что последнее обновление было 3 месяца назад, и я не думаю, что это произойдет в ближайшее время.Я пытался удалить индексный буфер и переписать базу массива буферов позиции для моего диапазона рисования, но я должен сделать что-то не так, потому что он не работает, он просто нарушает мою геометрию.У кого-нибудь из вас есть возможность обойти меня или какие-нибудь объяснения, как поступить с моей геометрией?

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Мой текущий способ обхода "de-index" моя геометрия для экспорта исохранить drawRange, этот случай обрабатывается экспортером.Это не идеально, и это заставляет меня воссоздать новую геометрию с новыми BufferAttributes.Но поскольку эта операция выполняется только для экспорта, я могу даже сделать этот процесс асинхронным.Я бы хотел, чтобы был лучший способ.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Как упомянуто в моем редактировании, я обошел мою проблему с помощью деиндексации моей геометрии, это не лучшее решение, но так как оно мне нужно только для этого экспорта, вот как я поступил:

// original attributes
const vertices  = geometryTmp.getAttribute("position");
const normals  = geometryTmp.getAttribute("normal");
const uv  = geometryTmp.getAttribute("uv");

// new buffer arrays
let verticesTmp = new Float32Array(3 * geometryTmp.index.array.length);
let normalTmp = new Float32Array(3 * geometryTmp.index.array.length);
let uvTmp = new Float32Array(2 * geometryTmp.index.array.length);


let j = 0;
for(let i = 0; i < verticesTmp.length; i += 3) {
    let index = geometryTmp.index.array[j];
    verticesTmp[i] = vertices.getX(index);
    verticesTmp[i+1] = vertices.getY(index);
    verticesTmp[i+2] = vertices.getZ(index);

    normalTmp[i] = normals.getX(index);
    normalTmp[i+1] = normals.getY(index);
    normalTmp[i+2] = normals.getZ(index);
    j++;

}

j = 0;
for(let i = 0; i < uvTmp.length; i += 2) {
    let index = geometryTmp.index.array[j];
    uvTmp[i] = uv.getX(index);
    uvTmp[i+1] = uv.getY(index);
    j++;
}

let newGeomtry = new THREE.BufferGeometry();
newGeomtry.addAttribute( 'position', new THREE.BufferAttribute( verticesTmp, 3 ) );
newGeomtry.addAttribute( 'normal', new THREE.BufferAttribute( normalTmp, 3 ) );
newGeomtry.addAttribute( 'uv', new THREE.BufferAttribute( uvTmp, 2 ) );

newGeomtry.drawRange = geometryTmp.drawRange;
mesh.geometry = newGeomtry;  

// After I do that to all the meshes I need, them to a new THREE.Scene that will be given to the exporter with truncateDrawRange = true

Надеюсь, это кому-то тоже поможет.

0 голосов
/ 17 октября 2018

Относительно двух переменных, это то, что я собираюсь рассмотреть в следующем PR, чтобы сделать его частью WebGLUtils и просто импортировать его.Не имеет смысла, что каждый, кому нужны эти константы, должен каждый раз переопределять их.

...