اخواني الاعزاء ..السلام عليكم ورحمة الله وبركاته
في هذا الكود استطعت تحريك المكعب ولكني لم استطيع السيطرة على المسار
اريد تحريكه بحيث يبدأ وينتهي من نفس النقطة ويكون مساره مربع يعني لما يوصل لاخر الشاشة اريده ان يلتف ويكمل مساره وهكذا
الكود المختص بالتحريك موجود في
method اسمها display
package org.yourorghere;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.media.opengl.*;
import javax.media.opengl.glu.*;
import com.sun.opengl.util.*;
import javax.media.opengl.GLEventListener;
//Tx,, |-|y,,z is the hight
//0000000000000000000000000000000000000000000000000
public class RotateBox extends JFrame implements GLEventListener,MouseListener {
private float[][] cubeData = { {-1.0f, -0.4f, 0.3f}, {1.0f, -0.4f, 0.3f},
{1.0f, 0.4f, 0.3f}, {-1.0f, 0.4f, 0.3f}, {-1.0f, -0.4f, -0.3f},
{1.0f, -0.4f, -0.3f}, {1.0f, 0.4f, -0.3f}, {-1.0f, 0.4f, -0.3f}};
private FPSAnimator animator;
private float param = 0f, paramDelta = 0f;
private GLCanvas canvas;
public RotateBox() {
super("JOGL");
canvas = new GLCanvas();
canvas.addGLEventListener(this);
canvas.addMouseListener(this);
animator = new FPSAnimator(canvas, 60);
getContentPane().add(canvas);
this.add(canvas, BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static String formatDouble(double a)
{
DecimalFormat f = new DecimalFormat("0.##");
return f.format(a, new StringBuffer(""), new FieldPosition(0)).toString(
);
}
public Dimension getPreferredSize() {
return new Dimension (1024, 768);
}
public static void main (String[] args) {
JFrame f = new RotateBox();
f.pack();
f.setVisible(true);
}
//0000000000000000000000000000000000000000000000000000000000
public void drawFloor(GL gl)
{
//--------------------------------------------------------------
// Parametric
double sx = 0.1; // Size of each tile in x direction
double sy = 0.1; // Size of each tile in y direction
int nx = 250; // Number of tiles in the x direction
int ny = 250; // Number of tiles in the y direction
// Temporary variable
double x;
double y;
int i; //counter
int k; //counter
gl.glShadeModel(gl.GL_SMOOTH);
gl.glBegin(GL.GL_TRIANGLES);
/*y*/ for ( i = 0, y = -((double)ny)/2*sy ; i < ny ; i++, y += sy ) {
/*x*/ for ( k = 0, x = -((double)nx)/2*sx; k < nx ; k++, x += sx ) {
gl.glNormal3d(0, 0, 1);
// Draw first triangle in the tile
gl.glColor3d(1, 1, 1);
gl.glVertex3d(x, y, -0.1);
gl.glVertex3d(x+sx, y, -0.1);
gl.glVertex3d(x, y+sy, -0.1);
// Draw second triangle in the tile
gl.glColor3d(1, 1, 1);
gl.glVertex3d(x+sx, y+sy, -0.1);
gl.glVertex3d(x, y+sy, -0.1);
gl.glVertex3d(x+sx, y, -0.1);
}
}
gl.glEnd();
}
//0000000000000000000000000000000000000000
/** Called by drawable to initiate drawing */
public void display(GLAutoDrawable drawable) {
//- 1/3: Draw background -------------------------------------------
GL gl = drawable.getGL();
gl.glClearColor(0, 0, 0, 1);
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glColor3d(1, 1, 1);
//- 2/3: Configure Camera ------------------------------------------
GLU glu = new GLU();
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(60, 1, 0.1, 100);
glu.gluLookAt(8, 8, 8, 0, 0, 0, 0, 0, 1);
//- 3/3: Generate geometric primitives for current scene -----------------------------------
drawFloor(gl);
gl.glDisable(gl.GL_LIGHTING); //LIGHT
//-------------moving the box-----------
gl.glTranslatef(-2.0f,-6.0f,1.0f);
gl.glPushMatrix();
gl.glTranslatef(param,0.0f,1.0f);
gl.glRotatef(param, 0.0f, 0.0f, 1.0f);
gl.glBegin(GL.GL_QUADS);
gl.glColor3f(0.8f,0.0f,0.0f);
gl.glVertex3fv(cubeData[0],0);
gl.glVertex3fv(cubeData[1],0);
gl.glVertex3fv(cubeData[2],0);
gl.glVertex3fv(cubeData[3],0);
gl.glVertex3fv(cubeData[5],0);
gl.glVertex3fv(cubeData[4],0);
gl.glVertex3fv(cubeData[7],0);
gl.glVertex3fv(cubeData[6],0);
gl.glVertex3fv(cubeData[3],0);
gl.glVertex3fv(cubeData[2],0);
gl.glVertex3fv(cubeData[6],0);
gl.glVertex3fv(cubeData[7],0);
gl.glVertex3fv(cubeData[4],0);
gl.glVertex3fv(cubeData[0],0);
gl.glVertex3fv(cubeData[3],0);
gl.glVertex3fv(cubeData[7],0);
gl.glNormal3f(1.0f,0.0f,0.0f);
gl.glVertex3fv(cubeData[1],0);
gl.glVertex3fv(cubeData[5],0);
gl.glVertex3fv(cubeData[6],0);
gl.glVertex3fv(cubeData[2],0);
gl.glNormal3f(0,-1.0f,0.0f);
gl.glVertex3fv(cubeData[4],0);
gl.glVertex3fv(cubeData[5],0);
gl.glVertex3fv(cubeData[1],0);
gl.glVertex3fv(cubeData[0],0);
gl.glEnd();
gl.glPopMatrix();
gl.glFlush();
movement();
}
//000000000000000000000000000000000000000000000000000
/** Not used method, but needed to instanciate GLEventListener */
public void init(GLAutoDrawable drawable) {
animator.start();
GL gl = drawable.getGL();
System.err.println("INIT GL IS: " + gl.getClass().getName());
// Enable VSync
gl.setSwapInterval(1);
// Setup the drawing area and shading mode
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glShadeModel(GL.GL_SMOOTH);
gl.glMatrixMode( GL.GL_MODELVIEW );
gl.glLoadIdentity();
}
/** Not used method, but needed to instanciate GLEventListener */
public void displayChanged(GLAutoDrawable drawable, boolean a, boolean b) {
;
}
//000000000000000000000000000000000000000000000
/** Called to indicate the drawing surface has been moved and/or resized */
public void reshape (GLAutoDrawable drawable,
int x,
int y,
int width,
int height) {
GL gl = drawable.getGL();
gl.glViewport(0, 0, width, height);
canvas.requestFocusInWindow();
}
//000000000000000000000000000000000000
//000000000000000000000000000000000000000000000000000
private void movement()
{
param = param + paramDelta;//spin = spin + 0.01f ; //for slow translation
//paramY=paramY+0.02f;
if (param > 60f) param = param - 60;//if (param > 360f) param = param - 360;
}
//000000000000000000000000000000000000000000000000000000
public void mouseClicked(MouseEvent key)
{
}
public void mousePressed(MouseEvent mouse)
{
switch (mouse.getButton()) {
case MouseEvent.BUTTON1:
paramDelta = 3.0f;//0.2
break;
case MouseEvent.BUTTON2:
case MouseEvent.BUTTON3:
paramDelta = 0f;
break;
}
}
public void mouseReleased(MouseEvent mouse)
{
}
public void mouseEntered(MouseEvent mouse)
{
}
public void mouseExited(MouseEvent mouse)
{
}
}//End of Class!!

