Геометрия!

Версия Minecraft
1.7.10
173
1
3
Великий бог геометрии покарает меня за незнание, но все же, подскажите добрые люди как можно рассчитать векторы всякого рода спавна патиклов? Что-то вроде этого: 
По кругу от игрока:



Или в зависимости от расстояния до игрока

Или вообще по спирали?
 
173
1
3
timaxa007 написал(а):
Lobotino написал(а):
По кругу от игрока:
http://forum.mcmodding.ru/%D0%A2%D0%B5%D0%BC%D0%B0-1-5-2-%D0%94%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE-%D0%BA%D1%80%D1%83%D0%B3%D1%83

Спасибо, пригодится, но вопрос был в том, как рассчитать вектор движения частиц от центра в разные стороны, а не как заспавнить их по кругу :)
 

timaxa007

Модератор
5,831
409
672
Ясно. Точно не знаю. Задать для каждого вектора точку начала игрока до конечной точки, которую указываем через тот-же цикл для круга.


По спирали, опять-же, наверное, использовать по кругу, но уже будет использовать z который с каждым циклом будет подниматься на n-количество.
 
173
1
3
Но как в жабе задается начальная и конченая точка вектора? Только по направлению умею...
 

timaxa007

Модератор
5,831
409
672
Две переменные double типа если по x и y, а если по x, y и z, то три переменные double типа. И использовать как начальную, а так-же конечную. Можно создать класс в котором будет храниться эти векторы, а если в Minecraft'е использовать, то можно использовать класс net.minecraft.util.Vec3.
 
2,505
81
397
Сущности (в частности партиклы) спавнятся от какой-то определенной точки с определенным вектором движения (три motion параметра). Чтобы рассчитать точку, в которую переместится объект через тик, вспомни теорему Пифагора.
Спиралевидное движение реально задать, если только в onUpdate сущности изменять этот вектор
 
173
1
3
С двумя пунктами разобрался, вот код кому надо
Код:
 double y = player.posY;
            double x;
            double z;
            int r = 2;
            
            //От центра патиклы летят в разные стороны
            for (float l = 0; l < 2*Math.PI; l += 2*Math.PI/50)
            {
                x = player.posX + r*Math.cos(l);
                z = player.posZ + r*Math.sin(l);
                w.spawnParticle("flame", player.posX, y, player.posZ, (x - player.posX) * 0.2d, 0.00D, (z- player.posZ) * 0.2d);
            }
            
            //Вариант со спиралью вверх
            for (float l = 0; l < 4*Math.PI; l += 2*Math.PI/50)
            {
                y += 0.03d;
                x = player.posX + (r*Math.cos(l)*(l*0.1));
                z = player.posZ + (r*Math.sin(l) * (l*0.1));
                w.spawnParticle("flame", x, y - 0.5d, z, 0.0d, 0.00D, 0.0d);
            }
Только вот не могу разобраться со спавном патиклов относительно расстояния до игрока. Метод getDistance работает на сервере, а спавню я на клиенте... Или я просто запутался?
 
173
1
3
Вопрос немного не по теме, но с теми же частицами:
Как можно спавнить их по таймеру? То есть сделать так, чтобы они появлялись с промежутком по времени. Я пробовал привязать их к PlayerTickEvent, но получалась какая-то лажа, которую даже показывать стыдно. На клиенте все работало шикарно, так как нужно, но на сервере ввиду задержек и всякого рода пакетов общая картина искажалась и со стороны других игроков частицы спавнились не в то время и не в том месте. 
Есть у кого идеи как можно сделать таймер в частицах?
 
7,099
324
1,510
Lobotino написал(а):
На клиенте все работало шикарно, так как нужно, но на сервере ввиду задержек и всякого рода пакетов общая картина искажалась и со стороны других игроков частицы спавнились не в то время и не в том месте. 
Есть у кого идеи как можно сделать таймер в частицах?
Напиши и обучи нейросеть - пусть предсказывает когда надо партиклы спаунить, чтобы заранее пакеты слать
 
173
1
3
Забудьте, я все решил, там была проблема со счетом :Р
 
173
1
3
Ребятууууушкиии, все равно нужна помощь с одним не решенным вопросом. Пытаюсь вот заспавнить частицы конусом в зависимости от расстояния до игрока. Получается какая-то лажа, тыкните носом пожалуйста...
я для вас даже видео снял :3
Тык

Вот способ спавна:
Код:
               double multiplier = 0.3d;
                Random random1 = new Random(50);

                for (int i = 0; i < 30; i++) {
                Vec3 vec3 = player.getLook(1.0F);
                effectRenderer.addEffect(new CustomParticle(world, player.posX, player.posY, player.posZ, (vec3.xCoord / 2 * multiplier) + random1.nextDouble() * 0.1, (vec3.yCoord / 2 * multiplier) + random1.nextDouble() * 0.1,(vec3.zCoord/2 * multiplier)  + random1.nextDouble() * 0.1, 2).setScale(0.8d).setMaxAge(50));
 
608
5
15
Тебе надо создать вектор, сначала повернуть на углы игрока, а затем дополнительно повернуть, как тебе нужно и соединить с мировыми координатами. А ты просто прибавляешь, и хочешь, что-бы оно летело в нужную тебе сторону? :D

Если подходит рандомизация по всем координатам (вних-вверх и ближе-дальше) то достаточно просто прикрутить rand.nextDouble ? (прибавлять) : (отнимать)
 
173
1
3
svk2140 написал(а):
Тебе надо создать вектор, сначала повернуть на углы игрока, а затем дополнительно повернуть, как тебе нужно и соединить с мировыми координатами. А ты просто прибавляешь, и хочешь, что-бы оно летело в нужную тебе сторону? :D

Если подходит рандомизация по всем координатам (вних-вверх и ближе-дальше) то достаточно просто прикрутить rand.nextDouble ? (прибавлять) : (отнимать)

Яяя... вроде так и делаю? :D
 
173
1
3
Вроде рисовал сверху... Суть в том, что частицы от игрока летят конусом вперед с небольшим рандомным отклонением. Стрелочками показаны примерные векторы направления того, что мне нужно

 
2,505
81
397
Кароче, если ты хочешь именно идеальным конусом, то у меня не особо получилось. Если смотреть вперед, то все нормально, но если вниз или вверх, то все слетается в одну линию.

Можно рандомить, как ты, но это уже не конус. Только рандомить нужно не равномерную величину (0; 1), а нормальную. rand.nextGauss(). К тому же тут диапазон (-6; 6)
 
608
5
15
А можно же player.rotationYaw/pitch покрутить, обновить каким-то методом и заспавнить партиклы, а после, всё назад вернуть.
 
173
1
3
Dahaka написал(а):
Кароче, если ты хочешь именно идеальным конусом, то у меня не особо получилось. Если смотреть вперед, то все нормально, но если вниз или вверх, то все слетается в одну линию.

Можно рандомить, как ты, но это уже не конус. Только рандомить нужно не равномерную величину (0; 1), а нормальную. rand.nextGauss(). К тому же тут диапазон (-6; 6)

Суть была даже немного не в конусе... Ну, в общем, все получилось благодаря rand.nextGauss(), не знал о том, что рандом умеет равномерно распределять (стиль нерадномного рандома)

Проблема решена, спасибо :)
 
Сверху