Java Libgdx-如何旋转3d粒子的发射轨迹

Java Libgdx-如何旋转3d粒子的发射轨迹,java,libgdx,particles,particle-system,Java,Libgdx,Particles,Particle System,我在使用libGDX三维粒子时遇到了一个问题 我想改变粒子发射的方向 我试过了 effect.rotate(new Vector3(0, 1, 0)); 当我的粒子从点(1,0,1)开始,发射朝-x方向; 它仅旋转粒子的繁殖点,而不旋转发射粒子的方向 我也尝试了matrix4方法 targetMatrix.idt(); targetMatrix.setToRotation(...); 及 然而,他们中没有一个人做了我想让它做的事。我在尝试制作一个简单的火球效果时也遇到了这个问题。旋转或对效果

我在使用libGDX三维粒子时遇到了一个问题

我想改变粒子发射的方向

我试过了

effect.rotate(new Vector3(0, 1, 0));
当我的粒子从点(1,0,1)开始,发射朝-x方向; 它仅旋转粒子的繁殖点,而不旋转发射粒子的方向

我也尝试了matrix4方法

targetMatrix.idt();
targetMatrix.setToRotation(...);


然而,他们中没有一个人做了我想让它做的事。

我在尝试制作一个简单的火球效果时也遇到了这个问题。旋转或对效果所做的任何变换都不会做你不想做的事情,不要问我为什么这只是3d粒子系统的一个奇怪的事情

你能做的就是得到效果的发射器,然后手动改变θ和φ的角度。我现在无法访问我的代码,但如果需要,可以给您一个示例。但是一旦你找到了这两个角度,你就可以让粒子向你不想发射的任何方向发射

这就是我初始化火球效果的方式。θ和φ的角度可以改变每一个滴答声,这将解决你的问题

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");
        }
你会感兴趣的

编辑:有关在代码中设置θ和φ角度的相关代码,请参见下文

 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);
        }
dynamicinfluencer di=effect.getControllers().get(i).findInfluencer(dynamicinfluencer.class);
动态修改器dm;
对于(int j=0;j
请给我举个例子,我不明白“手动更改θ和φ角度”是什么意思。你的意思是在粒子编辑器中更改它们,然后为每个角度创建许多单独的文件。或者有没有办法在代码中更改它们?我的意思是在代码中更改它们,例如,在更新方法中每勾一次就这样做。你可以在动态影响器中找到phi和θ。什么是“skillInfo”,什么是“Assets.AssetManager”?我不明白它们是什么?那是因为我只是从我的代码中撕下它,它不仅仅是编辑效果,只是忽略它。添加了一个编辑,其中包含效应器角度的相关代码GetAngleAroundy(方向)这是什么?
                    ((PolarAcceleration) dm).phiValue.setHigh(90 - 0.5f * phiSpread, 90 + 0.5f * phiSpread);


                    ((PolarAcceleration) dm).thetaValue.setHigh(angle - thetaSpread * 0.5f, angle + thetaSpread * 0.5f);
 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);
        }