【发布时间】:2020-04-25 12:42:19
【问题描述】:
您好,我正在尝试将一个物体移动到相机前面,当它到达目标位置时,我希望它停止。但它不起作用。
function objectToCamera(mX, mY, object)
{
var vector = new THREE.Vector3(mX, mY, 1);
vector.unproject(camera);
vector.sub(object.position);
var dx = object.position.x - camera.position.x;
var dy = object.position.y - camera.position.y;
var dz = object.position.z - camera.position.z;
var distance = Math.sqrt(dx*dx + dy*dy + dz*dz);
if(lastDistance < distance && lastDistance != -1)
keepOut = -1;
lastDistance = distance;
setTimeout(function(){
if( distance > 200 && keepOut == 1)
{
var amount = (1)*(indexForZoom/3);
amount = (amount>15) ? 15 : (1)*(indexForZoom/3);
if(distance - amount < 200)
amount = (distance-200)+1;
indexForZoom++;
object.translateZ(amount);
controls.target.addVectors(controls.target,vector.setLength(amount));
objectToCamera(mX, mY, object)
}
else
{
// stopForZoom = 1;
keepOut = -1;
objectClickHandler(object.name, object);
}
}, 10);
}
我正在检查相机和物体之间的距离,如果达到目标距离,我会让它停下来,但它不起作用。 在坐标中,如果我在正X坐标,距离减小,否则距离增加。
我认为,在我的代码中,距离应该一直在减少,但事实并非如此。
请帮忙。谢谢。
【问题讨论】:
-
我一直在看代码或几分钟。控制,那是轨道控制,对吧?这意味着(在旋转轨道之后)相机的 y 位置可能不是 0。您检查相机到物体的距离,但仅在 Z 轴上平移,那么距离可能永远不会低于 200。是目标是将对象设置在cameraView中心的固定距离?然后我建议获取 camera.worldDirection,将长度设置为 200 并将对象位置调整到该目标。否则,也许添加一个jsfiddle? :s :)
-
也; var distance = camera.position.distanceTo(object.position);是一个vector3函数;)
-
@EthanHermsey 感谢您的回复。是的,它是轨道控制。我之前尝试过 object.position.addVectors(~) ,但它也不起作用。如果我将相机移动到物体上,它确实有效。甚至 position.distanceTo 也不起作用。但最重要的是,当我将相机移动到对象时,效果很好。
-
听起来很奇怪。您看到下面发布的@gman 答案了吗?!他的代码和解释做得非常好!这是您正在寻找的功能吗?
-
我不知道移动物体和移动相机有什么区别。将相机移动到物体上工作得很好,但物体却不行。也许我需要做一个新项目,并在没有任何功能的情况下对其进行测试。
标签: three.js