THREE.js Цветовые и позиционные атрибуты bufferGeometry используют разные вершины и их трудно сравнивать - PullRequest
0 голосов
/ 10 июня 2018

У меня есть плоскость с детализацией 400 на 400. Когда я определяю координаты y всех вершин, я делаю это.

var position = floorGeometry.attributes.position;    

for ( var i = 0; i <= complexity + 1; i ++ ) {
        for (var i2 = 0; i2 <= complexity; i2 ++) {
        vertex.fromBufferAttribute( position, i * complexity + i2);
        var x = vertex.x;
        var y = vertex.z;
        vertex.y = noise(x,y)
        position.setXYZ(i * complexity + i2, vertex.x, vertex.y, vertex.z );
        }
    }

Сложность представляет детали плоскости.

Как видите ... Я использую geometry.attributes.position для доступа к вершинам, но важно отметить, что здесь хранятся все "квадратные" координаты

enter image description here

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

enter image description here

Я занимаюсь созданием массива цветов (3 элемента в каждой вершине, представляющих rgb), а затем пытаюсь добавить его в качестве атрибута длягеометрия, и я пытаюсь сделать вершины разной высоты разных цветов.Например,

count = floorGeometry.attributes.position.count;
var colors = [];

for ( var i = 0; i < count; i ++ ) {
    vertex.fromBufferAttribute( position, Math.floor(i)); //<---- NOTE
    if (vertex.y > 500) {
        colors.push(1,0,0);
    }
    else colors.push(0,1,0);
}

В точке кода с комментарием «ПРИМЕЧАНИЕ» я не знаю, что я здесь делаю, с точки зрения передачи индекса из этой квадратной системы в систему вершин, основанную на трехцветных атрибутах.

Есть идеи?Должен ли я попытаться получить доступ к вершинам системы, основанной на tri?Есть ли математический способ сделать это правильно?

1 Ответ

0 голосов
/ 10 июня 2018

Простое решение состоит в том, чтобы не использовать:

vertex.fromBufferAttribute( position, index );

, поскольку в нем используется квадратная система, о которой я говорил в моем вопросе, вместо этого используйте:

geometry.attributes.position.getY(i);

или .getX(i) или .getZ(i) потому что они используют вершины трис!

...