|
本帖最后由 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()改编来的
|
|