2017-02-09 8 views
0

Этот код работает отлично:Three.js CircleBufferGeometry не работает с несколькими элементами

circlesGeometry = new THREE.CircleBufferGeometry(10, 32); 
    var material = new THREE.MeshBasicMaterial({ color: 0xff0000 }); 
    var mesh = new THREE.Mesh(circlesGeometry, material); 
    scene.add(mesh); 

Затем я пытаюсь добавить позицию:

circlesGeometry = new THREE.CircleBufferGeometry(10, 32); 
    circlesGeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array([0, 0, 0]), 3)); 
    var material = new THREE.MeshBasicMaterial({ color: 0xff0000 }); 
    var mesh = new THREE.Mesh(circlesGeometry, material); 
    scene.add(mesh); 

У меня есть ошибка:

[.Offscreen-For-WebGL-0x7f9abda5ea00]GL ERROR :GL_INVALID_OPERATION : glDrawElements: attempt to access out of range vertices in attribute 0

Что неправильно?

ответ

1

Documentation говорит:

.addAttribute (имя, атрибут)

Добавляет атрибут к этой геометрии. Используйте это свойство, а не свойство атрибутов, потому что поддерживается внутренний хэш-файл .attributes, чтобы ускорить повторение атрибутов.

и, роясь в BufferGeometry.js, мы можем видеть, что .addAttribute() делает следующий (в ближайшее время):

addAttribute: function (name, attribute) { 

    ... 
    this.attributes[ name ] = attribute; // here you set the property 

    return this; 

} 

Как ваша геометрия буфера уже имеет position свойство (объекта) attributes имущества (объекта), когда вы делаете это:

circlesGeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array([0, 0, 0]), 3)); 

вы просто заменить существующий position объект с новым которого array содержит всего 3 пунктов. Простыми словами, объект не может содержать несколько свойств с одним и тем же именем.

Как вы создали THREE.CircleBufferGeometry(), оно уже заполнило index свойство, содержащее индексы вершин для лиц. В вашем случае его имущество array содержит 96 элементов. Значение элемента 31 равно 12. Но когда вы заменили атрибут position новым массивом, который содержит всего 3 элемента [0..2], нет элемента с индексом 12.

+0

Я использую этот пример. https://threejs.org/docs/#Reference/Core/BufferGeometry Для строк и BufferGeometry этот пример отлично работает. – Gabriel

+0

[это] (https://threejs.org/examples/webgl_buffergeometry_lines) один? Вначале была создана 'THREE.BufferGeometry()', которая содержит пустой атрибут 'attribute', а затем заполняется свойствами' position' и 'color', значения которых для' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Но когда вы создаете 'THREE.CircleBufferGeometr (10, 32)', у вас уже есть атрибут 'position'. – prisoner849

+0

[jsfiddle] (https://jsfiddle.net/prisoner849/q5t19kyt/) просто сравнивает объекты в журнале консоли браузера. Обратите внимание на атрибут 'index' в обеих геометриях. – prisoner849

 Смежные вопросы

  • Нет связанных вопросов^_^