Saturday, August 15, 2009

JOGLで複数の直方体を凸凹に配置する

JOGLで複数の直方体を凸凹に配置するには、以下のコードを実行します。


import java.io.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;

public class JoglSample51
{
// 出力画像サイズ
private static int width = 300;
private static int height = 300;

public static void main(String args[])
throws IOException
{
GLDrawableFactory gldf =
GLDrawableFactory.getFactory();
GLCapabilities glc = new GLCapabilities();
glc.setDoubleBuffered(false);
GLPbuffer buf = gldf.createGLPbuffer(
glc, null, width, height, null);

buf.addGLEventListener(
new GLEventListener(){
// 初期化
public void init(GLAutoDrawable dr)
{
GL gl = dr.getGL();
// 背景色
gl.glClearColor(
(float)0x58/(float)0xff,
(float)0x50/(float)0xff,
(float)0x50/(float)0xff,
1f);
}

public void display(GLAutoDrawable dr)
{
GL gl = dr.getGL();
GLUT glut = new GLUT();
gl.glViewport(0, 0, width, height);

// 透視投影
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
float ratio = (float)height/(float)width;
gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,
5.0f, 40.0f);

gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(-3.0f, -1.5f, -7.0f);

gl.glEnable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_LIGHT0);
gl.glEnable(gl.GL_COLOR_MATERIAL);
gl.glEnable(GL.GL_NORMALIZE);
gl.glEnable(GL.GL_AUTO_NORMAL);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_CULL_FACE);

// フォグの設定
float fog[]={0.1f,0.1f,0.2f,1.0f};
gl.glFogfv(GL.GL_FOG_COLOR,fog,0);
gl.glFogi(GL.GL_FOG_MODE,GL.GL_EXP);
gl.glFogf(GL.GL_FOG_DENSITY, 0.08f);
gl.glFogf(GL.GL_FOG_START, 0.0f);
gl.glFogf(GL.GL_FOG_END,20.0f);
gl.glEnable(GL.GL_FOG);

// 光源の位置
float l1pos[] = {-5.0f, 5.0f, 0.0f, 1.0f};
gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, l1pos, 0);
// 環境光
float l1amb[] = {0.2f, 0.2f, 0.1f, 1.0f};
gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, l1amb, 0);
// 拡散光
float l1dif[] = {0.9f, 0.9f, 0.9f, 1.0f};
gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, l1dif, 0);
// 鏡面光
float l1spe[] = {0.9f, 0.9f, 0.9f, 1.0f};
gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, l1spe, 0);

gl.glClear(GL.GL_COLOR_BUFFER_BIT
|GL.GL_DEPTH_BUFFER_BIT );

// 面の色を設定
gl.glColor3f(
(float)0x77/(float)0xff,
(float)0x99/(float)0xff,
(float)0xff/(float)0xff
);

// X軸回転
gl.glRotatef(15.0f, 1.0f, 0.0f, 0.0f);
// Y軸回転
gl.glRotatef(30.0f, 0.0f, 1.0f, 0.0f);

float cs = 0.5f;
float gs = 0.6f;
int xs = 50;
int zs = 50;
for(int lz=-3;lz<zs;lz++){
for(int lx=-3;lx<xs;lx++){
gl.glColor3f(
(float)0xff/(float)0xff,
(float)0xff/(float)0xff,
(float)0xff/(float)0xff
);
gl.glPushMatrix();
float ch = cs * (float)(Math.random()*1.0);
gl.glScalef(1f,ch, 1f);
gl.glTranslatef(lx*gs, -(cs-ch)/2, -1*lz*gs);
glut.glutSolidCube(cs);
gl.glPopMatrix();
}
}
}

public void reshape(
GLAutoDrawable dr,
int x, int y,
int width, int height){}

public void displayChanged(
GLAutoDrawable dr,
boolean modeChanged,
boolean deviceChanged){}
}
);

GLContext context = buf.createContext(null);
context.makeCurrent();
buf.display();
Screenshot.writeToFile(
new File("sample1209a.png"), width, height, true);
context.release();
context.destroy();
}
}


