2016-12-02 4 views
0

Как я могу получить и распечатать вершину OBJ при обработке?Обработка OBJ extract vertex

PShape x; 

void setup(){ size(600,600,P3D); x = loadShape("x.obj"); 

} void draw(){ 

    for (int i = 0; i < x.getVertexCount(); i++) { PVector v = 
x.getVertex(i); 

translate(width/2,height/2); shape(x,0,0); } 

} 
+0

Было бы полезно, если бы вы сказали нам, что делает этот код. Также, если вы могли бы предоставить ссылку на ваш файл 'x.obj'. –

ответ

0

Я рекомендую первым иметь взгляд на 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.

Processing sample rocket.obj in Wings3D Editor

Вот модифицированная версия образца из Примеры> Основы> 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 сетки рисуются:

rocket.obj partial triangles rendered in Processing

Если вы не заботитесь о гранях/структуре и просто хотите получить доступ вершины (чтобы сделать их в виде каре или любой форме вы любите), вы могли бы написать рекурсивный функция для обхода 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); 
} 

Вот предварительный показ/скрытие вершины в сетке: PShape Vertices preview

Голые это игнорируется vertexCodes().

Кроме того, если вы не хотите изменять сам файл .obj и как его визуализировать, вы должны изучить GLSL и прочитать Processing PShader tutorial. Это более низкий уровень, но будет намного более эффективным, и вы будете обладать гораздо большей гибкостью в процессе рендеринга.

0

От the Processing forum:

Согласно документации, функции getVertexCount() и getVertex() работать только с вершинами, которые вы добавили, вызвав функцию vertex(), а не от формы вы загрузили из файла ,

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

PShape shape = loadShape("x.obj"); 
PShape child = shape.getChild(0); 
PVector vertex = child.getVertex(0); 

Consult the reference для функций, которые позволят вам перебрать каждый ребенок PShape, затем цикл над вершинами каждого ребенка.

Смежные вопросы