创建散弹枪传播模式 (babylon.js)

Creatin a shotgun spread pattern (babylon.js)

你好,我是 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
            }
           }

从侧面看效果不错

但当我向上或向下看时就不会。

我想我在数学方面遗漏了一些东西。 我也尝试过使用其他旋转方法来获得相同的结果。

有没有人对如何使两条线之间的角度保持不变有任何提示?谢谢。

我猜你正在使用 scene.pick 来获得 meshFound.pickedPoint (如果你不是那么忽略这个答案)并且该函数接受屏幕上一个点的 x 和 y 坐标然后将该点变成 3d space.

中的一个点

我猜你在做类似的事情:

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 x 200 像素的正方形中随机选择一个点 10 次。

如果要更改精度增加或减少weaponAccuracy

如果您想更改每颗子弹中的弹丸数,请更改 numShotgunPelletsPerBullet

谢谢您的回答!你猜对了,我正在使用 scene.pick。我已经测试了您的方法并且效果很好,我还能够在枪管和场景中选取的点之间创建一个圆锥体。但我不是很满意。尽管我认为无论选择点在哪里,您的方法都无法制作出一致的图案,所以我最终还是做了其他事情。我已经创建了第二个 "fake" 相机,它可以旋转并准确定位在真实相机所在的位置,这要归功于:

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

这样我就可以将 .rotationQuaternion 添加到具有位置的假相机中,并从真实相机转换旋转(我无法为真实相机添加四元数,它会弄乱控件)。最后,我能够根据场景中的 pickedPoint 和假相机的 rotationQuaternion 值来定位每条光线。