出力画像(sample1209a.png)
JOGLで描画した凸凹に配置した複数の直方体

im4javaで濃淡模様が中央に吸い込まれるような画像を作成する

im4javaで濃淡模様が中央に吸い込まれるような画像を作成するには、以下のコードを実行します。


import java.util.*;
import org.im4java.core.*;
import org.im4java.process.*;

// im4java-0.98.0-bin.tar.bz2を解凍してim4java-0.98.0.jarはclasspathに通す
public class Im4java31
{
public static void main(String args[])
throws Exception
{
try
{
// ConvertCmd convert = new ConvertCmd();
ImageCommand convert = new WindowsConvertCmd();

IMOperation op = new IMOperation();
op.size(400, 400);
op.addImage("plasma:fractal");
op.fx("intensity");
IMOperation so1 = op.openOperation();
so1.size(1, 1);
so1.addImage("xc:#3070A0FF");
so1.addImage("xc:#403010FF");
so1.append();
op.closeOperation();
op.fx("v.p{0,p}");
op.implode(1.0);
op.crop(200, 200, 100, 100);
op.addImage("sample1320a.jpg");
convert.run(op);
}
catch(CommandException cex)
{
System.out.println(cex.getErrorText());
cex.printStackTrace();
}
}

// im4java 0.98
static class WindowsConvertCmd extends ImageCommand
{
public WindowsConvertCmd()
{
setCommand("cmd");
setCommand("/c");
setCommand("convert");
/* another way
setCommand("C:\\Program Files\\ImageMagick-6.4.9-Q16\\convert");
*/
}
}
}


出力画像(sample1320a.jpg)
im4javaで描画した濃淡模様が中央に吸い込まれるような画像

関連情報
im4javaのまとめ

Friday, August 14, 2009

JOGLで少しずつ回転させた複数の立方体を描画する

JOGLで少しずつ回転させた複数の立方体を描画するには、以下のコードを実行します。


import java.io.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;

public class JoglSample50
{
// 出力画像サイズ
private static int width = 300;
private static int height = 300;

public static void main(String args[])
throws IOException
{
GLDrawableFactory gldf =
GLDrawableFactory.getFactory();
GLCapabilities glc = new GLCapabilities();
glc.setDoubleBuffered(false);
GLPbuffer buf = gldf.createGLPbuffer(
glc, null, width, height, null);

buf.addGLEventListener(
new GLEventListener(){
// 初期化
public void init(GLAutoDrawable dr)
{
GL gl = dr.getGL();
// 背景色
gl.glClearColor(
(float)0x68/(float)0xff,
(float)0x60/(float)0xff,
(float)0x60/(float)0xff,
1f);
}

public void display(GLAutoDrawable dr)
{
GL gl = dr.getGL();
GLUT glut = new GLUT();
gl.glViewport(0, 0, width, height);

// 透視投影
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
float ratio = (float)height/(float)width;
gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,
5.0f, 40.0f);

gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, -0.5f, -30.0f);

gl.glEnable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_LIGHT0);
gl.glEnable(gl.GL_COLOR_MATERIAL);
gl.glEnable(GL.GL_NORMALIZE);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_CULL_FACE);
gl.glClear(GL.GL_COLOR_BUFFER_BIT
|GL.GL_DEPTH_BUFFER_BIT );
gl.glLightModeli(GL.GL_LIGHT_MODEL_TWO_SIDE,
GL.GL_TRUE);

// 面の色を設定
gl.glColor3f(
(float)0x77/(float)0xff,
(float)0x99/(float)0xff,
(float)0xff/(float)0xff
);

// X軸回転
gl.glRotatef(15.0f, 1.0f, 0.0f, 0.0f);
// Y軸回転
gl.glRotatef(20.0f, 0.0f, 1.0f, 0.0f);

float px = -7f;
float py = 0f;
float pz = 0f;
float ry = 0f;
for(int li=0;li<20;li++){
gl.glPushMatrix();

gl.glTranslatef(px, py, pz);
// X軸回転
gl.glRotatef(ry, 1.0f, 0.0f, 0.0f);
glut.glutSolidCube(0.9f);
px += 1f;
ry += 10f;
gl.glPopMatrix();
}
}

