⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 model3dlayer.java

📁 world wind java sdk load 3D model
💻 JAVA
字号:
/*
 * Model3DLayer.java
 *
 * Created on February 12, 2008, 10:49 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package test;

import gov.nasa.worldwind.geom.Angle;
import gov.nasa.worldwind.geom.Position;
import gov.nasa.worldwind.geom.Vec4;
import gov.nasa.worldwind.layers.AbstractLayer;
import gov.nasa.worldwind.render.DrawContext;
import java.util.Iterator;
import java.util.Vector;
import javax.media.opengl.GL;

/**
 *
 * @author RodgersGB
 */
public class Model3DLayer extends AbstractLayer {
    private Vector list;
    
    /** Creates a new instance of Model3DLayer */
    public Model3DLayer() {
        list = new Vector();
    }

    public void addModel(WWModel3D model) {
        list.add(model);
    }
    
    public void removeModel(WWModel3D model) {
        list.remove(model);
    }
    
    protected void doRender(DrawContext dc) {
        try {
            beginDraw(dc);
            Iterator<WWModel3D> it = list.iterator();
            while (it.hasNext())
                draw(dc, it.next());
        }
        // handle any exceptions
        catch (Exception e) {
            // handle
            e.printStackTrace();
        }
        // we must end drawing so that opengl
        // states do not leak through.
        finally {
            endDraw(dc);
        }
    }
    
    // draw this layer
    protected void draw(DrawContext dc, WWModel3D model) {
        GL gl = dc.getGL();
        Position pos = model.getPosition();
        Vec4 loc = dc.getGlobe().computePointFromPosition(pos);
        double size = this.computeSize(dc, loc);
        
        dc.getView().pushReferenceCenter(dc, loc);
        gl.glRotated(pos.getLongitude().degrees, 0,1,0);
        gl.glRotated(-pos.getLatitude().degrees, 1,0,0);
        gl.glScaled(size, size, size);
        gl.glCallList(Model3DisplayListFactory.getModel(gl, model.getPath()));
        dc.getView().popReferenceCenter(dc);
    }
    
    // puts opengl in the correct state for this layer
    protected void beginDraw(DrawContext dc) {
        GL gl = dc.getGL();
        
        gl.glPushAttrib(GL.GL_TEXTURE_BIT |
                        GL.GL_ENABLE_BIT |
                        GL.GL_CURRENT_BIT |
                        GL.GL_TRANSFORM_BIT);
        
        if(!dc.isPickingMode()) {
            gl.glEnable(GL.GL_BLEND);
            gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
        }
        
        gl.glMatrixMode(javax.media.opengl.GL.GL_MODELVIEW);
        gl.glPushMatrix();
    }
    
    // resets opengl state
    protected void endDraw(DrawContext dc) {
        GL gl = dc.getGL();
        
        gl.glMatrixMode(javax.media.opengl.GL.GL_MODELVIEW);
        gl.glPopMatrix();
        
        gl.glPopAttrib();
    }
    
    private double computeSize(DrawContext dc, Vec4 loc) {
        if (loc == null) {
            System.err.println("Null location when computing size of model");
            return 1;
        }
        double d = loc.distanceTo3(dc.getView().getEyePoint());
        double size = 60 * dc.getView().computePixelSizeAtDistance(d);
        if (size < 2)
            size = 2;
        
        return size;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -