JOGL (Java OpenGL) হল Java অ্যাপ্লিকেশনগুলিতে 3D গ্রাফিক্স তৈরির জন্য OpenGL লাইব্রেরি। এর সাহায্যে আপনি keyboard এবং mouse এর মাধ্যমে ব্যবহারকারী ইন্টারঅ্যাকশন তৈরি করতে পারেন। এই ইন্টারঅ্যাকশন ব্যবহার করে আপনি গ্রাফিক্স অবজেক্টের অবস্থান পরিবর্তন, ঘূর্ণন, এবং অন্যান্য এনিমেশন কার্যক্রম পরিচালনা করতে পারেন।
এই গাইডে, JOGL ব্যবহার করে কীভাবে keyboard এবং mouse এর মাধ্যমে ইন্টারঅ্যাকশন তৈরি করা যায়, তা দেখানো হবে।
Keyboard Interaction in JOGL
Keyboard Interaction ব্যবহারের মাধ্যমে ব্যবহারকারী কীভাবে অবজেক্ট নিয়ন্ত্রণ করবে, তা নির্ধারণ করা হয়। আপনি GLCanvas এ KeyListener ব্যবহার করে কী প্রেস করার ইভেন্ট গুলি ক্যাপচার করতে পারেন।
Keyboard Interaction Example:
এখানে, একটি কিউব তৈরি করা হয়েছে যা W, A, S, D কী দিয়ে স্থানান্তরিত হবে এবং R কী দিয়ে তার আঙ্গিক ঘোরানো যাবে।
import com.jogamp.opengl.*;
import com.jogamp.opengl.awt.GLCanvas;
import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class KeyboardInteractionExample implements GLEventListener {
private float angle = 0.0f;
private float xPosition = 0.0f;
private float yPosition = 0.0f;
@Override
public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black
gl.glEnable(GL.GL_DEPTH_TEST); // Enable depth testing for 3D rendering
}
@Override
public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the screen
gl.glLoadIdentity(); // Reset transformations
gl.glTranslatef(xPosition, yPosition, -6.0f); // Move the object back along the Z-axis
gl.glRotatef(angle, 1.0f, 1.0f, 0.0f); // Apply rotation on the X and Y axes
// Draw the cube
gl.glBegin(GL2.GL_QUADS);
// Front face
gl.glColor3f(1.0f, 0.0f, 0.0f); // Red color
gl.glVertex3f(-1.0f, 1.0f, 1.0f);
gl.glVertex3f( 1.0f, 1.0f, 1.0f);
gl.glVertex3f( 1.0f, -1.0f, 1.0f);
gl.glVertex3f(-1.0f, -1.0f, 1.0f);
// Other faces...
gl.glEnd();
angle += 0.2f; // Update the angle for the next frame
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
GL gl = drawable.getGL();
gl.glViewport(0, 0, width, height); // Set the viewport size
}
@Override
public void dispose(GLAutoDrawable drawable) {}
public static void main(String[] args) {
GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new KeyboardInteractionExample());
canvas.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_W) {
// Move up on the Y-axis
yPosition += 0.1f;
} else if (key == KeyEvent.VK_S) {
// Move down on the Y-axis
yPosition -= 0.1f;
} else if (key == KeyEvent.VK_A) {
// Move left on the X-axis
xPosition -= 0.1f;
} else if (key == KeyEvent.VK_D) {
// Move right on the X-axis
xPosition += 0.1f;
} else if (key == KeyEvent.VK_R) {
// Rotate
angle += 10.0f;
}
}
});
// Set up the JFrame to contain the canvas
JFrame frame = new JFrame("Keyboard Interaction Example");
frame.getContentPane().add(canvas);
frame.setSize(800, 600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
ব্যাখ্যা:
- KeyListener: KeyAdapter ব্যবহার করা হয়েছে যা keyPressed() মেথডের মাধ্যমে কী প্রেস করার সময় সংশ্লিষ্ট কার্যক্রম চালায়।
- W, A, S, D Keys: এই কীগুলির মাধ্যমে কিউবটি অনুভূমিক এবং উল্লম্বভাবে স্থানান্তরিত হয়। W এবং S কীগুলি Y-অক্ষের উপরে এবং নিচে চলতে সাহায্য করে, আর A এবং D কীগুলি X-অক্ষ বরাবর চলতে সাহায্য করে।
- R Key: R কী দিয়ে কিউবটির আঙ্গিক পরিবর্তন (rotation) হয়।
Mouse Interaction in JOGL
Mouse Interaction ব্যবহার করে আপনি অবজেক্টের উপর ইন্টারঅ্যাকশন করতে পারেন, যেমন কন্ট্রোল প্যানেল, জুম ইন/আউট, অথবা অবজেক্টকে ঘোরানো। JOGL তে MouseListener বা MouseMotionListener ব্যবহার করা হয় মাউসের ইভেন্টগুলিকে ক্যাপচার করতে।
Mouse Interaction Example:
এখানে একটি mouse drag ইন্টারঅ্যাকশন যোগ করা হয়েছে, যেখানে মাউসের মাধ্যমে কিউব ঘোরানো যাবে।
import com.jogamp.opengl.*;
import com.jogamp.opengl.awt.GLCanvas;
import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class MouseInteractionExample implements GLEventListener {
private float angleX = 0.0f;
private float angleY = 0.0f;
private int prevX, prevY;
@Override
public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black
gl.glEnable(GL.GL_DEPTH_TEST); // Enable depth testing for 3D rendering
}
@Override
public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the screen
gl.glLoadIdentity(); // Reset transformations
gl.glTranslatef(0.0f, 0.0f, -6.0f); // Move the object back along the Z-axis
gl.glRotatef(angleX, 1.0f, 0.0f, 0.0f); // Rotate around the X-axis
gl.glRotatef(angleY, 0.0f, 1.0f, 0.0f); // Rotate around the Y-axis
// Draw a 3D Cube
gl.glBegin(GL.GL_QUADS);
gl.glColor3f(1.0f, 0.0f, 0.0f); // Red color
gl.glVertex3f(-1.0f, 1.0f, 1.0f);
gl.glVertex3f( 1.0f, 1.0f, 1.0f);
gl.glVertex3f( 1.0f, -1.0f, 1.0f);
gl.glVertex3f(-1.0f, -1.0f, 1.0f);
// Other faces...
gl.glEnd();
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
GL gl = drawable.getGL();
gl.glViewport(0, 0, width, height); // Set the viewport size
}
@Override
public void dispose(GLAutoDrawable drawable) {}
public static void main(String[] args) {
GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new MouseInteractionExample());
canvas.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
prevX = e.getX();
prevY = e.getY();
}
});
canvas.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
int deltaX = e.getX() - prevX;
int deltaY = e.getY() - prevY;
// Rotate object based on mouse movement
angleX += deltaY * 0.5f;
angleY += deltaX * 0.5f;
prevX = e.getX();
prevY = e.getY();
}
});
// Set up the JFrame to contain the canvas
JFrame frame = new JFrame("Mouse Interaction Example");
frame.getContentPane().add(canvas);
frame.setSize(800, 600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
ব্যাখ্যা:
- MouseListener: মাউস প্রেস করার সময়
mousePressed()মেথডে বর্তমান পজিশন (x, y) ধারণ করা হয়। - MouseMotionListener: mouseDragged() মেথডে মাউস ড্র্যাগ করার সময় মাউসের গতির উপর ভিত্তি করে অবজেক্টটির ঘূর্ণন (
angleX,angleY) নিয়ন্ত্রণ করা হয়।
সারাংশ
JOGL এর মাধ্যমে Keyboard এবং Mouse এর ইন্টারঅ্যাকশন ব্যবহার করে 3D গ্রাফিক্সের অবজেক্ট নিয়ন্ত্রণ করা যায়। KeyListener ব্যবহার করে কী প্রেসের মাধ্যমে অবজেক্টের স্থানান্তর বা ঘূর্ণন করা যায়, এবং MouseListener এবং MouseMotionListener ব্যবহার করে মাউস ড্র্যাগের মাধ্যমে অবজেক্টের ঘূর্ণন বা অন্যান্য ক্রিয়াকলাপ পরিচালনা করা যায়। এই ইন্টারঅ্যাকশনগুলো interactive graphics এবং game development এর জন্য খুবই উপকারী।
JOGL (Java OpenGL) হল Java এর জন্য একটি লাইব্রেরি যা OpenGL গ্রাফিক্স API-এর সাথে ইন্টারফেস করে। Keyboard এবং Mouse Event Handling JOGL ব্যবহার করে গ্রাফিক্স অ্যাপ্লিকেশনগুলির ইন্টারঅ্যাকশন যোগ করার জন্য গুরুত্বপূর্ণ। ব্যবহারকারীর ইনপুট, যেমন কীবোর্ড এবং মাউসের মাধ্যমে নিয়ন্ত্রণ, অবজেক্টের অবস্থান পরিবর্তন, রোটেশন, স্কেলিং ইত্যাদি কার্যক্রমে সহায়ক।
এই গাইডে, আমরা JOGL ব্যবহার করে কিভাবে Keyboard এবং Mouse Event Handling করতে হয় তা দেখাব।
1. Keyboard Event Handling
Keyboard Event Handling কীবোর্ড ইনপুটের মাধ্যমে বিভিন্ন অ্যাকশনের ট্রিগার তৈরি করতে ব্যবহৃত হয়। JOGL তে কীবোর্ড ইনপুট নিয়ে কাজ করার জন্য KeyListener বা KeyAdapter ব্যবহার করা হয়।
Keyboard Input Example:
import com.jogamp.opengl.*;
import com.jogamp.opengl.awt.GLCanvas;
import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class KeyboardExample implements GLEventListener {
private float angle = 0.0f;
@Override
public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black
gl.glEnable(GL.GL_DEPTH_TEST); // Enable depth testing for 3D rendering
}
@Override
public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the canvas
gl.glLoadIdentity(); // Reset transformations
gl.glTranslatef(0.0f, 0.0f, -5.0f); // Move object backwards
gl.glRotatef(angle, 1.0f, 1.0f, 0.0f); // Rotate object
// Draw a 3D Cube
gl.glBegin(GL.GL_QUADS);
gl.glColor3f(1.0f, 0.0f, 0.0f); // Red color
gl.glVertex3f(-1.0f, -1.0f, 1.0f);
gl.glVertex3f( 1.0f, -1.0f, 1.0f);
gl.glVertex3f( 1.0f, 1.0f, 1.0f);
gl.glVertex3f(-1.0f, 1.0f, 1.0f);
gl.glEnd();
angle += 0.5f; // Increase angle for rotation
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
GL gl = drawable.getGL();
gl.glViewport(0, 0, width, height); // Adjust the viewport size
}
@Override
public void dispose(GLAutoDrawable drawable) {
// Cleanup resources if needed
}
public static void main(String[] args) {
GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new KeyboardExample());
canvas.setSize(800, 600);
// Set up a JFrame to contain the canvas
JFrame frame = new JFrame("Keyboard Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(canvas);
frame.setSize(800, 600);
frame.setVisible(true);
// Add a KeyListener to handle keyboard events
canvas.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
// Rotate object left when the left arrow key is pressed
angle -= 5.0f;
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
// Rotate object right when the right arrow key is pressed
angle += 5.0f;
}
}
});
canvas.setFocusable(true); // Make sure the canvas can receive keyboard focus
}
}
ব্যাখ্যা:
- KeyListener: কীবোর্ড ইনপুটের জন্য KeyListener ব্যবহার করা হয়েছে, যা কীবোর্ডের কী প্রেস ইভেন্ট ট্র্যাক করে। এখানে KeyAdapter ব্যবহার করা হয়েছে, যাতে
keyPressedমেথডে নির্দিষ্ট কী প্রেস হলে আমরা কিউবের ঘূর্ণন কোণ পরিবর্তন করতে পারি। keyPressed(KeyEvent e): এই মেথডের মধ্যে কীবোর্ডের কোনো কী প্রেস হলে তাকে ট্র্যাক করা হয় এবং এর মাধ্যমে কিউবের rotation কোণ পরিবর্তন করা হয়।
2. Mouse Event Handling
Mouse Event Handling এর মাধ্যমে মাউসের ইনপুট ট্র্যাক করা হয়, যেমন মাউসের ক্লিক, মুভমেন্ট বা ড্র্যাগ ইত্যাদি। JOGL এ মাউস ইভেন্ট হ্যান্ডলিং করার জন্য MouseListener এবং MouseMotionListener ইন্টারফেস ব্যবহার করা হয়।
Mouse Input Example:
import com.jogamp.opengl.*;
import com.jogamp.opengl.awt.GLCanvas;
import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class MouseExample implements GLEventListener {
private float angle = 0.0f;
@Override
public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black
gl.glEnable(GL.GL_DEPTH_TEST); // Enable depth testing for 3D rendering
}
@Override
public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the canvas
gl.glLoadIdentity(); // Reset transformations
gl.glTranslatef(0.0f, 0.0f, -5.0f); // Move object backwards
gl.glRotatef(angle, 1.0f, 1.0f, 0.0f); // Rotate object
// Draw a 3D Cube
gl.glBegin(GL.GL_QUADS);
gl.glColor3f(1.0f, 0.0f, 0.0f); // Red color
gl.glVertex3f(-1.0f, -1.0f, 1.0f);
gl.glVertex3f( 1.0f, -1.0f, 1.0f);
gl.glVertex3f( 1.0f, 1.0f, 1.0f);
gl.glVertex3f(-1.0f, 1.0f, 1.0f);
gl.glEnd();
angle += 0.5f; // Increase angle for rotation
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
GL gl = drawable.getGL();
gl.glViewport(0, 0, width, height); // Adjust the viewport size
}
@Override
public void dispose(GLAutoDrawable drawable) {
// Cleanup resources if needed
}
public static void main(String[] args) {
GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new MouseExample());
canvas.setSize(800, 600);
// Set up a JFrame to contain the canvas
JFrame frame = new JFrame("Mouse Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(canvas);
frame.setSize(800, 600);
frame.setVisible(true);
// Add a MouseListener to handle mouse events
canvas.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
// Rotate object left when the left mouse button is clicked
System.out.println("Left Button Clicked");
} else if (e.getButton() == MouseEvent.BUTTON3) {
// Rotate object right when the right mouse button is clicked
System.out.println("Right Button Clicked");
}
}
});
canvas.setFocusable(true); // Make sure the canvas can receive mouse events
}
}
ব্যাখ্যা:
- MouseListener: মাউস ইভেন্টের জন্য MouseAdapter ব্যবহার করা হয়েছে। এখানে
mouseClicked(MouseEvent e)মেথড ব্যবহার করা হয়েছে যা মাউসের ক্লিক ইভেন্ট ট্র্যাক করে। আপনি মাউসের বাটন (লেফট, রাইট) অনুযায়ী কোন ইনপুট নিতে পারেন। e.getButton(): এই ফাংশনটি মাউস বাটন ট্র্যাক করে। এখানে BUTTON1 (লেফট ক্লিক) এবং BUTTON3 (রাইট ক্লিক) পরীক্ষা করা হয়েছে।
3. Mouse Motion Event Handling
MouseMotionListener মাউসের movement ট্র্যাক করতে ব্যবহৃত হয়। এর মাধ্যমে মাউসের অবস্থান জানা যায়, যা ইন্টারেক্টিভ গ্রাফিক্সের জন্য সহায়ক।
Mouse Motion Input Example:
canvas.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
System.out.println("Mouse moved to: (" + x + ", " + y + ")");
}
@Override
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
System.out.println("Mouse dragged at: (" + x + ", " + y + ")");
}
});
এখানে mouseMoved() এবং mouseDragged() ব্যবহার করা হয়েছে, যেখানে মাউসের অবস্থান (x, y) প্রতি মুভমেন্টে প্রিন্ট হচ্ছে।
সারাংশ
JOGL ব্যবহার করে Keyboard এবং Mouse Event Handling করা খুবই সহজ এবং শক্তিশালী। KeyListener এবং MouseListener ইন্টারফেস ব্যবহার করে কীবোর্ড এবং মাউস ইনপুট ট্র্যাক করা সম্ভব, যার মাধ্যমে গ্রাফিক্স অ্যাপ্লিকেশনগুলিতে ইন্টারঅ্যাকশন যোগ করা যায়। আপনি কীবোর্ডের মাধ্যমে অবজেক্ট রোটেশন বা মাউসের মাধ্যমে অবজেক্টের অবস্থান পরিবর্তন করতে পারেন। JOGL এই ইন্টারফেসগুলো সহজে ব্যবহারের জন্য বিভিন্ন উপায় প্রদান করে, যা গ্রাফিক্স এবং গেম ডেভেলপমেন্টে গুরুত্বপূর্ণ।
JOGL (Java OpenGL) একটি শক্তিশালী লাইব্রেরি যা Java অ্যাপ্লিকেশন থেকে OpenGL রেন্ডারিং সক্ষম করে। JOGL তে GLEventListener ইন্টারফেস ব্যবহৃত হয় গ্রাফিক্স ইভেন্ট (যেমন, রেন্ডারিং, রিসাইজ, ডিসপ্লে চেঞ্জ) হ্যান্ডল করার জন্য। এর মাধ্যমে আপনি User Interaction পরিচালনা করতে পারেন, যেমন মাউস ক্লিক, কীবোর্ড ইনপুট, এবং অন্যান্য ইন্টারঅ্যাকশন যা আপনার গ্রাফিক্স প্রোগ্রাম বা 3D দৃশ্যে পরিবর্তন আনতে সাহায্য করে।
GLEventListener একটি ইভেন্ট হ্যান্ডলিং ইন্টারফেস যা OpenGL গ্রাফিক্স কন্টেক্সট এবং অন্যান্য ইভেন্টের জন্য একটি কাঠামো প্রদান করে। এর মাধ্যমে, আপনি গ্রাফিক্স এবং ইউজার ইনপুটের উপর নির্ভরশীল কাস্টম ইন্টারঅ্যাকশন তৈরি করতে পারবেন।
GLEventListener ইন্টারফেস এবং User Interaction
GLEventListener একটি ইন্টারফেস যা init(), display(), reshape(), এবং displayChanged() মেথডগুলো অন্তর্ভুক্ত করে। তবে, ইউজার ইন্টারঅ্যাকশন যেমন কীবোর্ড এবং মাউস ইনপুট গ্রহণ করতে সাধারণত MouseListener, MouseMotionListener, KeyListener ইন্টারফেসগুলো ব্যবহার করা হয়।
GLEventListener এর মাধ্যমে মাউস, কীবোর্ড এবং অন্যান্য ইনপুটের মাধ্যমে ইউজার ইন্টারঅ্যাকশনকে OpenGL গ্রাফিক্সের সাথে সংযুক্ত করা যায়। এখানে আমরা দেখবো কিভাবে ইউজার ইন্টারঅ্যাকশন পরিচালনা করা যায়।
1. GLEventListener সেটআপ
GLEventListener ইন্টারফেস ব্যবহার করতে প্রথমে OpenGL ইভেন্টগুলোর জন্য একটি ইভেন্ট লিসেনার তৈরি করতে হয়। এটি গ্রাফিক্স কনটেক্সটের সাথে কাজ করে এবং ইভেন্টগুলো পরিচালনা করে।
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
public class UserInteractionGLEventListener implements GLEventListener {
private float rotation = 0.0f;
@Override
public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black
}
@Override
public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT); // Clear the screen
gl.glPushMatrix(); // Save current transformation
gl.glRotatef(rotation, 0.0f, 0.0f, 1.0f); // Apply rotation transformation
// Draw a simple triangle
gl.glBegin(GL.GL_TRIANGLES);
gl.glColor3f(1.0f, 0.0f, 0.0f); // Set color to red
gl.glVertex2f(0.0f, 1.0f);
gl.glVertex2f(-1.0f, -1.0f);
gl.glVertex2f(1.0f, -1.0f);
gl.glEnd();
gl.glPopMatrix(); // Restore transformation
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
GL gl = drawable.getGL();
gl.glViewport(x, y, width, height); // Set the viewport
}
@Override
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
// Handle display changes if needed
}
// Method to change rotation based on user input
public void setRotation(float angle) {
this.rotation = angle;
}
}
এখানে:
- init(): গ্রাফিক্স কনটেক্সট ইনিশিয়ালাইজ করা হয়।
- display(): রেন্ডারিং লজিকটি এখানে থাকে। গ্রাফিক্স রেন্ডারিং শুরু এবং শেষ করা হয়।
- reshape(): রিসাইজিং ইভেন্টের সময় এটি কাজ করে এবং viewport এর আকার ঠিক করে।
2. Mouse Interaction (MouseEvent Handling)
মাউস ইন্টারঅ্যাকশন ব্যবহারের জন্য, MouseListener এবং MouseMotionListener ইন্টারফেস ব্যবহার করা হয়। মাউস ক্লিক, মুভমেন্ট ইত্যাদি ঘটলে, এগুলির মাধ্যমে আপনি 2D বা 3D গ্রাফিক্সের সাথে ইন্টারঅ্যাকশন করতে পারেন।
এখানে, আমরা একটি মাউস ক্লিক ইভেন্ট ব্যবহার করে অবজেক্টের রোটেশন পরিবর্তন করতে দেখবো।
MouseListener Example (MouseEvent Handling):
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.media.opengl.GLAutoDrawable;
public class MouseInteractionListener extends MouseAdapter {
private UserInteractionGLEventListener eventListener;
public MouseInteractionListener(UserInteractionGLEventListener eventListener) {
this.eventListener = eventListener;
}
@Override
public void mousePressed(MouseEvent e) {
// Rotate the object on mouse click
float x = e.getX();
float y = e.getY();
// Simple calculation to rotate based on mouse position (normalized)
float angle = (x + y) % 360;
eventListener.setRotation(angle);
}
}
এখানে, mousePressed() মেথডে মাউস ক্লিক করার সময় rotation angle পরিবর্তন করা হচ্ছে, যা পরবর্তী রেন্ডারিং এ 3D অবজেক্টে প্রভাব ফেলবে।
3. Key Interaction (KeyboardEvent Handling)
কীবোর্ড ইনপুট হ্যান্ডল করতে KeyListener ব্যবহার করা হয়। এখানে আমরা কীবোর্ডের ইনপুট দিয়ে গ্রাফিক্সের রঙ পরিবর্তন করতে পারি।
KeyListener Example (KeyboardEvent Handling):
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class KeyInteractionListener extends KeyAdapter {
private UserInteractionGLEventListener eventListener;
public KeyInteractionListener(UserInteractionGLEventListener eventListener) {
this.eventListener = eventListener;
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
// Change color or rotation based on key pressed
if (keyCode == KeyEvent.VK_R) {
// Change the color to red
eventListener.setRotation(45.0f); // Example: Rotate on pressing 'R'
} else if (keyCode == KeyEvent.VK_B) {
// Change the color to blue
eventListener.setRotation(90.0f); // Example: Rotate on pressing 'B'
}
}
}
এখানে, keyPressed() মেথডে কীবোর্ড ইনপুট গ্রহণ করা হচ্ছে এবং এর মাধ্যমে অবজেক্টের রঙ বা রোটেশন পরিবর্তন করা হচ্ছে। উদাহরণস্বরূপ, R কিপ্রেস করলে অবজেক্টের রোটেশন 45 ডিগ্রি পরিবর্তিত হবে।
4. GLDrawable জেএসপি সেটআপ
এখন, GLDrawable ক্লাস এবং এই ক্লাসগুলোকে GLEventListener এর সাথে সংযুক্ত করতে হবে যাতে ইউজার ইন্টারঅ্যাকশনকে গ্রাফিক্স রেন্ডারিংয়ের সাথে একত্রিত করা যায়। সাধারণত, GLCanvas অথবা GLJPanel ব্যবহার করা হয় যেখানে OpenGL রেন্ডারিং হয়।
JOGL Application Example:
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.util.FPSAnimator;
public class JOGLApplication {
public static void main(String[] args) {
GLProfile glProfile = GLProfile.get(GLProfile.GL2); // OpenGL profile
GLCapabilities capabilities = new GLCapabilities(glProfile);
GLWindow window = GLWindow.create(capabilities);
window.addGLEventListener(new UserInteractionGLEventListener());
window.setSize(800, 600); // Set the window size
window.setVisible(true);
// Add Mouse and Keyboard Listeners
window.addMouseListener(new MouseInteractionListener(new UserInteractionGLEventListener()));
window.addKeyListener(new KeyInteractionListener(new UserInteractionGLEventListener()));
FPSAnimator animator = new FPSAnimator(window, 60); // Set frame rate
animator.start();
}
}
এখানে, GLWindow এর মাধ্যমে JOGL উইন্ডো তৈরি করা হয়েছে, যেখানে GLEventListener যুক্ত করা হয়েছে। পাশাপাশি মাউস এবং কীবোর্ড ইনপুট হ্যান্ডলিংয়ের জন্য MouseListener এবং KeyListener যুক্ত করা হয়েছে।
সারাংশ
- GLEventListener হল JOGL এ OpenGL রেন্ডারিং ইভেন্ট (যেমন, রেন্ডারিং, রিসাইজ) পরিচালনা করার জন্য ব্যবহৃত একটি ইন্টারফেস।
- User Interaction পরিচালনা করতে MouseListener, MouseMotionListener, এবং KeyListener ইন্টারফেসগুলো ব্যবহার করা হয়, যা গ্রাফিক্স অবজেক্টে রোটেশন, রঙ পরিবর্তন বা অন্যান্য কাস্টম ইন্টারঅ্যাকশন করতে সহায়তা করে।
- MousePressed এবং KeyPressed ইভেন্ট ব্যবহার করে, মাউস এবং কীবোর্ড ইনপুট অনুযায়ী গ্রাফিক্স কনট্রোল করা যায়।
JOGL ব্যবহার করে আপনি 2D এবং 3D অবজেক্টে ইউজার ইন্টারঅ্যাকশন পরিচালনা করতে পারবেন, যা Java অ্যাপ্লিকেশনে গ্রাফিক্সের সাথে সরাসরি ইন্টারঅ্যাকশন এবং কাস্টমাইজেশন প্রদান করে।
JOGL (Java OpenGL) Java অ্যাপ্লিকেশনে OpenGL গ্রাফিক্স ব্যবহার করার জন্য একটি লাইব্রেরি, যা আপনাকে গ্রাফিক্স রেন্ডারিং এবং ইউজার ইন্টারঅ্যাকশন পরিচালনা করতে সক্ষম করে। GLEventListener এর মাধ্যমে keyboard এবং mouse ইন্টারঅ্যাকশন পরিচালনা করা যায়, যেখানে ইউজার কী-বোর্ড এবং মাউসের ইনপুটের মাধ্যমে গ্রাফিক্সে পরিবর্তন আনতে পারে।
JOGL ইউজার ইন্টারঅ্যাকশন ব্যবস্থাপনা করতে GLEventListener ইন্টারফেসের বিভিন্ন মেথড সরবরাহ করে। এই মেথডগুলো ব্যবহার করে আপনি মাউস ক্লিক, কী-বোর্ড ইনপুট এবং অন্যান্য ইউজার ইন্টারঅ্যাকশন হ্যান্ডেল করতে পারেন।
এখানে, আমরা keyboard এবং mouse এর মাধ্যমে ইউজার ইন্টারঅ্যাকশন পরিচালনার একটি উদাহরণ দেখবো।
Keyboard Interaction উদাহরণ
Keyboard Interaction এর মাধ্যমে আপনি কী-বোর্ডের কী প্রেস করলে OpenGL গ্রাফিক্সে কিছু পরিবর্তন করতে পারেন, যেমন, একটি অবজেক্টের অবস্থান পরিবর্তন করা, রঙ পরিবর্তন করা ইত্যাদি।
Keyboard Interaction উদাহরণ (Cube Move Using Arrow Keys):
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLCanvas;
import com.jogamp.newt.event.KeyAdapter;
import com.jogamp.newt.event.KeyEvent;
public class KeyboardInteractionExample implements GLEventListener {
private float xPosition = 0.0f;
private float yPosition = 0.0f;
@Override
public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black
}
@Override
public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT); // Clear the screen
gl.glLoadIdentity(); // Reset the modelview matrix
gl.glTranslatef(xPosition, yPosition, -6.0f); // Translate the object based on key inputs
gl.glColor3f(1.0f, 0.0f, 0.0f); // Red color for the object
gl.glBegin(GL.GL_QUADS); // Drawing a square as a placeholder for a cube
gl.glVertex2f(-1.0f, 1.0f);
gl.glVertex2f(1.0f, 1.0f);
gl.glVertex2f(1.0f, -1.0f);
gl.glVertex2f(-1.0f, -1.0f);
gl.glEnd();
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
GL gl = drawable.getGL();
gl.glViewport(x, y, width, height); // Adjust the viewport
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 1.0f, -1.0f); // Set orthogonal projection
gl.glMatrixMode(GL.GL_MODELVIEW);
}
@Override
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
// Handle display changes
}
public void addKeyListener(GLCanvas canvas) {
// Add KeyListener to the canvas to listen to keyboard events
canvas.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
xPosition -= 0.1f; // Move the object left
} else if (key == KeyEvent.VK_RIGHT) {
xPosition += 0.1f; // Move the object right
} else if (key == KeyEvent.VK_UP) {
yPosition += 0.1f; // Move the object up
} else if (key == KeyEvent.VK_DOWN) {
yPosition -= 0.1f; // Move the object down
}
}
});
}
}
এখানে:
- KeyAdapter ব্যবহার করে keyboard events হ্যান্ডেল করা হয়েছে।
- Arrow keys (left, right, up, down) প্রেস করার মাধ্যমে কিউবের অবস্থান পরিবর্তন করা হচ্ছে।
- GLCanvas.addKeyListener এর মাধ্যমে কী-বোর্ডের ইনপুট গ্রহণ করা হচ্ছে।
Mouse Interaction উদাহরণ
Mouse Interaction এর মাধ্যমে আপনি মাউসের ইনপুট যেমন ক্লিক বা মুভমেন্ট দিয়ে গ্রাফিক্সে পরিবর্তন আনতে পারেন। মাউসের click, drag, move ইত্যাদি ইনপুট নিয়ে 2D এবং 3D অবজেক্টে পরিবর্তন করা যায়।
Mouse Interaction উদাহরণ (Move Object with Mouse Click):
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLCanvas;
import com.jogamp.newt.event.MouseAdapter;
import com.jogamp.newt.event.MouseEvent;
public class MouseInteractionExample implements GLEventListener {
private float xPosition = 0.0f;
private float yPosition = 0.0f;
@Override
public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black
}
@Override
public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT); // Clear the screen
gl.glLoadIdentity(); // Reset the modelview matrix
gl.glTranslatef(xPosition, yPosition, -6.0f); // Translate the object based on mouse click
gl.glColor3f(0.0f, 1.0f, 0.0f); // Green color for the object
gl.glBegin(GL.GL_QUADS); // Drawing a square as a placeholder for a cube
gl.glVertex2f(-1.0f, 1.0f);
gl.glVertex2f(1.0f, 1.0f);
gl.glVertex2f(1.0f, -1.0f);
gl.glVertex2f(-1.0f, -1.0f);
gl.glEnd();
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
GL gl = drawable.getGL();
gl.glViewport(x, y, width, height); // Adjust the viewport
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 1.0f, -1.0f); // Set orthogonal projection
gl.glMatrixMode(GL.GL_MODELVIEW);
}
@Override
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
// Handle display changes
}
public void addMouseListener(GLCanvas canvas) {
// Add MouseListener to the canvas to listen to mouse events
canvas.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
// Get the mouse click position
xPosition = e.getX() / 100.0f - 1.0f;
yPosition = -e.getY() / 100.0f + 1.0f;
}
});
}
}
এখানে:
- MouseAdapter ব্যবহার করে mouse events হ্যান্ডেল করা হয়েছে।
- mousePressed() মেথডের মাধ্যমে মাউস ক্লিকের অবস্থান (X, Y) গ্রহণ করা হয়েছে এবং অবজেক্টের স্থান পরিবর্তন করা হয়েছে।
সারাংশ
- Keyboard Interaction: KeyAdapter ব্যবহার করে keyboard events যেমন arrow keys, enter, escape কী প্রেস করে গ্রাফিক্সে পরিবর্তন করা যায়।
- Mouse Interaction: MouseAdapter ব্যবহার করে mouse events যেমন ক্লিক এবং মুভমেন্ট ব্যবহার করে গ্রাফিক্সের অবস্থান পরিবর্তন করা যায়।
JOGL (Java OpenGL) ব্যবহার করে আপনি সহজেই ইউজার ইন্টারঅ্যাকশন পরিচালনা করতে পারেন এবং গ্রাফিক্সে মাউস এবং কী-বোর্ডের ইনপুটের মাধ্যমে ডায়নামিক পরিবর্তন আনতে পারেন। GLEventListener এর মাধ্যমে আপনি OpenGL রেন্ডারিং এবং ইভেন্ট হ্যান্ডলিংয়ের জন্য কার্যকরী কাস্টমাইজেশন করতে পারবেন।
Read more