public void reshape(
GLAutoDrawable dr,
int x, int y,
int width, int height){}

public void displayChanged(
GLAutoDrawable dr,
boolean modeChanged,
boolean deviceChanged){}
}
);

GLContext context = buf.createContext(null);
context.makeCurrent();
buf.display();
Screenshot.writeToFile(
new File("sample1208a.png"), width, height, true);
context.release();
context.destroy();
}
}



出力画像()
JOGLで描画した少しずつ回転させた複数の立方体

動作環境
JDK6 Upadate13, JOGL 1.1.1

Thursday, August 13, 2009

JOGLで画像を放射状に配置する

JOGLで画像を放射状に配置するには、以下のコードを実行します。


import java.io.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;
import com.sun.opengl.util.texture.*;

public class JoglSample49
{
// 出力画像サイズ
private static int width = 300;
private static int height = 300;
// テクスチャ
private static Texture textures[] = null;

private static String fn[] = {
"sample1182a.png",
"sample1189a.png",
"sample1191a.png",
"sample1194a.png",
"sample1195a.png",
"sample1196a.png",
"sample1197a.png",
"sample1198a.png",
"sample1199a.png",
"sample1201a.png",
"sample1202a.png",
"sample1206a.png"
};

public static void main(String args[])
throws IOException
{
GLDrawableFactory gldf =
GLDrawableFactory.getFactory();
GLCapabilities glc = new GLCapabilities();
glc.setDoubleBuffered(false);
GLPbuffer buf = gldf.createGLPbuffer(
glc, null, width, height, null);

buf.addGLEventListener(
new GLEventListener(){
// 初期化
public void init(GLAutoDrawable dr)
{
GL gl = dr.getGL();
// 背景色
gl.glClearColor(
(float)0x68/(float)0xff,
(float)0x60/(float)0xff,
(float)0x60/(float)0xff,
1f);

try
{
textures = new Texture[fn.length];
for(int fi=0;fi<fn.length;fi++){
textures[fi] =
TextureIO.newTexture(
new File(fn[fi]), true);
textures[fi].enable();
}
}
catch(IOException ioex){
ioex.printStackTrace();
}

}

public void display(GLAutoDrawable dr)
{
GL gl = dr.getGL();
gl.glViewport(0, 0, width, height);

// 透視投影
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
float ratio = (float)height/(float)width;
gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,
5.0f, 40.0f);

gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, -0.5f, -12.0f);

gl.glEnable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_LIGHT0);
gl.glEnable(gl.GL_COLOR_MATERIAL);
gl.glEnable(GL.GL_NORMALIZE);
gl.glEnable(GL.GL_AUTO_NORMAL);
gl.glEnable(GL.GL_DEPTH_TEST);
// gl.glEnable(GL.GL_CULL_FACE);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glClear(GL.GL_COLOR_BUFFER_BIT
|GL.GL_DEPTH_BUFFER_BIT );
gl.glLightModeli(GL.GL_LIGHT_MODEL_TWO_SIDE,
GL.GL_TRUE);

gl.glPushMatrix();
// X軸回転
gl.glRotatef(15.0f, 1.0f, 0.0f, 0.0f);
// Y軸回転
gl.glRotatef(20.0f, 0.0f, 1.0f, 0.0f);

float da = 360f / fn.length;
float ps = 2f;
for(int qi=0;qi<fn.length;qi++){
// テクスチャが張られたポリゴンを描画
textures[qi].bind();
float px = ps * (float)Math.cos(
Math.PI * da * qi / 180);
float pz = ps * (float)Math.sin(
Math.PI * da * qi / 180);
float nx = ps * (float)Math.cos(
Math.PI * (da * qi+90) / 180);
float nz = ps * (float)Math.sin(
Math.PI * (da * qi+90) / 180);

gl.glBegin(GL.GL_QUADS);
gl.glNormal3f(nx, 0.0f, nz);

gl.glTexCoord2f(0.0f, 0.0f);
gl.glVertex3f(0f, ps/2f, 0f);
gl.glTexCoord2f(0.0f, 1.0f);
gl.glVertex3f(0f, -ps/2f, 0f);
gl.glTexCoord2f(1.0f, 1.0f);
gl.glVertex3f(px, -ps/2f, pz);
gl.glTexCoord2f(1.0f, 0.0f);
gl.glVertex3f(px, ps/2f, pz);
gl.glEnd();
}

gl.glPopMatrix();
}

