2015-11-27 6 views
5

THREE.Box3.setFromObject(*object*) возвращает неправильные значения. Лучший способ показать вам, показывая вам, как я работаю через него:setFromObject (mesh) возвращает неправильные значения, иногда

Я создаю 2 ячейки из вершин. Первый с функцией triangle(), другой - с trapezoidForm().

var triangle = function (base, height) { 

    return [ 
     new THREE.Vector2(0, -height/2), 
     new THREE.Vector2(-base/2, height/2), 
     new THREE.Vector2(base/2, height/2) 
    ]; 
} 
var trapezoidForm = function (base, upperBase, height) { 

    return [ 

     new THREE.Vector2(-base/2, height/2), 
     new THREE.Vector2(-upperBase/2, -height/2), 
     new THREE.Vector2(upperBase/2, -height/2), 
     new THREE.Vector2(base/2, height/2), 
    ]; 

} 

Я использую возвращаемое значение, чтобы создать свою сетку:

var material = new THREE.MeshPhongMaterial({ color: 0x666666, /*specular: 0x101010*//*, shininess: 200*/ }); 
var shape  = new THREE.Shape(vertices); 
var mesh  = new THREE.Mesh(new THREE.ShapeGeometry(shape), material); 

И использовать, чтобы поместить его на сцене, и создать BoundingBox:

mesh.position.set(posX, 0, posZ); 
mesh.rotation.set(-Math.PI/2, 0, 0); 
boundingBox.setFromObject(mesh); 

Теперь я хочу найти центр моих двух форм. Достаточно легко: я беру ограничивающий бокс и вычисляю его. Как это:

var centerX = (boundingBox.max.x + boundingBox.min.x) * 0.5; 
var centerZ = (boundingBox.max.z + boundingBox.min.z) * 0.5; 

Вот где идет не так: Для треугольника, он вычисляет правильное место, но для трапеции, это портит.

Ниже находится печатный экран консоли. Первые три вершины для треугольника, за которыми следует ограничивающий бокс. Следующие 4 для трапеции, с снова ограничивающей коробкой. Для вершин: первое число - X-координата, второе - Z-координата.

Console log, showing the problem

Желаемый результат: второй BoundingBox должен возвращать что-то вроде:

max: X: 200 
    Z: 200 

min: X: -200 
    Z: -100 

Изображение показывает текущее состояние (треугольник имеет минус знак в середине, трапеции нет):

state of situation

ответ

0

Нашли решение самостоятельно в конце:

я должен создать свою BoundingBox, прежде чем я переставить или повернуть его:

//Boundingbox 
boundingBox.setFromObject(mesh); 

mesh.position.set(posX, 0, posZ); 
mesh.rotation.set(-Math.PI/2, 0, 0); 

вместо:

mesh.position.set(posX, 0, posZ); 
mesh.rotation.set(-Math.PI/2, 0, 0); 
//Boundingbox 
boundingBox.setFromObject(mesh); 

причину, почему треугольник не вызывает проблем, потому, что оно было вынесено 0,0.