Libgdx - 如何旋转3D粒子的发射路径?

4

我在使用libGDX 3D粒子时遇到了一个问题。

我想改变粒子发射的方向。

我尝试过

effect.rotate(new Vector3(0, 1, 0));

当我的粒子从点(1, 0, 1)开始,并且发射方向朝-x时; 这只是旋转了粒子的生成点,而没有改变发射粒子的方向。
我还尝试了matrix4的方法。
targetMatrix.idt();
targetMatrix.setToRotation(...);

并且

targetMatrix.rotate(...);

然而,它们中没有一个能够满足我的需求。
1个回答

3
我也遇到了同样的问题,试图制作一个简单的火球效果。对效果进行的旋转或任何变换都不会按照你想要的方式进行,请不要问我为什么,这只是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");
        }

地点:

                    ((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);
        }

请给我一个例子,我不明白您所说的“手动更改theta和phi角度”的意思。您是指在粒子编辑器中更改它们,然后为每个角度创建许多单独的文件吗?还是有一种方法可以在代码中更改它们? - Fish
我的意思是在你的代码中更改它们,例如在更新方法中每个tick执行。您可以在动态影响器中找到phi和theta。 - Andreas Toresäter
什么是“skillInfo”,以及什么是“Assets.assetsManager”?我不明白它们是什么? - Fish
那是因为我刚从我的代码中提取出来的,它不仅仅编辑效果,可以忽略它。添加了一个编辑,包含了效果角度的相关代码。 - Andreas Toresäter
getAngleAroundY(direction) 这是什么? - lacas
那只是一个帮助方法,用于获取我想使用的角度。只需忽略它,而是查看下面的代码。编辑: - Andreas Toresäter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接