New ProjectでKotlin→JVMを選択
Project nameを適当につけてFinish
srcフォルダにktファイルを作成
下記サイトのFirstStepSwing.javaをコピペし、kotlinコードに変換
gradleでjogl-all-mainとgluegen-rt-mainをimplementation
init~dispose関数にoverrideキーワードを追加
dispose関数の中身を削除
〇Hello World
class Renderer : GLEventListener {
override fun init(drawable: GLAutoDrawable?) {}
override fun reshape(drawable: GLAutoDrawable?, x: Int, y:Int, width: Int, height: Int) {}
override fun display(drawable: GLAutoDrawable?) {}
override fun dispose(drawable: GLAutoDrawable?) {}
}
fun main() {
val frameSize = Dimension(300, 300)
val caps = GLCapabilities(GLProfile.get(GLProfile.GL2))
val frame = JFrame().apply {
size = frameSize
}
val panel = GLJPanel(caps).apply {
addGLEventListener(Renderer())
}
frame.contentPane.add(panel)
frame.isVisible = true
}
・ポリゴン描画
class Renderer : GLEventListener {
override fun init(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)
}
}
override fun reshape(drawable: GLAutoDrawable?, x: Int, y: Int, width: Int, height: Int) {}
override fun display(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClear(GL2.GL_COLOR_BUFFER_BIT)
gl.glBegin(GL2.GL_POLYGON)
gl.glColor3f(1.0f, 0.0f, 0.0f)
gl.glVertex2f(-0.9f, -0.9f)
gl.glColor3f(0.0f, 1.0f, 0.0f)
gl.glVertex2f(0.9f, -0.9f)
gl.glColor3f(0.0f, 0.0f, 1.0f)
gl.glVertex2f(0.9f, 0.9f)
gl.glColor3f(1.0f, 1.0f, 0.0f)
gl.glVertex2f(-0.9f, 0.9f)
gl.glEnd()
}
}
override fun dispose(drawable: GLAutoDrawable?) {}
}
・テクスチャマッピング
class Renderer : GLEventListener {
private var texture : Texture? = null
override fun init(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)
texture = TextureIO.newTexture(File("yutaka.png"), false)
}
}
override fun reshape(drawable: GLAutoDrawable?, x: Int, y: Int, width: Int, height: Int) {}
override fun display(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClear(GL2.GL_COLOR_BUFFER_BIT)
gl.glEnable(GL2.GL_TEXTURE_2D)
gl.glBegin(GL2.GL_QUADS);
gl.glTexCoord2f(0.0f, 0.0f)
gl.glVertex2f(-0.9f, -0.9f)
gl.glTexCoord2f(1.0f, 0.0f)
gl.glVertex2f(0.9f, -0.9f)
gl.glTexCoord2f(1.0f, 1.0f)
gl.glVertex2f(0.9f, 0.9f)
gl.glTexCoord2f(0.0f, 1.0f)
gl.glVertex2f(-0.9f, 0.9f)
gl.glEnd()
}
}
override fun dispose(drawable: GLAutoDrawable?) {}
}
・透視投影
import com.jogamp.opengl.*
import com.jogamp.opengl.awt.GLJPanel
import com.jogamp.opengl.glu.GLU
import java.awt.Dimension
import javax.swing.JFrame
class Renderer : GLEventListener {
private var glu : GLU? = null
var vertices = arrayOf(
floatArrayOf(0.0f, 0.0f, 0.0f),
floatArrayOf(1.0f, 0.0f, 0.0f),
floatArrayOf(1.0f, 1.0f, 0.0f),
floatArrayOf(0.0f, 1.0f, 0.0f),
floatArrayOf(0.0f, 0.0f, 1.0f),
floatArrayOf(1.0f, 0.0f, 1.0f),
floatArrayOf(1.0f, 1.0f, 1.0f),
floatArrayOf(0.0f, 1.0f, 1.0f)
)
var edges = arrayOf(
intArrayOf(0, 1),
intArrayOf(1, 2),
intArrayOf(2, 3),
intArrayOf(3, 0),
intArrayOf(4, 5),
intArrayOf(5, 6),
intArrayOf(6, 7),
intArrayOf(7, 4),
intArrayOf(0, 4),
intArrayOf(1, 5),
intArrayOf(2, 6),
intArrayOf(3, 7)
)
override fun init(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)
glu = GLU()
}
}
override fun reshape(drawable: GLAutoDrawable?, x: Int, y:Int, width: Int, height: Int) {
drawable?.let {
val gl = it.gl.gL2
gl.glMatrixMode(GL2.GL_PROJECTION)
gl.glLoadIdentity()
glu!!.gluPerspective(30.0, width.toDouble() / height, 1.0, 100.0)
gl.glTranslatef(0.0f, 0.0f, -5.0f)
gl.glMatrixMode(GL2.GL_MODELVIEW)
gl.glLoadIdentity()
glu!!.gluLookAt(3.0f, 4.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f)
}
}
override fun display(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClear(GL2.GL_COLOR_BUFFER_BIT)
gl.glBegin(GL2.GL_LINES)
for (edge in edges) {
gl.glVertex3fv(vertices[edge[0]], 0)
gl.glVertex3fv(vertices[edge[1]], 0)
}
gl.glEnd()
}
}
override fun dispose(drawable: GLAutoDrawable?) {}
}
fun main() {
val frameSize = Dimension(300, 300)
val caps = GLCapabilities(GLProfile.get(GLProfile.GL2))
val panel = GLJPanel(caps).apply {
addGLEventListener(Renderer())
}
val frame = JFrame().apply {
size = frameSize
contentPane.add(panel)
isVisible = true
}
}
コメント