При нажатии на сетку ArcRotateCamera фокусируется на - PullRequest
0 голосов
/ 25 октября 2019

Я использую 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 Ответ

1 голос
/ 28 октября 2019

Есть несколько вещей, которые можно изменить в вашем коде.

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

, которая работаетнемного по-другому (обратите внимание на изменение ориентации камеры).

Другое дело - используйте события указателя, встроенные в Babylon, так как они избавляют вас от дополнительного вызова для выбора сцены. указатель вниз выполняется с интегрированной в функцию pickinfo, так что вы можете получить информацию о выборе текущего указателя вниз / вверх / переместить каждый кадр.

**** РЕДАКТИРОВАТЬ ****

После нового комментария - поскольку вы хотите анимировать значения, все, что вам нужно сделать, это сохранить текущие значения, рассчитать новые,и анимировать значения, используя внутреннюю систему анимации (документация здесь - https://doc.babylonjs.com/babylon101/animations#basic-animation). Есть много способов добиться этого, я взял старую функцию и модернизировал ее: -)

Вот демо -https://playground.babylonjs.com/#A1210C#53

...