Обработка вывода highmap путем отображения смещения на поверхности сферы - PullRequest
0 голосов
/ 05 апреля 2020

Обработка выходного highmap путем отображения смещения на поверхности сферы, например, рисование холмов на поверхности shpere.

import peasy.*;
PShape ico1;

int level = 6; 
float hgt=0;

String[] imgname={"0.jpg","1.jpg","2.jpg"};
PImage[] images = new PImage[imgname.length];
int textImg=0;
float pz;
PVector rotation = new PVector(); 
PVector velocity = new PVector(); 
float rotationSpeed = 0.02; 

PShader texs;
void setup() {
  size(1000, 1000, P3D); 

  for(int i = 0; i<imgname.length;i++)images[i] = loadImage(imgname[i]);
  images[0].loadPixels();

  ico1 = createIcosahedron(level,textImg); //see example of processing for code of class Icosahedron,but init() and create() in a method createIcosahedron(level,textImg) and return the class Icosahedron.
  noLoop();
  for (int i = 0 ; i<ico1.getVertexCount(); i+=1){
      PVector vtemp=ico1.getVertex(i);
      pz=brightness(images[0].get((int)(ico1.getTextureU(i)),(int)(ico1.getTextureV(i))))*16;
      vtemp=vtemp.set(vtemp.x,vtemp.y,pz);
      ico1.setVertex(i,vtemp);
  }
  loop();

}

void draw() {
  background(240);
  translate(width/2, height/2); 
  scale(250); 
  //pointLight(255, 255, 255, 2*(mouseX-width/2), 2*(mouseY-height/2), 500);
  shader(texs);
   ambientLight(100, 102, 126);

  shape(ico1); 


}

  }
}

Приведенные выше пропускают некоторые несвязанные коды, выше не показывают вывод при запуске. пожалуйста помогите показать ошибку. Пожалуйста, посмотрите пример обработки для кода класса Icosahedron, но init () и create () в методе createIcosahedron (level, textImg) и возвращают класс Icosahedron. Вы можете искать в Google «обработку икосаэдра» для кодов, но на самом деле не имеет значения.

1 Ответ

0 голосов
/ 14 апреля 2020

Звучит так, как будто вы хотите изменить трехмерную геометрию подразделенного икосаэдра на основе текстуры карты высот, немного похоже на Обработка> Примеры> Демки> Графика> Me sh Tweening :

mesh tweening processing sample flat plane with a grayscale texture

mesh tweening processing sample distorted plane with a mountains/valleys based on grayscale values

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

эта часть:

PVector vtemp=ico1.getVertex(i);
      pz=brightness(images[0].get((int)(ico1.getTextureU(i)),(int)(ico1.getTextureV(i))))*16;
      vtemp=vtemp.set(vtemp.x,vtemp.y,pz);
      ico1.setVertex(i,vtemp);

нужно будет изменить.

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

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

Просто добавьте положение вершины к масштабированной нормали вершины, чтобы перевести ее в правильное положение. Что-то вроде:

PVector vtemp = ico1.getVertex(i);
float elevation = brightness(images[0].get((int)(ico1.getTextureU(i)),(int)(ico1.getTextureV(i))))*16 

PVector vNormal = getVertexNormal(vtemp);

PVector elevatedVertex = PVector.add(vtemp, PVector.mult(vNormal,elevation));

ico1.setVertex(i,elevatedVertex);

Где getVertexNormal() будет вычислять или извлекать предварительно рассчитанную нормаль вершины для этой вершины. Есть несколько ресурсов, вот один на Компьютерная графика StackExchange

Вот визуальное объяснение с использованием Blender: Blender subdivided Icosahedron mesh selected vertex normal translation

Я рекомендую проверить HE_Me sh Библиотека обработки (которую можно легко установить с помощью Contribution Manager), поскольку она обеспечит множество инструментов трехмерной геометрии.

Кроме того, если вы также можете посмотреть на смещение отображение и / или нормальное отображение

...