Libgdx - 如何旋转3d粒子的emmition轨迹

时间:2015-03-20 13:57:49

标签: java libgdx particles particle-system

使用libGDX 3D粒子时遇到问题。

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

我试过

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

当我的粒子从点(1,0,1)开始,并且发射朝向-x; 它只旋转粒子的生成点,但不旋转发射粒子的方向

我也试过了matrix4方式

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

targetMatrix.rotate(...);
然而,他们都没有做我想做的事。

1 个答案:

答案 0 :(得分:3)

我有这个问题,试图做一个简单的火球效果。旋转或对效果进行的任何变换都不会做你想做的事情,不要问我为什么它只是关于三维粒子系统的一个奇怪的事情。

你可以做的是获得效果的发射器并手动改变θ和φ角度。我现在无权访问我的代码,但如果需要可以给你一个例子。但是一旦找到这两个角度就可以使粒子向任何方向发射。

这是我初始化火球效果的方法。每个刻度都可以改变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);
        }