THREE.js - координаты вершин BufferGeometry (ObjLoader)

Я новичок в Three.js, и у меня проблема с получением координат двух вершин. Мне нужны их координаты x, y, z для расчета и рисования размеров.

Я использовал ObjLoader и точно знаю ID (индексы) вершин - 11889 и 11877.

Я пытался использовать некоторые свойства BufferGeometry, но, очевидно, неправильно. Итак, вот простой код, с которым я остаюсь.

                var coord1 = [11889,0,0,0], coord2 = [11877,0,0,0];

            var mtlLoader = new THREE.MTLLoader();      
            mtlLoader.load(
                'bath1.mtl',
                function( materials ) 
                {
                    materials.preload();
                    oLoader.setMaterials( materials );
                    oLoader.load('bath1.obj', function ( bath ) 
                    {
                        bath.name="bath1";
                        bath.position.y -=1; bath.position.x -=0.25; bath.position.z -=1;
                        scene.add( bath ); 
                    },
                    function ( xhr ) {},
                    function ( error ) {console.log( 'An error happened' );}
                    );

                }
            );

Я прочитал несколько похожих вопросов, но не смог адаптировать ответы для своей проблемы. Что делать, чтобы получить координаты? Спасибо!


person flay_x    schedule 06.07.2018    source источник


Ответы (1)


Как вариант, вы можете использовать метод .fromArray() THREE.Vector3(), Сюда:

var geo = new THREE.PlaneBufferGeometry(5, 5);
var bath = new THREE.Mesh(geo, new THREE.MeshBasicMaterial());

var vert1 = new THREE.Vector3().fromArray(bath.geometry.attributes.position.array, 1 * 3);
var vert2 = new THREE.Vector3().fromArray(bath.geometry.attributes.position.array, 2 * 3);

console.log(vert1, vert2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/94/three.min.js"></script>

Другой подход заключается в использовании методов .getXXX() THREE.BufferAttribute():

var geom = new THREE.PlaneBufferGeometry(5, 5);
var bath = new THREE.Mesh(geom, new THREE.MeshBasicMaterial());

var position = bath.geometry.attributes.position;
var x = position.getX(1);
var y = position.getY(1);
var z = position.getZ(1);

console.log(x, y, z);
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/94/three.min.js"></script>

person prisoner849    schedule 06.07.2018
comment
Спасибо. Но я пробовал что-то вроде этого. И у меня всегда ошибка Bath.geometry is undefined. Может я где-то не так использую? Вот примеры того, что я сделал ссылка ссылка - person flay_x; 07.07.2018
comment
@flay_x Если вы сделаете console.log(bath), вы увидите, что это не THREE.Mesh(), но, держу пари, это будет THREE.Group() или THREE.Object3D(). Таким образом, вы должны работать с дочерними элементами объекта bath. - person prisoner849; 07.07.2018