Я рекомендую первым иметь взгляд на OBJ format и ваш меш. (Более подробную информацию о Paul Bourke's site)
Вы должны иметь возможность легко проверить топологию, используя бесплатный 3D редактор (например, Blender, Wings3D и т.д. .). (например mesh -> triangles or quads -> vervices
)
Идея заключается в том, чтобы иметь четкое понимание того, как структурированный файл (не использует треугольник, квад лица или комбинация, есть ли вложенные структуры и т.д.)
После того, как вы знаете, как ваша модель структурирована, будет намного легче получить доступ к каждому лицу и его вершинам. Как сказал Кевин, просто используйте функции обработки PShape для перемещения по сетке. Например:
- getChildCount() подсчитать количество дочерних экземпляров PShape (удобно для перемещения глубоко вложенные древовидные структуры)
- getChild(), чтобы получить экземпляр PShape ребенка в данном случае
- getVertexCount() сосчитать вершин в PShape экземпляр
- getVertex() получить экземпляр вершины PShape при заданном (допустимый индекс)
Be сюр e до всегда проверить, сколько детей PShape доступно перед прохождением и сколько вершин доступно, чтобы избежать ошибок NullPointerReference.
Вот модифицированная версия образца из Примеры> Основы> Shape> LoadDisplayOBJ
/**
* Load and Display an OBJ Shape.
*
* The loadShape() command is used to read simple SVG (Scalable Vector Graphics)
* files and OBJ (Object) files into a Processing sketch. This example loads an
* OBJ file of a rocket and displays it to the screen.
*/
PShape rocket;
float ry;
int startFaceIndex = 0;
int stopFaceIndex;
int maxFaceIndex;
public void setup() {
size(640, 360, P3D);
rocket = loadShape("rocket.obj");
maxFaceIndex = rocket.getChildCount();
stopFaceIndex = maxFaceIndex;
println("total faces:",rocket.getChildCount());
println("faces[0] vertices count:",rocket.getChild(0).getVertexCount());
println("faces[0] vertices[0]",rocket.getChild(0).getVertex(0));
println("faces[0] vertices[1]",rocket.getChild(0).getVertex(1));
println("faces[0] vertices[2]",rocket.getChild(0).getVertex(2));
}
public void draw() {
background(0);
lights();
translate(width/2, height/2 + 100, -200);
rotateZ(PI);
rotateY(ry);
//shape(rocket);
drawFaceSelection();
ry += 0.02;
}
void drawFaceSelection(){
beginShape(TRIANGLES);
for(int i = startFaceIndex; i < stopFaceIndex; i++){
PShape face = rocket.getChild(i);
int numVertices = face.getVertexCount();
for(int j = 0; j < numVertices; j++){
vertex(face.getVertexX(j),face.getVertexY(j),face.getVertexZ(j));
}
}
endShape();
}
void mouseDragged(){
if(keyPressed){
startFaceIndex = (int)map(mouseX,0,width,0,maxFaceIndex-1);
startFaceIndex = constrain(startFaceIndex,0,maxFaceIndex-1);
}else{
stopFaceIndex = (int)map(mouseX,0,width,1,maxFaceIndex-1);
stopFaceIndex = constrain(stopFaceIndex,0,maxFaceIndex-1);
}
}
Запуск демо вы можете перетащить мышью по оси X, чтобы контролировать, как много граней .OBJ сетки рисуются:
Если вы не заботитесь о гранях/структуре и просто хотите получить доступ вершины (чтобы сделать их в виде каре или любой форме вы любите), вы могли бы написать рекурсивный функция для обхода PShape и это дети, и добавить все вершины в виде плоского списка:
/**
* Load and Display an OBJ Shape.
*
* The loadShape() command is used to read simple SVG (Scalable Vector Graphics)
* files and OBJ (Object) files into a Processing sketch. This example loads an
* OBJ file of a rocket and displays it to the screen.
*/
PShape rocket;
float ry;
ArrayList<PVector> vertices = new ArrayList<PVector>();
int startVertexIndex = 0;
public void setup() {
size(640, 360, P3D);
strokeWeight(9);
rocket = loadShape("rocket.obj");
getVertices(rocket,vertices);
println(vertices);
}
/*
* recursively retrieves vertices from a PShape
* @arg PShape shape - the PShape instance to traverse (must be not null)
* @arg ArrayList<PVector> vertices - the list of vertices to add values to
*/
void getVertices(PShape shape,ArrayList<PVector> vertices){
//for each face in current mesh
for(int i = 0 ; i < shape.getChildCount(); i++){
//get each child element
PShape child = shape.getChild(i);
int numChildren = child.getChildCount();
//if has nested elements, recurse
if(numChildren > 0){
for(int j = 0 ; j < numChildren; j++){
getVertices(child.getChild(j),vertices);
}
}
//otherwise append child's vertices
else{
//get each vertex and append it
for(int j = 0 ; j < child.getVertexCount(); j++){
vertices.add(child.getVertex(j));
}
}
}
}
public void draw() {
background(255);
lights();
translate(width/2, height/2 + 100, -200);
rotateZ(PI);
rotateY(ry);
//shape(rocket);
drawVerticesSelection();
ry += 0.02;
}
void drawVerticesSelection(){
beginShape(POINTS);
for(int i = startVertexIndex; i < vertices.size(); i++){
PVector v = vertices.get(i);
vertex(v.x,v.y,v.z);
}
endShape();
}
void mouseDragged(){
startVertexIndex = (int)map(mouseX,0,width,0,vertices.size()-1);
startVertexIndex = constrain(startVertexIndex,0,vertices.size()-1);
}
Вот предварительный показ/скрытие вершины в сетке:
Голые это игнорируется vertexCodes().
Кроме того, если вы не хотите изменять сам файл .obj и как его визуализировать, вы должны изучить GLSL и прочитать Processing PShader tutorial. Это более низкий уровень, но будет намного более эффективным, и вы будете обладать гораздо большей гибкостью в процессе рендеринга.
Было бы полезно, если бы вы сказали нам, что делает этот код. Также, если вы могли бы предоставить ссылку на ваш файл 'x.obj'. –