Ошибка экземпляра BufferGeometry.copy в three.js

#three.js #buffer-geometry

Вопрос:

Я запускаю three.js пример кода, его three.js версия — 0.124.

 createObj() {
    const geometry = new THREE.InstancedBufferGeometry();
    const baseGeometry = new THREE.BoxGeometry(2, 2, 20, 2, 2, 6);
    
    // Copy attributes of the base Geometry to the instancing Geometry
    geometry.copy(baseGeometry);
}
 

когда код выполняется в ‘geometry.copy (baseGeometry);’, появляется ошибка, показанная как

 TypeError: Cannot read properties of undefined (reading 'clone')
    at InstancedBufferGeometry.copy (three.module.js?cf64:10935)
    at InstancedBufferGeometry.copy (three.module.js?cf64:40628)
    at createObj (Clouds.js?d048:24)
 

Ответ №1:

InstancedBufferGeometry.copy() принимает только другой InstancedBufferGeometry объект в качестве аргумента. Вы пытаетесь передать устаревший Geometry объект (ТРИ.Геометрия была частью ядра вплоть до r125, а вы используете r124), поэтому при выполнении этого метода он прерывается, когда замечает, что в нем отсутствуют все инстанцирующие свойства.

Смотрите Здесь в документации для использования copy() метода

Комментарии:

1. Вы можете перейти BufferGeometry в .copy() of InstancedBufferGeometry , просто установите .instanceCount = Infinity для объекта InstancedBufferGeometry .

2. @prisoner849 Это верно для последних версий, но при r124 создании a BoxGeometry будет устаревший Geometry класс, а не a BufferGeometry .

3. Да, верно. В эти дни BufferGeometry был .fromGeometry() метод. И также было BoxBufferGeometry . Если автор хочет использовать инстансинг, он должен работать с атрибутами и всеми другими приятными вещами, которые BufferGeometry в любом случае принадлежат.