Libgdx - 如何旋转 3d 粒子的发射轨迹
Libgdx - how to rotate the emmition trail of a 3d particle
我在使用 libGDX 3D 粒子时遇到问题。
我想改变粒子发射的方向。
我试过了
effect.rotate(new Vector3(0, 1, 0));
当我的粒子从点 (1, 0, 1) 开始,并且发射朝向 -x;
它只旋转了粒子的生成点而不是发射粒子的方向
我也试过matrix4方式
targetMatrix.idt();
targetMatrix.setToRotation(...);
和
targetMatrix.rotate(...);
然而 none 他们做了我想让它做的事情。
我在尝试制作简单的火球效果时也遇到了这个问题。对效果所做的旋转或任何变换不会做你不想做的事,不要问我为什么这只是 3d 粒子系统的奇怪事情之一。
您可以做的是获取效果的发射器并手动更改 theta 和 phi 角度。我现在无法访问我的代码,但如果需要可以给你一个例子。但是一旦你找到这两个角度,你就可以让粒子向任何你不想要的方向发射。
这就是我初始化火球效果的方式。 theta 和 phi 角度可以在每个刻度中改变,它会解决你的问题。
effect = Assets.assetManager.get(skillInfo.skillEffect, ParticleEffect.class).copy();
for (int i = 0; i < effect.getControllers().size; i++) {
effect.getControllers().get(i).attached = skillInfo.attached;
if (skillInfo.attached && effect.getControllers().get(i).findInfluencer(DynamicsInfluencer.class) != null) {
// Gdx.app.log("INFO", "FOUND DI");
DynamicsInfluencer di = effect.getControllers().get(i).findInfluencer(DynamicsInfluencer.class);
DynamicsModifier dm;
for (int j = 0; j < di.velocities.size; j++) {
dm = (DynamicsModifier) di.velocities.get(j);
if (dm instanceof PolarAcceleration) {
// horizontal +/- spread
float phiSpread = Math.abs(((PolarAcceleration) dm).phiValue.getHighMax()
- ((PolarAcceleration) dm).phiValue.getHighMin());
((PolarAcceleration) dm).phiValue.setHigh(90 - 0.5f * phiSpread, 90 + 0.5f * phiSpread);
// change to acc in opposite direction of movement
// direction
float angle = getAngleAroundY(direction);
float thetaSpread = Math.abs(((PolarAcceleration) dm).thetaValue.getHighMax()
- ((PolarAcceleration) dm).thetaValue.getHighMin());
((PolarAcceleration) dm).thetaValue.setHigh(angle - thetaSpread * 0.5f, angle + thetaSpread * 0.5f); // rotation
// around
// y-axis
} else {
// Gdx.app.log("INFO", "NO polar acc for: " +
// skillInfo.name);
}
}
} else {
// Gdx.app.log("INFO", "no DI");
}
其中:
((PolarAcceleration) dm).phiValue.setHigh(90 - 0.5f * phiSpread, 90 + 0.5f * phiSpread);
((PolarAcceleration) dm).thetaValue.setHigh(angle - thetaSpread * 0.5f, angle + thetaSpread * 0.5f);
你会感兴趣的部分。
编辑:请参阅下面的与在代码中设置 theta 和 phi 角度相关的代码
DynamicsInfluencer di = effect.getControllers().get(i).findInfluencer(DynamicsInfluencer.class);
DynamicsModifier dm;
for (int j = 0; j < di.velocities.size; j++) {
dm = (DynamicsModifier) di.velocities.get(j);
((PolarAcceleration) dm).phiValue.setHigh(90 - 0.5f * phiSpread, 90 + 0.5f * phiSpread);
((PolarAcceleration) dm).thetaValue.setHigh(angle - thetaSpread * 0.5f, angle + thetaSpread * 0.5f);
}
我在使用 libGDX 3D 粒子时遇到问题。
我想改变粒子发射的方向。
我试过了
effect.rotate(new Vector3(0, 1, 0));
当我的粒子从点 (1, 0, 1) 开始,并且发射朝向 -x; 它只旋转了粒子的生成点而不是发射粒子的方向
我也试过matrix4方式
targetMatrix.idt();
targetMatrix.setToRotation(...);
和
targetMatrix.rotate(...);
然而 none 他们做了我想让它做的事情。
我在尝试制作简单的火球效果时也遇到了这个问题。对效果所做的旋转或任何变换不会做你不想做的事,不要问我为什么这只是 3d 粒子系统的奇怪事情之一。
您可以做的是获取效果的发射器并手动更改 theta 和 phi 角度。我现在无法访问我的代码,但如果需要可以给你一个例子。但是一旦你找到这两个角度,你就可以让粒子向任何你不想要的方向发射。
这就是我初始化火球效果的方式。 theta 和 phi 角度可以在每个刻度中改变,它会解决你的问题。
effect = Assets.assetManager.get(skillInfo.skillEffect, ParticleEffect.class).copy();
for (int i = 0; i < effect.getControllers().size; i++) {
effect.getControllers().get(i).attached = skillInfo.attached;
if (skillInfo.attached && effect.getControllers().get(i).findInfluencer(DynamicsInfluencer.class) != null) {
// Gdx.app.log("INFO", "FOUND DI");
DynamicsInfluencer di = effect.getControllers().get(i).findInfluencer(DynamicsInfluencer.class);
DynamicsModifier dm;
for (int j = 0; j < di.velocities.size; j++) {
dm = (DynamicsModifier) di.velocities.get(j);
if (dm instanceof PolarAcceleration) {
// horizontal +/- spread
float phiSpread = Math.abs(((PolarAcceleration) dm).phiValue.getHighMax()
- ((PolarAcceleration) dm).phiValue.getHighMin());
((PolarAcceleration) dm).phiValue.setHigh(90 - 0.5f * phiSpread, 90 + 0.5f * phiSpread);
// change to acc in opposite direction of movement
// direction
float angle = getAngleAroundY(direction);
float thetaSpread = Math.abs(((PolarAcceleration) dm).thetaValue.getHighMax()
- ((PolarAcceleration) dm).thetaValue.getHighMin());
((PolarAcceleration) dm).thetaValue.setHigh(angle - thetaSpread * 0.5f, angle + thetaSpread * 0.5f); // rotation
// around
// y-axis
} else {
// Gdx.app.log("INFO", "NO polar acc for: " +
// skillInfo.name);
}
}
} else {
// Gdx.app.log("INFO", "no DI");
}
其中:
((PolarAcceleration) dm).phiValue.setHigh(90 - 0.5f * phiSpread, 90 + 0.5f * phiSpread);
((PolarAcceleration) dm).thetaValue.setHigh(angle - thetaSpread * 0.5f, angle + thetaSpread * 0.5f);
你会感兴趣的部分。
编辑:请参阅下面的与在代码中设置 theta 和 phi 角度相关的代码
DynamicsInfluencer di = effect.getControllers().get(i).findInfluencer(DynamicsInfluencer.class);
DynamicsModifier dm;
for (int j = 0; j < di.velocities.size; j++) {
dm = (DynamicsModifier) di.velocities.get(j);
((PolarAcceleration) dm).phiValue.setHigh(90 - 0.5f * phiSpread, 90 + 0.5f * phiSpread);
((PolarAcceleration) dm).thetaValue.setHigh(angle - thetaSpread * 0.5f, angle + thetaSpread * 0.5f);
}