public void reshape(
GLAutoDrawable dr,
int x, int y,
int width, int height){}

public void displayChanged(
GLAutoDrawable dr,
boolean modeChanged,
boolean deviceChanged){}
}
);

GLContext context = buf.createContext(null);
context.makeCurrent();
buf.display();
Screenshot.writeToFile(
new File("sample1207a.png"), width, height, true);
context.release();
context.destroy();
}
}


出力画像(sample1207a.png)
JOGLで放射状に画像を配置した画像

Wednesday, August 12, 2009

JOGLでポリゴンに繰り返しテクスチャを貼り付ける

JOGLでポリゴンに繰り返しテクスチャを貼り付けるには、以下のコードを実行します。


import java.io.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;
import com.sun.opengl.util.texture.*;

public class JoglSample48
{
// 出力画像サイズ
private static int width = 300;
private static int height = 300;

public static void main(String args[])
throws IOException
{
GLDrawableFactory gldf =
GLDrawableFactory.getFactory();
GLCapabilities glc = new GLCapabilities();
glc.setDoubleBuffered(false);
GLPbuffer buf = gldf.createGLPbuffer(
glc, null, width, height, null);

buf.addGLEventListener(
new GLEventListener(){
// 初期化
public void init(GLAutoDrawable dr)
{
GL gl = dr.getGL();
// 背景色
gl.glClearColor(
(float)0xf0/(float)0xff,
(float)0xf0/(float)0xff,
(float)0xf0/(float)0xff,
1f);

try
{
Texture texture = TextureIO.newTexture(
new File("sf_r.jpg"), true);
texture.enable();
texture.bind();
}
catch(IOException ioex){}

}

public void display(GLAutoDrawable dr)
{
GL gl = dr.getGL();
GLUT glut = new GLUT();
gl.glViewport(0, 0, width, height);

// 透視投影
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
float ratio = (float)height/(float)width;
gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,
5.0f, 40.0f);

gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -15.0f);

gl.glEnable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_LIGHT0);
gl.glEnable(gl.GL_COLOR_MATERIAL);
gl.glEnable(GL.GL_NORMALIZE);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_CULL_FACE);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glEnable(GL.GL_TEXTURE_GEN_S);
gl.glEnable(GL.GL_TEXTURE_GEN_T);
gl.glClear(GL.GL_COLOR_BUFFER_BIT
|GL.GL_DEPTH_BUFFER_BIT );

gl.glPushMatrix();

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);

// Y軸回転
gl.glRotatef(30.0f, 0.0f, 1.0f, 0.0f);

// テクスチャが張られたポリゴンを描画
gl.glBegin(GL.GL_POLYGON);
gl.glTexCoord2f(0.0f, 1.0f);
gl.glVertex3f(-2f, -2f, 0.0f);
gl.glTexCoord2f(1.0f, 1.0f);
gl.glVertex3f(2f, -2f, 0.0f);
gl.glTexCoord2f(1.0f, 0.0f);
gl.glVertex3f(2f, 2f, 0.0f);
gl.glTexCoord2f(0.0f, 0.0f);
gl.glVertex3f(-2f, 2f, 0.0f);
gl.glEnd();

gl.glPopMatrix();
}

public void reshape(
GLAutoDrawable dr,
int x, int y,
int width, int height){}

public void displayChanged(
GLAutoDrawable dr,
boolean modeChanged,
boolean deviceChanged){}
}
);

GLContext context = buf.createContext(null);
context.makeCurrent();
buf.display();
Screenshot.writeToFile(
new File("sample1206a.png"), width, height, true);
context.release();
context.destroy();
}
}


テクスチャ画像(sf_r.jpg)


出力画像(sample1206a.png)
繰り返しテクスチャを貼り付けたポリゴン


動作環境
JDK6 Upadate13, JOGL 1.1.1

