Три треугольника js facevertex uv map: как масштабировать только 1 направление

В настоящее время у меня есть город, основанный на примере учебника г-на Дуба: "Как создать процедурный город из 100 строк". В уроке вы можете увидеть, что он создает 100 строительных сеток, которые затем объединяются в одну городскую сетку по соображениям производительности. Затем делается один материал, который применяется к городской сетке, придающей каждому зданию текстуру.

То, что я хочу остановить, - это сжатие и растяжение текстуры здания. Для того чтобы создать более реалистичный вид "окна одинаковой высоты на разных зданиях" выглядят.

То, что я думаю, было бы решением - манипулировать UV вершины грани со значениями масштабирования геометрии.

С помощью следующего кода я могу масштабировать текстуру в 2 раза.

  let faceVertexUvs = buildingMesh.geometry.faceVertexUvs[0];
  for (let k = 0; k < faceVertexUvs.length; k++) {
    const uvs = faceVertexUvs[k];
    if ( k == 4 || k == 5){
      // Make the roof blank
      uvs[0].set(0, 0);
      uvs[1].set(0, 0);
      uvs[2].set(0, 0);
    }
    else if( k % 2 == 0) {
      uvs[0].set(0, 0.5);
      uvs[1].set(0, 0);
      uvs[2].set(0.5, 0.5);
    }
    else {
      uvs[0].set(0, 0);
      uvs[1].set(0.5, 0);
      uvs[2].set(0.5, 0.5);
    }
  }

Однако я бы хотел масштабировать только вертикально и оставить горизонтальное масштабирование в покое. Но я не совсем понимаю связь между двумя треугольниками.

2 ответа

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

  let scale_y = buildingMesh.scale.y/200;
  let scale_x = buildingMesh.scale.x/100;

  for (let k = 0; k < faceVertexUvs.length; k++) {
    const uvs = faceVertexUvs[k];
    else if( k % 2 == 0) {
      uvs[0].set(0, texture_scale_y);                 // 0 1
      uvs[1].set(0, 0);                               // 0 0
      uvs[2].set(texture_scale_x, texture_scale_y);   // 1 1
    }
    else {
      uvs[0].set(0, 0);                               // 0 0
      uvs[1].set(texture_scale_x, 0);                 // 1 0
      uvs[2].set(texture_scale_x, texture_scale_y);   // 1 1
    }
  }

Это решает мою проблему, но я все еще хотел бы знать объяснение. Я вижу, что X всегда первый, а Y второй, но это может быть неверным выводом.

Я не мог раскрасить свои вершины, поэтому я не могу сказать, какая вершина есть какая.

Возможно, вам следует изменить .repeat свойство текстуры городской модели. ссылка на документ: https://threejs.org/docs/

Другие вопросы по тегам