单击网格时,ArcRotateCamera会聚焦



我使用ArcRotateCamera,当我点击网格时,我必须将相机聚焦在上

var camera = new BABYLON.ArcRotateCamera("Camera", -Math.PI / 2, Math.PI / 2, 300, BABYLON.Vector3.Zero(), scene);
camera.setTarget(BABYLON.Vector3.Zero());

// on mesh click, focus in
var i = 2;
var pickInfo = scene.pick(scene.pointerX, scene.pointerY);
if (pickInfo.hit) {
pickInfo.pickedMesh.actionManager = new BABYLON.ActionManager(scene);
pickInfo.pickedMesh.actionManager.registerAction(
new BABYLON.ExecuteCodeAction(BABYLON.ActionManager.OnPickTrigger,
function (event) {
camera.position = (new BABYLON.Vector3(pickInfo.pickedPoint.x, pickInfo.pickedPoint.y, camera.position.z + i));
i += 2;
})
);
}

该代码更改网格的z位置,但不使其位于屏幕的中心

代码中有一些内容可以更改。

第一,您所做的是在点击后执行代码操作,而不是在pick发生后简单地在回调中运行代码。您在第一帧的右侧注册了一个拾取操作(从技术上讲是用户单击(,但前提是鼠标在正确的时间出现在正确的位置。我的猜测是,它不是每次都工作(除非你的场景被网格覆盖:-(

第二个-你正在改变相机的位置,而不是改变它所看到的位置。更改相机的位置不会产生您想要的结果(查看选定的网格(,它会将相机移动到新位置,同时仍聚焦在旧位置。

有几种方法可以解决这个问题。第一个是:

scene.onPointerDown = function(evt, pickInfo) {
if(pickInfo.hit) {
camera.focusOn([pickInfo.pickedMesh], true);
}
}

ArcRotate相机提供focusOn功能,该功能聚焦在一组网格上,同时固定相机的方向。这很有帮助。你可以在这里看到一个演示:

https://playground.babylonjs.com/#A1210C#51

另一个解决方案是使用setTarget函数:

https://playground.babylonjs.com/#A1210C#52

它的工作方式有点不同(请注意相机的方向变化(。

另一件事-使用巴比伦集成的指针事件,因为它们为您节省了额外的场景选择调用。指针向下是通过函数中集成的pickinfo执行的,因此您可以获得当前指针向下/向上/移动每一帧的pickininfo。

****编辑***

在一个新的注释之后-因为你想设置值的动画,所以你所需要做的就是存储当前值,计算新值,并使用内部动画系统设置值动画(这里的文档-https://doc.babylonjs.com/babylon101/animations#basic-动画(。有很多方法可以实现这一点,我采用了一个旧功能并对其进行了现代化:-(

这是演示-https://playground.babylonjs.com/#A1210C#53

最新更新