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中文模组百科