groovyとJOGLでワイヤーフレームの立方体を描画する

groovyとJOGLでワイヤーフレームの立方体を描画するには、以下のコードを実行します。


import static javax.media.opengl.GL.*;
import java.io.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;

// 出力画像サイズ
width = 300
height = 300

GLDrawableFactory gldf =
GLDrawableFactory.getFactory()
GLCapabilities glc = new GLCapabilities()
glc.setDoubleBuffered(false)
GLPbuffer buf = gldf.createGLPbuffer(
glc, null, width, height, null)
GL gl = buf.getGL()

buf.addGLEventListener(
[ init: {
// 背景色
gl.glClearColor(
0x77/0xff as Float,
0x99/0xff as Float,
0xff/0xff as Float,
1f)
},

display: {
GLUT glut = new GLUT()
gl.glViewport(0, 0, width, height)

// 透視投影
gl.glMatrixMode(GL_PROJECTION)
gl.glLoadIdentity()
float ratio = height/width as Float
gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,
5.0f, 40.0f)

gl.glMatrixMode(GL_MODELVIEW)
gl.glLoadIdentity()
gl.glTranslatef(0.0f, 0.0f, -10.0f)

gl.glClear(GL_COLOR_BUFFER_BIT)

gl.glPushMatrix()
// X軸回転
gl.glRotatef(45.0f, 1.0f, 0.0f, 0.0f)
// Y軸回転
gl.glRotatef(20.0f, 0.0f, 1.0f, 0.0f)
// ワイヤフレームの立方体を描画
glut.glutWireCube(2.0f)
gl.glPopMatrix()
},

reshape: {},
displayChanged: {}
] as GLEventListener
)
GLContext context =
buf.createContext(null)
context.makeCurrent()
buf.display()
Screenshot.writeToFile(
new File("sample1258a.png"),
width, height, true)
context.release()
context.destroy()


出力画像(sample1258a.png)
groovyとJOGLで描画したワイヤーフレームの立方体

動作環境
JDK1.6 Update14, Groovy 1.6.3, JOGL 1.1.1a

関連情報
groovyとJOGLのまとめ

Tuesday, August 11, 2009

JOGLで文字列を描画する

JOGLで文字列を描画するには、以下のコードを実行します。


import java.io.*;
import java.awt.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;
import com.sun.opengl.util.j2d.*;

public class JoglSample47
{
// 出力画像サイズ
private static int width = 300;
private static int height = 300;

public static void main(String args[])
throws IOException
{
GLDrawableFactory gldf =
GLDrawableFactory.getFactory();
GLCapabilities glc = new GLCapabilities();
glc.setDoubleBuffered(false);
GLPbuffer buf = gldf.createGLPbuffer(
glc, null, width, height, null);

buf.addGLEventListener(
new GLEventListener(){
// 初期化
public void init(GLAutoDrawable dr)
{
GL gl = dr.getGL();
// 背景色
gl.glClearColor(
(float)0xf0/(float)0xff,
(float)0xf0/(float)0xff,
(float)0xf0/(float)0xff,
1f);
}

public void display(GLAutoDrawable dr)
{
GL gl = dr.getGL();
GLUT glut = new GLUT();
gl.glViewport(0, 0, width, height);

// 透視投影
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
float ratio = (float)height/(float)width;
gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,
5.0f, 40.0f);

gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -15.0f);

gl.glEnable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_LIGHT0);
gl.glEnable(gl.GL_COLOR_MATERIAL);
gl.glEnable(GL.GL_NORMALIZE);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_CULL_FACE);
gl.glClear(GL.GL_COLOR_BUFFER_BIT |GL.GL_DEPTH_BUFFER_BIT );

// 面の色を設定
gl.glColor3f(
(float)0x77/(float)0xff,
(float)0x99/(float)0xff,
(float)0xff/(float)0xff
);

// X軸回転
gl.glRotatef(20.0f, 1.0f, 0.0f, 0.0f);
// Y軸回転
gl.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);

// 球を描画
glut.glutSolidSphere(2.0f, 32, 32);

