THREE.js Атрибуты цвета и положения bufferGeometry используют разные вершины, и их трудно сравнивать.

У меня есть плоскость с детализацией 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 для доступа к вершинам, но важно отметить, что здесь хранятся все координаты "sqaure"

введите описание изображения здесь

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

введите описание изображения здесь

Я делаю массив цветов (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);
}

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

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


person Canatron    schedule 10.06.2018    source источник
comment
Взгляните на этот ответ SO.   -  person prisoner849    schedule 10.06.2018
comment
Спасибо, я видел, как он ссылался на каждую вершину tri с помощью метода floorGeometry.attributes.position.setY (i, val), и понял, что у него тоже должен быть метод getY, и теперь он выглядит очень гладко. Спасибо!   -  person Canatron    schedule 10.06.2018


Ответы (1)


Простое решение - не использовать:

vertex.fromBufferAttribute( position, index );

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

geometry.attributes.position.getY(i);

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

person Canatron    schedule 10.06.2018