Всем доброго времени суток! У меня задание нарисовать динамическую 3-х мерную систему земля-луна с затенением земли луной и наоборот. С первой частью - нарисовать планету со спутником, натянуть текстуры и заставить их передвигаться по орбитам я сделал. но со вторым я в растерянности. Прошу помощи реализовать затенение. код 4-х классов: код правда ужасный , переделывать не успеваю, так как преподаватель вдруг затребовал на этой неделе сдать работы. И еще кажется нужно исправить отображение фона, а то он как-то некорректно выводится.. но это все потом. Буду очень рад, если поможете написать класс отрисовки теней.
ЗЫ. Просьба не отсылать к мануалам, так как на их изучение нужно время которого у меня сейчас и так мало Главный класс
| Код | package Pack_class;
import java.awt.BorderLayout; import javax.media.opengl.DebugGL; import javax.media.opengl.GL; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCanvas; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLEventListener; import javax.media.opengl.glu.GLU; import javax.swing.JFrame;
import com.sun.opengl.util.FPSAnimator; import com.sun.opengl.util.texture.Texture;
/** SniyLSD 24.01.11 */ public class Kursovik extends GLCanvas implements GLEventListener {
/** Serial version UID. */ private static final long serialVersionUID = 1L;
/** The GL unit (helper class). */ private GLU glu;
/** The frames per second setting. */ private int fps = 60;
/** The OpenGL animator. */ private FPSAnimator animator;
private Texture earthTexture; private Texture moonTexture; private Texture backgr; public Kursovik(GLCapabilities capabilities, int width, int height) { addGLEventListener(this); }
private static GLCapabilities createGLCapabilities() { GLCapabilities capabilities = new GLCapabilities(); capabilities.setRedBits(8); capabilities.setBlueBits(8); capabilities.setGreenBits(8); capabilities.setAlphaBits(8); return capabilities; }
public void init(GLAutoDrawable drawable) { drawable.setGL(new DebugGL(drawable.getGL())); final GL gl = drawable.getGL();
// Enable z- (depth) buffer for hidden surface removal. gl.glEnable(GL.GL_DEPTH_TEST); gl.glDepthFunc(GL.GL_LEQUAL);
// Enable smooth shading. gl.glShadeModel(GL.GL_SMOOTH);
// Define "clear" color. gl.glClearColor(0f, 0f, 0f, 0f);
// We want a nice perspective. gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
// Create GLU. glu = new GLU();
// Load earth texture. earthTexture = LoadTexture.Load("earth.jpg"); moonTexture = LoadTexture.Load("moon.jpg"); backgr = LoadTexture.Load("stars.jpg"); // Start animator. animator = new FPSAnimator(this, fps); animator.start(); }
public void display(GLAutoDrawable drawable) { if (!animator.isAnimating()) { return; } final GL gl = drawable.getGL(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
// Set camera. setCamera(gl, glu, 30, 0, 0); // Prepare light parameters. float SHINE_ALL_DIRECTIONS = 0; float[] lightPos = {50, 0, 0, SHINE_ALL_DIRECTIONS}; float[] lightColorAmbient = {0.2f, 0.2f, 0.2f, 1f}; float[] lightColorSpecular = {0.8f, 0.8f, 0.8f, 1f};
// Set light parameters. gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, lightPos, 0); gl.glLightfv(GL.GL_LIGHT1, GL.GL_AMBIENT, lightColorAmbient, 0); gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR, lightColorSpecular, 0);
// Enable lighting in GL. gl.glEnable(GL.GL_LIGHT1); gl.glEnable(GL.GL_LIGHTING);
// Set material properties. float[] rgba = {1f, 1f, 1f}; gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, rgba, 0); gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, rgba, 0); gl.glMaterialf(GL.GL_FRONT, GL.GL_SHININESS, 0.5f); Background.DrawBackground(backgr, gl); Planets.DrawPlanetEarth(earthTexture, gl, glu); Planets.DrawPlanetMoon(moonTexture, gl, glu, true); }
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { final GL gl = drawable.getGL(); gl.glViewport(0, 0, width, height); }
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) { throw new UnsupportedOperationException("Changing display is not supported."); }
private void setCamera(GL gl, GLU glu, float distance, float x, float y) { // Change to projection matrix. gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity();
// Perspective. float widthHeightRatio = (float) getWidth() / (float) getHeight(); glu.gluPerspective(60, widthHeightRatio, 1, 1000); glu.gluLookAt(30,0 ,-20, 0, 0, 0, 0, 0, -1);
// Change back to model view matrix. gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); }
public final static void main(String[] args) { GLCapabilities capabilities = createGLCapabilities(); Kursovik canvas = new Kursovik(capabilities, 800,600); JFrame frame = new JFrame("Курсовая работа system Earth-Moon, Moon shadow"); frame.getContentPane().add(canvas, BorderLayout.CENTER); frame.setSize(800, 600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); canvas.requestFocus(); } }
|
Класс Background
| Код | package Pack_class;
import javax.media.opengl.GL;
import com.sun.opengl.util.texture.Texture;
public class Background { public static void DrawBackground(Texture background, GL gl){ gl.glMatrixMode(GL.GL_PROJECTION); gl.glPushMatrix(); gl.glOrtho(0, 1, 0, 1, 0, 1);
gl.glMatrixMode(GL.GL_MODELVIEW); gl.glPushMatrix(); gl.glLoadIdentity(); // No depth buffer writes for background. gl.glDepthMask( false ); gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT); gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT); gl.glBindTexture( GL.GL_TEXTURE_2D, background.getTextureObject() ); gl.glBegin( GL.GL_QUADS ); gl.glTexCoord2f( -500f, -500f ); gl.glVertex2f( -500f, -500f ); gl.glTexCoord2f( -500f, 500f ); gl.glVertex2f( -500f, 500f ); gl.glTexCoord2f( 500f, 500f ); gl.glVertex2f( 500f, 500f ); gl.glTexCoord2f( 500f, -500f ); gl.glVertex2f( 500f, -500f ); gl.glEnd();
gl.glDepthMask( true );
gl.glPopMatrix(); gl.glMatrixMode(GL.GL_PROJECTION); gl.glPopMatrix(); gl.glMatrixMode(GL.GL_MODELVIEW); }
}
|
Класс LoadTexture
| Код | package Pack_class;
import java.io.File; import java.io.IOException;
import com.sun.opengl.util.texture.Texture; import com.sun.opengl.util.texture.TextureIO;
public class LoadTexture {
public static Texture Load (String name){ Texture texture = null; try { texture = TextureIO.newTexture(new File(name), false); } catch (IOException e) { System.out.println("Ошибка открытия файла " + name); System.out.println(e); } return texture; }
}
|
Класс Planets
| Код | package Pack_class;
import javax.media.opengl.GL; import javax.media.opengl.glu.GLU; import javax.media.opengl.glu.GLUquadric;
import com.sun.opengl.util.texture.Texture;
public class Planets { private static float satelliteAngle = 0; public static void DrawPlanetEarth(Texture earthTexture, GL gl, GLU glu){ long millis = System.currentTimeMillis(); double earth1 = (double) (millis % 1000000) / 100000 * 360; earthTexture.enable(); earthTexture.bind(); gl.glPushMatrix(); GLUquadric earth = glu.gluNewQuadric(); gl.glRotated(earth1, 0, 0,-1); glu.gluQuadricTexture(earth, true); glu.gluQuadricDrawStyle(earth, GLU.GLU_FILL); glu.gluQuadricNormals(earth, GLU.GLU_FLAT); glu.gluQuadricOrientation(earth, GLU.GLU_OUTSIDE); float radius = 6.378f; int slices = 128; int stacks = 128; glu.gluSphere(earth, radius, slices, stacks); glu.gluDeleteQuadric(earth); gl.glPopMatrix(); } public static void DrawPlanetMoon(Texture moonTexture, GL gl, GLU glu, boolean light){ moonTexture.bind(); gl.glPushMatrix(); long millis = System.currentTimeMillis(); double moon1 = (double) (millis % 100) / 100000 * 360; // Compute satellite position. satelliteAngle = (float) ((satelliteAngle - 0.25) % 360f); float distance = 20.000f; if (!light){ distance = 6.f;} float x = (float) Math.sin(Math.toRadians(satelliteAngle)) * distance; float y = (float) Math.cos(Math.toRadians(satelliteAngle)) * distance; float z = 0; gl.glTranslatef(x, y, z); gl.glRotatef(satelliteAngle, 0, 0, -1); gl.glRotatef(45f, 0, 0, 0); if (light) { gl.glEnable (GL.GL_LIGHTING); gl.glEnable (GL.GL_LIGHT0); gl.glColor3d(1, 0.3, 0.5); } GLUquadric moon = glu.gluNewQuadric(); gl.glRotated(moon1, 0, 0,-0.2); glu.gluQuadricTexture(moon, light); glu.gluQuadricDrawStyle(moon, GLU.GLU_FILL); glu.gluQuadricNormals(moon, GLU.GLU_FLAT); glu.gluQuadricOrientation(moon, GLU.GLU_OUTSIDE); float radius = 1.6f; int slices = 64; int stacks = 64; glu.gluSphere(moon, radius, slices, stacks); glu.gluDeleteQuadric(moon); if (light){ gl.glDisable (GL.GL_LIGHT0); gl.glDisable (GL.GL_LIGHTING); } gl.glPopMatrix(); }
}
|
Если будет нужно, я прикреплю файлы проекта (писалось все это в EasyEclipse Desktop Java) |