// 文字列を描画
Font font = new Font("Tahoma", java.awt.Font.PLAIN, 40);
TextRenderer tr = new TextRenderer(font, true, true);
tr.beginRendering(width, height);
tr.setColor(0.5f, 0.5f, 0.5f, 1.0f);
tr.draw("TextRenderer", 20, 40);
tr.endRendering();


}

public void reshape(
GLAutoDrawable dr,
int x, int y,
int width, int height){}

public void displayChanged(
GLAutoDrawable dr,
boolean modeChanged,
boolean deviceChanged){}
}
);

GLContext context = buf.createContext(null);
context.makeCurrent();
buf.display();
Screenshot.writeToFile(
new File("sample1205a.png"), width, height, true);
context.release();
context.destroy();
}
}


出力画像(sample1205a.png)
JOGLで描画した文字列

Monday, August 10, 2009

JOGLで質感を設定する

JOGLで質感を設定するには、以下のコードを実行します。


import java.io.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;

public class JoglSample46
{
// 出力画像サイズ
private static int width = 300;
private static int height = 300;

public static void main(String args[])
throws IOException
{
GLDrawableFactory gldf =
GLDrawableFactory.getFactory();
GLCapabilities glc = new GLCapabilities();
glc.setDoubleBuffered(false);
GLPbuffer buf = gldf.createGLPbuffer(
glc, null, width, height, null);

buf.addGLEventListener(
new GLEventListener(){
// 初期化
public void init(GLAutoDrawable dr)
{
GL gl = dr.getGL();
// 背景色
gl.glClearColor(
(float)0xf0/(float)0xff,
(float)0xf0/(float)0xff,
(float)0xf0/(float)0xff,
1f);
}

public void display(GLAutoDrawable dr)
{
GL gl = dr.getGL();
GLUT glut = new GLUT();
gl.glViewport(0, 0, width, height);

// 透視投影
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
float ratio = (float)height/(float)width;
gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,
5.0f, 40.0f);

gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -15.0f);

gl.glEnable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_LIGHT0);
gl.glEnable(gl.GL_COLOR_MATERIAL);
gl.glEnable(GL.GL_NORMALIZE);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_CULL_FACE);
gl.glClear(GL.GL_COLOR_BUFFER_BIT |GL.GL_DEPTH_BUFFER_BIT );


// 面の色を設定
gl.glColor3f(
(float)0x77/(float)0xff,
(float)0x99/(float)0xff,
(float)0xff/(float)0xff
);

// X軸回転
gl.glRotatef(20.0f, 1.0f, 0.0f, 0.0f);
// Y軸回転
gl.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);

gl.glPushMatrix();

// 環境光を設定
float ambient[] = {0.2f, 0.2f, 0.1f, 1.0f};
gl.glMaterialfv(GL.GL_FRONT_AND_BACK,
GL.GL_AMBIENT, ambient, 0);

// 拡散光を設定
float diffuse[] = {0.1f, 0.1f, 0.1f, 1.0f};
gl.glMaterialfv(GL.GL_FRONT_AND_BACK,
GL.GL_DIFFUSE, diffuse, 0);

// 鏡面光を設定
float specular[] = {0.4f, 0.4f, 0.3f, 1.0f};
gl.glMaterialfv(GL.GL_FRONT_AND_BACK,
GL.GL_SPECULAR, specular, 0);
// specular exponent
gl.glMaterialf(GL.GL_FRONT_AND_BACK,
GL.GL_SHININESS, 128f*0.4f);

// 放射光
float emission[] = {0.1f, 0.1f, 0.2f, 1.0f};
gl.glMaterialfv(GL.GL_FRONT_AND_BACK,
GL.GL_EMISSION, emission, 0);


// 球を描画
glut.glutSolidSphere(2.0f, 32, 32);

gl.glPopMatrix();
}

public void reshape(
GLAutoDrawable dr,
int x, int y,
int width, int height){}

public void displayChanged(
GLAutoDrawable dr,
boolean modeChanged,
boolean deviceChanged){}
}
);

GLContext context = buf.createContext(null);
context.makeCurrent();
buf.display();
Screenshot.writeToFile(
new File("sample1204a.png"), width, height, true);
context.release();
context.destroy();
}
}


