Как получить вершины объекта модели obj в Three. JS? - PullRequest
2 голосов
/ 28 января 2020

После загрузки модели .obj в Three. js Я не могу найти данные вершин. Данные о вершинах необходимы, чтобы применить обнаружение столкновений, как предлагает этот ответ

var loader = new THREE.OBJLoader();
loader.load('models/wall.obj', function ( object ) {
    object.traverse( function ( node ) {
       if ( node.isMesh ) {
         console.log(node);
       }
    }); 
    scene.add( object );                
});

У меня sh есть geometry.attributes.position.array, но я не могу найти "вершины" в любом месте объекта .

Сейчас пытаюсь преобразовать position.array данные в вершины, но приведенный ниже код не работает, этот ответ правильно указывает на проблему, но я не могу использовать ее для решения проблемы:

var tempVertex = new THREE.Vector3();
// set tempVertex based on information from mesh.geometry.attributes.position
mesh.localToWorld(tempVertex);
// tempVertex is converted from local coordinates into world coordinates,
// which is its "after mesh transformation" position

1 Ответ

3 голосов
/ 28 января 2020

geometry.attributes.position.array IS вершины. Каждые три значения составляют одну вершину. Вы также захотите взглянуть на свойство index (geometry.index), потому что это список индексов в массиве position, определяющий вершины, составляющие форму. В случае Mesh, определенного как отдельные треугольники, каждые три индекса составляют один треугольник. (Данные Tri-Strip немного отличаются, но концепция ссылки на значения вершин по индексу та же.)

Вы можете поочередно использовать вспомогательные функции атрибута:

Эти функции принимают индекс в учет. Поэтому, если вы хотите первую вершину первого треугольника (индекс = 0):

let pos = geometry.attributes.position;
let vertex = new THREE.Vector3( pos.getX(0), pos.getY(0), pos.getZ(0) );

Это эквивалентно:

let pos = geometry.attributes.position.array;
let idx = geometry.index.array;
let size = geometry.attributes.position.itemSize;

let vertex = new THREE.Vector3( pos[(idx[0] * size) + 0], pos[(idx[0] * size) + 1], pos[(idx[0] * size) + 2] );

Как только у вас будет ваша вершина, тогда вы можете использовать mesh.localToWorld для преобразования точки в мировое пространство.

...