【问题标题】:Why does the spaceship not appear?为什么宇宙飞船没有出现?
【发布时间】:2014-01-22 05:15:25
【问题描述】:

我使用 jmonkeyengine 并从 blendswap 下载了一个宇宙飞船模型并将其转换为 j3o 以使用 jmonkeyengine 加载它,以用于我可以控制飞船和四处旅行的太空场景。然而,宇宙飞船没有装载。太空和行星出现了,但我希望宇宙飞船成为玩家控制的东西,而不是像它出现的第一人称。

我希望宇宙飞船出现,因为我加载它没有错误并将它添加到场景中,但它仍然没有显示。

//add saucer
ufoNode = (Node) assetManager
        .loadModel("usaucer_v01.j3o");      
rootNode.attachChild(ufoNode);

我应该怎么做才能让宇宙飞船出现?该程序是

public class PlanetSimpleTest extends SimpleApplication {

    private PlanetAppState planetAppState;
    private Geometry mark;
    private Node ufoNode;
    private GameCharControl ufoControl;
    Camera cam2;

    public static void main(String[] args){
        AppSettings settings = new AppSettings(true);
        settings.setResolution(1024,768);
        PlanetSimpleTest app = new PlanetSimpleTest();

        app.setSettings(settings);
        //app.showSettings = true;
        app.start();
    }

    @Override
    public void simpleInitApp() {
        // Only show severe errors in log
        java.util.logging.Logger.getLogger("com.jme3").setLevel(java.util.logging.Level.SEVERE);

        // Toggle mouse cursor
        inputManager.addMapping("TOGGLE_CURSOR", 
                new MouseButtonTrigger(MouseInput.BUTTON_LEFT),
                new KeyTrigger(KeyInput.KEY_SPACE));
        inputManager.addListener(actionListener, "TOGGLE_CURSOR"); 
        // Toggle wireframe
        inputManager.addMapping("TOGGLE_WIREFRAME", 
            new KeyTrigger(KeyInput.KEY_T));
        inputManager.addListener(actionListener, "TOGGLE_WIREFRAME");
        // Collision test
        inputManager.addMapping("COLLISION_TEST", 
            new MouseButtonTrigger(MouseInput.BUTTON_RIGHT));
        inputManager.addListener(actionListener, "COLLISION_TEST"); 

        // Setup camera

        // In orbit
        this.getCamera().setLocation(new Vector3f(0f, 0f, 180000f));

        // On surface
        //this.getCamera().setLocation(new Vector3f(-6657.5254f, 27401.822f, 57199.777f));
        //this.getCamera().lookAtDirection(new Vector3f(0.06276598f, 0.94458306f, -0.3222158f), Vector3f.UNIT_Y);

        // Add sun
        //PointLight sun = new PointLight();
        //sun.setPosition(new Vector3f(-100000f,0,180000f));
        DirectionalLight sun = new DirectionalLight();
        sun.setDirection(new Vector3f(-.1f, 0f, -1f));
        sun.setColor(new ColorRGBA(0.75f,0.75f,0.75f,1.0f));      
        rootNode.addLight(sun);

        // Add sky
        Node sceneNode = new Node("Scene");
        sceneNode.attachChild(Utility.createSkyBox(this.getAssetManager(), "Textures/blue-glow-1024.dds"));
        rootNode.attachChild(sceneNode);

        // Create collision test mark
        Sphere sphere = new Sphere(30, 30, 5f);
        mark = new Geometry("mark", sphere);
        Material mark_mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mark_mat.setColor("Color", ColorRGBA.Red);
        mark.setMaterial(mark_mat);

        // Add planet app state
        planetAppState = new PlanetAppState(rootNode, sun);
        stateManager.attach(planetAppState);

        // Add planet
        FractalDataSource planetDataSource = new FractalDataSource(4);
        planetDataSource.setHeightScale(900f);
        Planet planet = Utility.createEarthLikePlanet(getAssetManager(), 63710.0f, null, planetDataSource);
        planetAppState.addPlanet(planet);
        rootNode.attachChild(planet);

        // Add moon
        FractalDataSource moonDataSource = new FractalDataSource(5);
        moonDataSource.setHeightScale(300f);
        Planet moon = Utility.createMoonLikePlanet(getAssetManager(), 20000, moonDataSource);
        planetAppState.addPlanet(moon);
        rootNode.attachChild(moon);
        moon.setLocalTranslation(-150000f, 0f, 0f);

        //add saucer
        ufoNode = (Node) assetManager
                .loadModel("usaucer_v01.j3o");
        ufoNode.setLocalScale(100f);
        rootNode.attachChild(ufoNode);

    }

