单击网格时,ArcRotateCamera专注于

时间:2019-10-25 09:22:24

标签: babylonjs

我正在使用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位置,但不要使其位于屏幕中心

1 个答案:

答案 0 :(得分:1)

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

第一-您要做的是单击后执行代码操作,而不是在发生选择后仅在回调中运行代码。您正在第一帧的右侧注册一个选择动作(技术上是用户单击),但前提是在正确的时间在正确的位置找到了鼠标。我的猜测是,它并非每次都有效(除非您的场景被网格覆盖:-))

2nd-您正在更改相机的位置,而不是更改其观看位置。更改相机的位置不会得到您想要的(查看选定的网格),而是将相机移动到新位置,同时仍然聚焦在旧位置。

有几种解决方法。首先是这样:

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执行的,因此您可以获取当前指针的下/上/移动每帧的拾取信息。

****编辑****

在发表新评论后-由于要设置值的动画,因此您需要做的就是存储当前值,计算新值并使用内部动画系统设置值的动画(此处的文档-https://doc.babylonjs.com/babylon101/animations#basic-animation )。有很多方法可以实现这一点,我采用了旧功能并将其现代化:-)

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