Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Только если самопис.есть ли альтернатива AABB которая позволяет это учитывать?
Не проще ли кидать луч к сущностям в радиусе (с трешхолдом, конечно же), а затем проверять видимость его перед игроком?Я хочу получить мобов находящихся перед игроком, на определённом расстоянии, но AABB привязан к квадратной сетке и поэтому не позволяет учитывать поворот камеры,
private LivingEntity getNearestLivingEntity(Level pLevel, Player pPlayer) {
Vec3 playerVec = pPlayer.getLookAngle();
LivingEntity nearest = null;
Vec3 posVector;
Vec3 posVectorNormalized;
double cos;
double dist = Integer.MAX_VALUE;
List<LivingEntity> li = getEntitiesInRadius(pLevel, range, (int)pPlayer.getX(), (int)pPlayer.getY(), (int)pPlayer.getZ());
for (LivingEntity livingEntity : li) {
if(livingEntity == pPlayer) continue;
posVector = livingEntity.position().subtract(pPlayer.position());
posVectorNormalized = (livingEntity.position().subtract(pPlayer.position())).normalize();
cos = RechromaMathHelper.cosFromScalarProduct(posVectorNormalized, playerVec.normalize());
if(dist > posVector.length() && cos >= 0.5) {
nearest = livingEntity;
dist = posVector.length();
}
}
return nearest;
}
private List<LivingEntity> getEntitiesInRadius(Level pLevel, int r, int x, int y, int z) {
return pLevel.getEntitiesOfClass(LivingEntity.class, new AABB(x-r,y-r,z-r,x+r,y+r,z+r));
}
posVector.normalize(), как то ты делаешь с playerVec?Вот так делать тоже нежелательно. Для этого нужны Optional.LivingEntity nearest = null;
Это связано с тем, что разрешение экрана не 1:1. Иначе говоря, для нахождения сущностей по вертикали используется тот же угол, что и при по горизонтали, однако по вертикале игрок видит меньше, чем по горизонтали. Оттого и такой результат.Единственное что есть небольшая проблема с тем, что при больших углах игрок может не видеть моба если повернёт камеру вниз или вверх, а этот моб всё равно будет выбран
private static final double REFERENCE_COS = Math.cos(Math.to_radians(60));Насчёт normalize(), я сильно затупил, подумал, что он меняет текущий вектор, а не возвращает новыйСтроки 15-16 выглядят сомнительно