将相机对准Three.js中物体的中心

时间:2014-07-17 16:26:55

标签: javascript three.js

我正在使用三个.js中的ColladaLoader加载和对象,所以我在场景中有一堆对象。其中一些是常规形状,如:立方体,球体等,对于这些形状,我可以这样做:

var position = { 
  x: selectedObject.position.x, 
  y: selectedObject.position.y, 
  z: selectedObject.position.z 
};

controls.target = new THREE.Vector3(position);

控件是相机的OrbitControls。相机在该位置居中并且工作正常,问题是当对象不是常规形状,而是由顶点生成的几何。在这种情况下,我已经尝试了4种不同的方法而没有预期的结果。

1

var position = { 
  x: selectedObject.matrixWorld.getPosition().x, 
  y: selectedObject.matrixWorld.getPosition().y, 
  z: selectedObject.matrixWorld.getPosition().z 
};

2

var centerX = selectedObject.geometry.boundingSphere.center.x;
var centerY = selectedObject.geometry.boundingSphere.center.y;
var centerZ = selectedObject.geometry.boundingSphere.center.z;

var position = { x: centerX, y: centerY, z: centerZ };

3

getCentroid(selectedObject.geometry.vertices);

function getCentroid(vertices) {
  var x = y = z = 0;
  vertices.forEach(function (element, index, array) {
    x += element.x;
    y += element.y;
    z += element.z;
  });

  return new THREE.Vector3(
    x / (vertices.length),
    y / (vertices.length),
    z / (vertices.length)
  );
}

4

var position = getCenter(
  getMaxnMinCenter(selectedObject.geometry.vertices), 
  selectedObject.matrixWorld
);


function getMaxnMinCenter(vertices) {
  var maxX = maxY = maxZ = vertices[0];
  var minX = minY = minZ = vertices[0];

  vertices.forEach(function (element, index, array) {
    if (element.x <= minX.x) {
      minX = element;
    }
    if (element.y <= minY.y) {
      minY = element;
    }
    if (element.z <= minZ.z) {
      minZ = element;
    }
    if (element.x > maxX.x) {
      maxX = element;
    }
    if (element.y > maxY.y) {
      maxY = element;
    }
    if (element.z > maxZ.z) {
      minZ = element;
    }
  });

  return {
    minimumX: minX,
    minimumY: minY,
    minimumZ: minZ,
    maximumX: maxX,
    maximumY: maxY,
    maximumZ: maxZ,
  }
}

重要的是要注意常规形状使用1.0的标度,而其他对象使用0.005的标度。

谢谢。

2 个答案:

答案 0 :(得分:7)

var bb = new THREE.Box3()
bb.setFromObject(selectedObject);
bb.center(controls.target);

使用边界框查找对象的中心

答案 1 :(得分:1)

尝试:

controls.target.copy( selectedObject.position );