【问题标题】:Libgdx - how to rotate the emmition trail of a 3d particleLibgdx - 如何旋转 3d 粒子的发射轨迹
【发布时间】:2015-05-23 23:08:39
【问题描述】:

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

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

我试过了

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

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

我也试过matrix4方式

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

targetMatrix.rotate(...);

然而他们都没有做我想做的事。

【问题讨论】:

    标签: java libgdx particles particle-system


    【解决方案1】:

    我在制作简单的火球效果时也遇到了这个问题。对效果进行的旋转或任何变换都不会做你不想做的事情,不要问我为什么这只是 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);
            }
    

    【讨论】:

    • 请举个例子,我不明白“手动更改 theta 和 phi 角”是什么意思。您的意思是在粒子编辑器中更改它们,然后为每个角度创建许多单独的文件。或者有没有办法在代码中改变它们?
    • 我的意思是在你的代码中改变它们,例如在更新方法中的每一个刻度。您可以在动态影响者中找到 phi 和 theta。
    • 什么是“skillInfo”,什么是“Assets.assetsManager”?我不明白它们是什么?
    • 那是因为我只是从我的代码中撕下它,而不仅仅是编辑效果,只是忽略它。为效果的角度添加了相关代码的编辑
    • getAngleAroundY(direction) 这是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多