    @Override
    public void simpleUpdate(float tpf) {        
        // slow camera down as we approach a planet
        Planet planet = planetAppState.getNearestPlanet();
        if (planet != null && planet.getPlanetToCamera() != null) {
            this.getFlyByCamera().setMoveSpeed(
                    FastMath.clamp(planet.getDistanceToCamera(), 100, 100000));
        }     
    }

    private ActionListener actionListener = new ActionListener(){
        public void onAction(String name, boolean pressed, float tpf){     
            if (name.equals("TOGGLE_CURSOR") && !pressed) {
                if (inputManager.isCursorVisible()) {
                    inputManager.setCursorVisible(false);
                } else {
                    inputManager.setCursorVisible(true);
                }
            }
            if (name.equals("TOGGLE_WIREFRAME") && !pressed) {
                for (Planet planet: planetAppState.getPlanets()) {
                    planet.toogleWireframe();
                }
            }
            if (name.equals("COLLISION_TEST") && !pressed) {
                CollisionResults results = new CollisionResults();
                Ray ray = new Ray(cam.getLocation(), cam.getDirection());

                // Test collision with closest planet's terrain only
                planetAppState.getNearestPlanet().getTerrainNode().collideWith(ray, results);

                System.out.println("----- Collisions? " + results.size() + "-----");
                for (int i = 0; i < results.size(); i++) {
                  // For each hit, we know distance, impact point, name of geometry.
                  float dist = results.getCollision(i).getDistance();
                  Vector3f pt = results.getCollision(i).getContactPoint();
                  String hit = results.getCollision(i).getGeometry().getName();
                  System.out.println("* Collision #" + i);
                  System.out.println("  You shot " + hit + " at " + pt + ", " + dist + " wu away.");
                }

                if (results.size() > 0) {
                  // The closest collision point is what was truly hit:
                  CollisionResult closest = results.getClosestCollision();
                  // Let's interact - we mark the hit with a red dot.
                  mark.setLocalTranslation(closest.getContactPoint());
                  rootNode.attachChild(mark);
                } else {
                  // No hits? Then remove the red mark.
                  rootNode.detachChild(mark);
                }
            }  
        }
    }; 

}

我从here拿来的宇宙飞船并转换成jme3:s二进制格式j3o并添加到游戏中,但我显然没有尽一切努力让它出现在场景中。我在 jmonkeyengine IDE 中已经做到了这一点,但是当我在 Eclipse 中加载它时它不起作用,所以我首先尝试使用 jmonkeyengine IDE 创建场景。

然后我尝试使用宇宙飞船创建场景,但在 JME SDK 中出现异常。

添加行后

ufoNode.setLocalScale(300f);
ufoNode.setLocalTranslation((new Vector3f(10f, 10f, 180010f)));

宇宙飞船确实出现了,但可能并不完美。可以改进吗?

更新 140104 17:54 CET

看来宇宙飞船是颠倒的(?)所以我现在把它旋转了。

//add saucer
ufoNode = (Node) assetManager.loadModel("usaucer_v01.j3o");
ufoNode.setLocalScale(1000f);
ufoNode.setLocalTranslation((new Vector3f(10f, 10f, 165000f)));

/* This quaternion stores a 180 degree rolling rotation */ 
Quaternion roll180 = new Quaternion(); 
roll180.fromAngleAxis(FastMath.PI , new Vector3f(0,0,1)); 
/* The rotation is applied: The object rolls by 180 degrees. */ 
ufoNode.setLocalRotation(roll180);      
rootNode.attachChild(ufoNode);  

【问题讨论】:

  • 倒置?仿佛空间里有起有落。 :) 但是在最后一张照片中它是颠倒的。底部的白色结构用于从表面上下传送东西。 myadoftheday.com/portfolio/item/ufo

标签: java 3d blender jmonkeyengine


【解决方案1】:

您将宇宙飞船添加到0,0,0(因为您没有移动它),但已将您的相机移动到0f, 0f, 180000f。很可能它没有拍摄或太小而无法看到。

尝试在 jME SDK 中加载宇宙飞船,并使用那里的场景编辑器确认它在引擎中工作。

如果可行,请尝试一个简单的测试场景,只需将宇宙飞船和相机放入其中 - 然后一旦可行,一次向您想要的设置移动一步。

【讨论】:

  • 你是对的!现在,当我添加行 ufoNode.setLocalScale(300f); 时,宇宙飞船出现了。 ufoNode.setLocalTranslation((new Vector3f(10f, 10f, 180010f)));` 请查看更新后的问题并告诉我是否可以改进。
  • 如何改进?如果您有一个新问题,请将其作为一个新问题发布 - 并具体说明您正在尝试做什么,您尝试过什么等 :)
猜你喜欢
  • 2011-01-30
  • 1970-01-01
  • 2010-10-24
  • 2012-12-14
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多