= 创作分享 =
编程开发
如何旋转向量?
仙勾子

如何旋转向量?

仙勾子 于 2023-2-3 15:49 ( 1年前 ) [复制链接] [只看楼主] [打印]
486 1
本帖最后由 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(),这样会不均匀的
发表于 2023-2-3 15:49:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

回复 | 举报

该帖共收到 1 条回复!
仙勾子
本帖最后由 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()改编来的




未死之前,终有希望
发表于 2023-2-4 11:12:12 | 只看该作者

回复 | 举报

百科目前不允许匿名发帖哦~ 请先 [ 登陆 ][ 注册 ] 吧~

本版积分规则

发新帖
  • 回复
  • 点评
  • 评分

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表