简体   繁体   English

为什么宇宙飞船没有出现?

[英]Why does the spaceship not appear?

I use jmonkeyengine and I downloaded a spaceship model from blendswap and converted it to j3o to load it with jmonkeyengine for a space scene where I can control the ship and travel around. 我使用了jmonkeyengine,我从blendswap下载了一个宇宙飞船模型并将其转换为j3o,用jmonkeyengine加载它,用于我可以控制船只和四处旅行的空间场景。 However the spaceship is not loaded. 但是太空船没有加载。 The space and planets appear but I want the spaceship to be what the player controls and not first-person like it appears. 空间和行星出现,但我希望宇宙飞船是玩家控制的,而不是像它出现的第一人称。

在此输入图像描述

I expect the spaceship to appear because I load it without errors and add it to the scene but it stil doesn't show. 我希望太空飞船出现是因为我加载它没有错误并将其添加到场景但它没有显示。

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

What should I do to make the spaceship appear? 我该怎么办才能让宇宙飞船出现? The program is 该计划是

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

}

The spaceship I took from here and converted to jme3:s binary format j3o and added to the game, but I'm obviously not doing everything to make it appear in the scene. 我从这里拿走了太空船并转换成jme3:s二进制格式j3o并添加到游戏中,但我显然没有做任何事情让它出现在场景中。 I've gotten this far in the jmonkeyengine IDE but then when I load it in Eclipse it doesn't work so I'm trying to create the scene with the jmonkeyengine IDE first. 我已经在jmonkeyengine IDE中实现了这一点,但是当我在Eclipse中加载它时它不起作用所以我试图首先使用jmonkeyengine IDE创建场景。

在此输入图像描述

I then try and create a scene with the spaceship but I get an Exception in the JME SDK. 然后我尝试用太空船创建一个场景,但我在JME SDK中得到了一个例外。

在此输入图像描述

After adding the lines 添加行后

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

the spaceship does appear but maybe not perfect. 宇宙飞船确实出现但可能并不完美。 Can it be improved? 可以改进吗?

在此输入图像描述

在此输入图像描述

Update 140104 17:54 CET 更新140104 17:54 CET

It seems the spaceship was upside down(?) so I've rotated it now. 宇宙飞船似乎颠倒了(?)所以我现在已经旋转了它。

在此输入图像描述

//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);  

You add the spaceship at 0,0,0 (as you don't move it) but have moved your camera to 0f, 0f, 180000f . 您将太空船添加到0,0,0 (因为您不移动它)但将相机移动到0f, 0f, 180000f Most likely it is out of shot or far too small to see. 最有可能是它没有射击或太小而无法看到。

Try loading the spaceship within the jME SDK and confirm that it works within the engine using the scene editor there. 尝试在jME SDK中加载宇宙飞船,并使用场景编辑器确认它在引擎内工作。

If that works then try a simple test scene just dropping the spaceship and camera in - then once that works move a step at a time towards your desired setting. 如果这样可行,那么尝试一个简单的测试场景,只需将宇宙飞船和摄像机放入 - 然后一旦工作,一次向您想要的设置移动一步。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM