创建散弹枪传播模式 (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 值来定位每条光线。
你好,我是 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 值来定位每条光线。