Monday, July 29, 2013

N年沒寫了,試試新的寫作介面?

社群媒體雖然好用,但是多半還是日常生活的交流。有時想寫些長文整理思緒,總覺得社群媒體不太適用,也許以後會比較常利用這個地方。回頭看了一下三年前在這留下的東西,感覺自已好像沒啥長進,週遭人事倒是變了不少。父母先後離世,妹妹有了一男一女,自已也開始經常出國……先以JOGL2以及OpenGL3~4 近期相關的心得開頭或許不錯?

Sunday, March 07, 2010

3D繪圖的座標系統概念

在3D繪圖的世界裏,主要有兩種座標系統:

模型坐標系統(Model View)
視窗座標系統(Viewport)

那兩種座標系統要如何轉換呢?基本的轉換流程包含了:

切除(Clipping)。在模型坐標系統中切出可視範圍的空間,一般稱為View Volume。
投影(Projection)。將三維空間的View Volume投影至平面,一般會使用兩種投影法。一種是透視法投影(perspective),另一種是正射投影(Orthographic)。兩種投影法的差別圖示如下


透視法投影



正射投影

JOGL程式的基本架構


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package idv.sean;

import com.sun.opengl.util.FPSAnimator;
import com.sun.opengl.util.GLUT;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;
import javax.swing.JFrame;

/**
*
* @author sean
*/
public class OpenGLApp3 extends JFrame
implements GLEventListener, KeyListener {

static int year = 0, day = 0;
private KeyEvent key;
private GLCanvas canvas;
private GLCapabilities caps;
GLU glu = new GLU();
GLUT glut = new GLUT();
private FPSAnimator animator;

public OpenGLApp3() {
super("My Test");

caps = new GLCapabilities();
canvas = new GLCanvas(caps);
//canvas.setIgnoreRepaint( true );
canvas.addGLEventListener(this);
canvas.addKeyListener(this);
animator = new FPSAnimator( canvas, 60 );
animator.setRunAsFastAsPossible(false);
getContentPane().add(canvas);
}

public void run() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(512, 512);
setLocationRelativeTo(null);
setVisible(true);
canvas.requestFocus();
animator.start();
}

public static void main(String[] args) {
new OpenGLApp3().run();
}

public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glShadeModel(GL.GL_FLAT);

}

public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();

gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glColor3f(1.0f, 1.0f, 1.0f);

gl.glPushMatrix();
glut.glutWireSphere(1.0, 20, 16); /* draw sun */
gl.glRotatef((float) year, 0.0f, 1.0f, 0.0f);
gl.glTranslatef(2.0f, 0.0f, 0.0f);
gl.glRotatef((float) day, 0.0f, 1.0f, 0.0f);
glut.glutWireSphere(0.2, 10, 8); /* draw smaller planet */
gl.glPopMatrix();
drawable.swapBuffers();

}

public void reshape(GLAutoDrawable drawable, int arg1, int arg2, int w, int h) {
GL gl = drawable.getGL();

gl.glViewport(0, 0, w, h);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(60.0, (float) w / (float) h, 1.0, 20.0);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
glu.gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

}

public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
}

public void keyTyped(KeyEvent e) {
}

public void keyPressed(KeyEvent key) {
this.key = key;
System.out.println(key.getKeyCode());
switch (key.getKeyChar()) {

case 'd':
day = (day + 10) % 360;
break;
case 'D':
day = (day - 10) % 360;
break;
case 'y':
year = (year + 5) % 360;
break;
case 'Y':
year = (year - 5) % 360;
break;
default:
break;
}

canvas.display();
}

public void keyReleased(KeyEvent e) {
}
}


JOGL的核心在於GLEventListener與GLAutoDrawable這兩個介面。GLAutoDrawable這個介面有兩個實作,一個是GLCanvas,另一個是GLJPanel。前者是AWT的元件,後者是Swing的元件,當你將AWT與Swing元件混用的時候會有一些問題,但是GLCanvas會直接與OpenGL互動,所以效率比較好,之間的取捨就看需求。

