MC百科社群
标题:
如何旋转向量?
[打印本页]
作者:
xm94732568960
时间:
2023-2-3 15:49
标题:
如何旋转向量?
本帖最后由 xm94732568960 于 2023-2-3 16:04 编辑
不知道怎么将一个表示朝向的Vec3随机旋转0~90度,就像霰弹枪的随机散布一样,射出的所有子弹在屏幕上都均匀地在一个圈里散布,我用Vec3的xRot()yRot()zRot()方法等一系列方法,都发现旋转出来的Vec3有很大的错误,总是偏向左右边
(1.19.2forge环境)
不能new Vec3(Mth.nextDouble(),Mth.nextDouble(),Mth.nextDouble()).normalize(),这样会不均匀的
作者:
xm94732568960
时间:
2023-2-4 11:12
本帖最后由 xm94732568960 于 2023-2-4 11:14 编辑
写了个这么玩意
RandomSource source = level.getRandom();
double sqrt = Math.sqrt(vec31.x * vec31.x + vec31.z * vec31.z);
double x = -Mth.atan2(vec31.y, sqrt);
double y = Mth.atan2(vec31.z, vec31.x) - Math.PI / 2;
//参考net.minecraft.world.entity.ai.control.LookControl的getXRotD()getYRotD()方法
vec31 = calculateVector(wrapRadian(x + (source.nextDouble() * 2 - 1) * Math.PI), wrapRadian(y + (source.nextDouble() * 2 - 1) * Math.PI));
//最终获得的向量
public static Vec3 calculateVector(double p_20172_, double p_20173_) {
double f1 = -p_20173_;
double f2 = Math.cos(f1);
double f3 = Math.sin(f1);
double f4 = Math.cos(p_20172_);
double f5 = Math.sin(p_20172_);
return new Vec3(f3 * f4, -f5, f2 * f4);
}//从Entity.class的calculateViewVector()改编来的
public static double wrapRadian(double p_14176_) {
double d0 = p_14176_ % (Math.PI * 2);
if (d0 >= Math.PI) {
d0 -= Math.PI * 2;
}
if (d0 < -Math.PI) {
d0 += Math.PI * 2;
}
return d0;
}//从Mth.class的wrapDegrees()改编来的
欢迎光临 MC百科社群 (https://bbs.mcmod.cn/)
MC百科
|最大的MineCraft中文模组百科