الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تحريك مكعب في مسار معين

بدأه DoDes في 13 يناير 2011 · 3 رد · 1,421 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اخواني الاعزاء ..السلام عليكم ورحمة الله وبركاته

في هذا الكود استطعت تحريك المكعب ولكني لم استطيع السيطرة على المسار

اريد تحريكه بحيث يبدأ وينتهي من نفس النقطة ويكون مساره مربع يعني لما يوصل لاخر الشاشة اريده ان يلتف ويكمل مساره وهكذا

الكود المختص بالتحريك موجود في

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!!
#2

السؤال ليس مفهوما

إلى ماذا ترمي؟

تخيل, هل سيكون مستقبل الأوبن جي أل مع البشرية هكذا

future.jpg
#3

الان المكعب يمشي بخط مستقيم ثم يختفي ثم يظهر من نفس النقطة ويمشي بخط مستقيم هو في الحقيقة بيعمل rotate ولكنه غير ظاهر في output

سؤالي اريد هذا المكعب يتحرك كأنه بياخذ دورة كامله حول الارضية البيضاء .. يعني ما بيعمل دورة حول نفسه وانما حول الارضية (مثل حركة الطواف حول الكعبة) هذا اللي اقصده ولكن الطواف حول الكعبة تسير بشكل دائري انا اريد المكعب يسير بمسار مربع

ان شاء الله يكون سؤالي واضح مع الصورة ادناه

11212310.jpg

المربع الاحمر في الصورة هو المراد تحريكه والخط المتعرج يبين لي المسار الذي اريده للمكعب ان يتحرك فيه

#4

أعتقد إذا كان المسار مستقيم وليس فيه إنحناءات فالأمر سهل ، مجرّد متغيرات تتغيّر مع الوقت وتبعاً للشرط ، مثال عام ممكن ينجح :

// reset point position
x = 0;
y = 0; 
int move = 1 ; // move to right

// for each x milliseconds :
if ( move == 1 ) //move_to_right
 {
 if(x < RIGHT_SIDE)
   {
		x += 0.1f ;
   }
 else
	{	
		move =2 ; // down 
	} 
 }
else if( move == 2)//move_down
{
	if( y < BOTTOM_SIDE )
	{
		y += 0.1;
	}
	else
	{
			move = 3; // to left;
	}
}
else if ( move == 3 ) //move_to_left
 {
 if(x > LEFT_SIDE)
   {
		x -= 0.1f ;
   }
 else
	{	
		move =4 ; // top 
	} 
 } 
else if( move == 4)//move_up
{
	if( y > TOP_SIDE )
	{
		y -= 0.1;
	}
	else
	{
		move = 1; // to right;
	}
}  

glLoadIdentity();
glTranslatef(x,y,0);

والأفضل طبعاً أن تبني دالة/method تغيّر قيمة Position معين من نقطة أ إلى نقطة ب .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

مواضيع مشابهة