GLEventListner則是JOGL繪圖的核心,包含了init、display、reshape、dispose四個函式。init只會被呼叫一次,負責繪圖環境的建置。display相當於java2d的paintComponent,負責實際的繪圖動作。reshape則是在GLAutoDrawable改變大小時進行視點、Viewport的變化。dispose則是GLAutoDrawable物件消失時,負責資源回收的工作。

Labels:

學習JOGL的網路資源

JOGL的公式網頁:
https://jogl.dev.java.net/
說實話,好像看不到什麼活動跡象XD
JOGL api資料:
http://download.java.net/media/jogl/jogl-2.x-docs/
基本上大部份的說明都是連結到對應的OpenGL api說明
OpenGL紅皮書:
http://www.glprogramming.com/red/index.html
這裏的說明能幫助你理解OpenGL基本的運作流程與概念
NeHe:
http://nehe.gamedev.net/
由淺入深的OpenGL範例與說明,Java版原始碼的下載位置
http://pepijn.fab4.be/software/nehe-java-ports/

把以上的文件與程式碼瀏覽過一篇,應該就大致能掌握JOGL的基本概念

Labels:

Thursday, March 04, 2010

JOGL起始

既然這陣子都在玩這塊,就當作工作筆記順手記一下吧。

JOGL是OPENGL的JAVA BINDING,目前看到除了學術界的運用之外,大概只有Android的3D遊戲會用這種先天不良的3D平台吧。為什麼說是先天不良呢?因為Java的跨平台特性,讓它難以使用現在3D程式大量使用的矩陣高速處理指令之類的加速工具,所以除非是為跨平台,還真的沒必要使用這個技術平台。不過平心而論,這個版本其實也只是把OpenGL包上個Java皮,所以摸到一定程度之後,其實OpenGL的資源拿來稍微修改,也就可以使用,某種意義上比Java3D的資源還多些。

不過這年頭還回頭寫blog,我還真是個科技弱者,不知道下次什麼時候會更新……

Labels:

Friday, November 14, 2008

坦白從寬,抗拒從嚴

  辜先生出來交代金錢流向,戲持續在演啊。

  下午入手了小學館的Pokemon 白金攻略本,看完以後感覺很糟,少了各種特性、招式的逆查表,全國圖鑑的資料也不完整,看來還是得靠Wiki補完。不過這是我一次看到有收錄Pokemon 裏電視節目表的攻略本,也算是蠻新奇就是。Pokemon 白金目前所有劇情上能達成的目地我都走完了,看來以後就是攻略戰鬥前線、全國圖鑑為主吧。

  在AC遇到了一些朋友聊天打屁,電玩方面,日本市場看來SCE雖然主機賣的不怎麼樣,但是軟體方面應該可以斬獲不少,歐美的話,還是以任天堂為主,但是Wii Music與其它音樂遊戲銷售量的下滑,可能會影響接下來的銷量計畫。不過歐美音樂遊戲多半與各種高價的樂器配件搭配,或許會受到目前景氣的影響,也可能是歐美音樂遊戲開始退潮的警訊。在這波金融危機後,歐美廠商的籌資能力看來受到不少影響,也許日本能趁機扳回一城也說不定。除此之外,金融危機真是影響到身邊的每個人。

  週末了,不想鬱悶過日,好好休養身心吧。