出力画像(sample1204a.png)
JOGLで描画した質感を設定した球


動作環境
JDK6 Upadate13, JOGL 1.1.1

im4javaでjpeg画像のクオリティを設定する

im4javaでjpeg画像のクオリティを設定するには、以下のコードを実行します。


import java.util.*;
import org.im4java.core.*;
import org.im4java.process.*;

// im4java-0.98.0-bin.tar.bz2を解凍してim4java-0.98.0.jarはclasspathに通す
public class Im4java30
{
public static void main(String args[])
throws Exception
{
try
{
// ConvertCmd convert = new ConvertCmd();
ImageCommand convert = new WindowsConvertCmd();

IMOperation op = new IMOperation();
op.addImage("sf.jpg");
op.quality(10.0);
op.addImage("sample1319a.jpg");
convert.run(op);
}
catch(CommandException cex)
{
System.out.println(cex.getErrorText());
cex.printStackTrace();
}
}

// im4java 0.98
static class WindowsConvertCmd extends ImageCommand
{
public WindowsConvertCmd()
{
setCommand("cmd");
setCommand("/c");
setCommand("convert");
/* another way
setCommand("C:\\Program Files\\ImageMagick-6.4.9-Q16\\convert");
*/
}
}
}


元画像(sf.jpg)


出力画像(sample1319a.jpg)
im4javaでjpegのqualityを設定した画像

関連情報
im4javaのまとめ

Sunday, August 09, 2009

JOGLでストロークフォントで文字列を描画する

JOGLでストロークフォントで文字列を描画するには、以下のコードを実行します。


import java.io.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;

public class JoglSample45
{
// 出力画像サイズ
private static int width = 300;
private static int height = 300;

public static void main(String args[])
throws IOException
{
GLDrawableFactory gldf =
GLDrawableFactory.getFactory();
GLCapabilities glc = new GLCapabilities();
glc.setDoubleBuffered(false);
GLPbuffer buf = gldf.createGLPbuffer(
glc, null, width, height, null);

buf.addGLEventListener(
new GLEventListener(){
// 初期化
public void init(GLAutoDrawable dr)
{
GL gl = dr.getGL();
// 背景色
gl.glClearColor(
(float)0xf0/(float)0xff,
(float)0xf0/(float)0xff,
(float)0xf0/(float)0xff,
1f);
}

public void display(GLAutoDrawable dr)
{
GL gl = dr.getGL();
GLUT glut = new GLUT();
gl.glViewport(0, 0, width, height);

// 透視投影
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
float ratio = (float)height/(float)width;
gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,
5.0f, 40.0f);

gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -7.0f);

gl.glEnable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_LIGHT0);
gl.glEnable(gl.GL_COLOR_MATERIAL);
gl.glEnable(GL.GL_NORMALIZE);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_CULL_FACE);
gl.glClear(GL.GL_COLOR_BUFFER_BIT |GL.GL_DEPTH_BUFFER_BIT );


// 色を設定
gl.glColor3f(
(float)0x77/(float)0xff,
(float)0x99/(float)0xff,
(float)0xff/(float)0xff
);

// X軸回転
gl.glRotatef(20.0f, 1.0f, 0.0f, 0.0f);
// Y軸回転
gl.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);

// 線の太さを設定
gl.glLineWidth(4f);

gl.glTranslated(-1.5, 0.0, 0.0);
gl.glScalef(0.01f, 0.01f, 0.01f);
glut.glutStrokeString(GLUT.STROKE_ROMAN, "JOGL");

}

public void reshape(
GLAutoDrawable dr,
int x, int y,
int width, int height){}

public void displayChanged(
GLAutoDrawable dr,
boolean modeChanged,
boolean deviceChanged){}
}
);

GLContext context = buf.createContext(null);
context.makeCurrent();
buf.display();
Screenshot.writeToFile(
new File("sample1203a.png"), width, height, true);
context.release();
context.destroy();
}
}


出力画像(sample1203a.png)
JOGLで描画したストロークフォントの文字列

動作環境
JDK6 Upadate13, JOGL 1.1.1