Создание шаблона распространения дробовика (babylon.js) - PullRequest
0 голосов
/ 13 ноября 2018

Здравствуйте, я новичок в babylonjs и уже несколько дней пытаюсь создать постоянную схему распространения дробовика в babylon.js.

На данный момент мой подход состоит в том, чтобы подготовить пару строк для отображения в массиве:

       let sgPellets = [
            BABYLON.Mesh.CreateLines("lines", [
                        shotgunPosition,
                        meshFound.pickedPoint
            ], this.Player.game.scene),
            BABYLON.Mesh.CreateLines("lines", [
                        shotgunPosition,
                        meshFound.pickedPoint
            ], this.Player.game.scene),
        ] 

, где shotgunPosition - это абсолютная позиция сетки дробовика в мире, а meshFound.pickedPoint - это позиция, к которой я стремлюсь (на сетке).

Таким образом, я могу нарисовать линию (в данном случае первую из массива) между сеткой дробовика и сеткой, на которую я нажимаю.

Теперь для второй строки я хочу, чтобы она немного повернулась на оси Y от первой (именно на которую я нацеливаюсь), так:

          for(let k=0; k<sgPellets.length; k++){
            sgPellets[k].setPivotPoint(shotgunPosition);
            sgPellets[k].isPickable = false;
            switch(k){
                case 1:
                    sgPellets[k].rotation.y += 0.1
                    break
            }
           }

Это хорошо работает, когда я смотрю по сторонам enter image description here

но не когда я смотрю вверх или вниз. enter image description here

Я думаю, что я что-то упустил по математике. Я также пытался использовать другие методы вращения, для того же результата.

Есть ли у кого-нибудь советы о том, как сделать угол постоянным между двумя линиями? Спасибо.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Спасибо за ответ!Вы догадались, я использую scene.pick.Я проверил ваш подход, и он работает довольно хорошо, я также смог создать конус между стволом и точкой, выбранной на сцене.Но я не был очень доволен.Хотя я думаю, что ваш метод не сработает в создании последовательного паттерна, где бы ни была выбранная точка, поэтому я закончил тем, что занялся чем-то другим.Я создал вторую «поддельную» камеру, которая вращается и позиционируется точно там, где находится настоящая, благодаря:

fakeCamera.rotationQuaternion = BABYLON.Quaternion.RotationYawPitchRoll(camera.rotation.y, camera.rotation.x, camera.rotation.z)

Таким образом, я могу добавить .rotationQuaternion к поддельнойс положением и преобразованным вращением от реального (я не мог добавить кватернион для реальной камеры, это испортило бы средства управления).В конце концов я смог расположить каждый луч в соответствии с выбранной точкой на сцене и значением вращенияQuaternion поддельной камеры.

0 голосов
/ 14 ноября 2018

Я предполагаю, что вы используете scene.pick, чтобы получить meshFound.pickedPoint (если вы не игнорируете этот ответ), и функция принимает координаты оси и y точки на экране, а затем превращает эту точку вточка в трехмерном пространстве.

Я предполагаю, что вы делаете что-то вроде:

var width     = scene.getEngine().getRenderWidth();
var height    = scene.getEngine().getRenderHeight();
var meshFound = scene.pick((width / 2), (height / 2), null, false, camera);

И это будет каждый раз получать одну и ту же точку в середине экрана, но это то, что яЯ предлагаю:

var weaponAccuracy             = 200;
var numShotgunPelletsPerBullet = 10;
var width                      = scene.getEngine().getRenderWidth();
var height                     = scene.getEngine().getRenderHeight();
for (var i = 0; i < numShotgunPelletsPerBullet; i++) {
    var accuracyX = Math.round((Math.random() * weaponAccuracy) - (weaponAccuracy / 2));
    var accuracyY = Math.round((Math.random() * weaponAccuracy) - (weaponAccuracy / 2));

    var meshFound = scene.pick((width / 2) + accuracyX, (height / 2) + accuracyY, null, false, camera);
    console.log(meshFound.pickedPoint);
}

Это выберет случайную точку в квадрате 200 на 200 пикселей вокруг середины экрана 10 раз.

Если вы хотите изменить увеличение или уменьшение точностиweaponAccuracy.

А если вы хотите изменить количество гранул в каждой пуле, измените numShotgunPelletsPerBullet.

...