?? model3dlayer.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 + -