Thursday, November 13, 2008

  老爸、老媽跟我這幾天全都身體不太舒服,這種氣候急速變化的時間真是不太妙。

  陳水扁收押的事情還在炒作中,但是有點社會閱歷的人恐怕多少都感受到美國背後操縱的姿態了吧。今天隨手轉到超視的新聞哇哇哇,算是一個比較溫和的政論節目吧。兩位主持人的政治傾向其實大家都知道,但至少在這個節目裏比較不會像其它節目那麼色厲內茬,幾位政論節目的常客談起話來也溫和些,今天談著談著就講到這個案子裏美國的態度。很明顯的,美國提供情資的速度與品質其實讓陳水扁無法招架,於是整個司法大戲完全在國民黨與美國設定的步調下演出,接下來還會如何操弄這些花樣,就讓我們等著瞧吧。

  工作上今天犯了不小的錯誤,可惜,要深切警惕,但不可被負面情緒影響過大,畢竟沒有悲觀失志的空間,明天再加油。話是這樣講,整天下來還是有些魂不守舍。結果就是整個下午晃一下就過去了。不過早上看到有篇文章不錯:

  http://www.1101.com/umeda_iwata/index.html

  除了我長期注意的任天堂岩田社長與廣告人系井重里以外,這場對談中我最在意的是梅田望夫這位日本趨勢觀察者的看法。數年前看他談到網路與影音創作工具的普及化,會造成創意工業的兩極化,人人都能輕易創作時,有才能的人可以急速崛起,但是不行的人就是不行。看到這兩年nico動畫與一些web 2.0 User Create Content服務的興起,還真如他所預期的一樣。目前刊載的這篇談到了時間利用的重要性……振作啊。

Wednesday, November 12, 2008

守得雲開見月明

  雨總算停了,穿過稀疏雲層的滿月看來別有一番風姿。

  早上起來,陳水扁收押鬧劇總算告一段落,接下來還有很長的路要走,希望台灣兩股互相憎恨的勢力能有和解的一天吧。工作上有失有得,還不算差,不過該檢討自已生活習慣上的一些輕重緩急,好讓工作效率更加提昇。

  下午其實沒作什麼事,都在衝Pokemon的聯盟冠軍十次記錄,這蠻糟的。其實就算老爸出門家裏沒人,自已也不該用太多時間鬼混。老妹回家來體態依舊過胖,該不該跟他老公談談呢?不過她回來之後處理了一下租屋相關事宜,這兩天要把這件事辦好,房子空在那邊也不是個辦法。

  趁雨停去了一趟地下街,Fami通出的Pokemon 攻略本也賣掉了,不曉得該不該繼續等待。大概是連日陰雨的關係,連最有名的MH團也只看到四個人而已,整體而言蠻空蕩的。後來跑去AC打混,看到PS3的SOCOM對戰,還蠻有趣的。這樣來回一趟,勉強算是把今天的運動時間配額用掉了吧。結果今天大概只有工作時比較精實,腦袋有在想點東西,這樣下去不行啊。

  

Tuesday, November 11, 2008

還在拖啊

  陳水扁收押的爛戲還在演,真是無聊。

  談到政治就想到下午HBO播的「國王人馬」(All the King's Men)。有時候會覺得HBO很惡搞,石油大漲的時候狂播高爾的環保宣傳片,要美國總統大選了就播2004年驗票,今天收押就播這部描述政治人物興起與衰亡的電影。

  今天工作上成績不怎麼理想,但是至少堅持住了基本規則,還算不錯。回想過去上課時老師講的一句話:不照規距而凹贏其實不算贏,反而會建立錯誤的操作心態。還真是不被咬過不知痛啊。

  身體的狀況慢慢改善,今天再跑二十分鐘狀況就改善不少,體重也總算接近退伍後最低記錄84公斤(接近而已),希望進入十二月之後可以突破當年的記錄。要是明年三月前可以回到七字頭就太好了。只是呼吸系統還是很弱,最近這幾年不感冒就算了,一感冒都很久才好,免疫系統真的不太行。

  本日的閱讀進度依舊不如預期,看來我潛意識裏還蠻排拒看書的,得強迫自已一點,一直沉浸在Pokemon裏也不太健康啊。不過說到Pokemon,目前總算可以穩定的通過四天王,也有了兩隻一百級的PM,數年前才開始接觸這系列的我終究也到了這種程度,下一步大概真的得每週去地下街實戰才能維持動力吧。

  真正的力量來自於自已,加油吧。