오늘은 본격적으로 jPCT-AE을 개발하면서 포스팅을 해 보겠습니다.
시작이 반이라고, 어플리케이션 개발의 반은 프로젝트 세팅부터 시작됩니다.
프로젝트 개발을 어느 플랫폼에서 하느냐, 어느 엔진을 사용할 것이냐 등을 미리 결정해야 하기 때문에 처음 프로젝트를 만드는 일은 정말로 큰 부분을 차지합니다.
하지만 우리는 그렇게까지 고민할 필요는 없죠. 안드로이드 개발은 일반적으로 eclipse라는 IDE에서 이루어지고, 사용할 언어는 자바이며 그래픽 엔진은 jPCT를 사용할 것이기 때문이죠.
기본적으로 위 환경은 다 갖추어져 있다는 가정하에 시작하겠습니다.
1. 안드로이드 프로젝트 생성
프로젝트 세팅정도는 할 줄 안다 하시는 분이면 프로젝트 생성부분은 건너뛰어도 상관없습니다.
이클립스에서 File->New->Android Project 선택하고 다음과 같이 진행합니다.
1) 프로젝트 이름과 경로를 설정합니다. JPCT_Example라는 프로젝트 이름 입력. next
2) 개발 타겟이 될 안드로이드 버전을 정합니다. 여기서는 2.3.1(api level 9)로 정했습니다. next
3) 기본 패키지 이름을 정합니다. 여기서는 com.jpct.example라는 패키지명으로 사용하겠습니다. finish!
설정이 잘 되었으면 다음과 같이 구성된 프로젝트가 자동으로 생성됩니다.
2. 라이브러리 로드
프로젝트 폴더에 libs라는 폴더를 생성하고 그 밑에 jpct 홈페이지에서 구한 엔진 라이브러리 파일인 jpct-ae.jar파일을 넣습니다.
이클립스에서 추가된 jar파일을 오른쪽 클릭 후 Build Path->Add to Build Path 선택하면 jpct엔진이 라이브러리에 등록됩니다.
3. 메인 액티비티 코딩
http://www.jpct.net/wiki/index.php/Hello_World_for_Android 에 Hello_world 예제가 있으니 참고하셔도 됩니다.
예제에서는 한 클래스 안에 내부 클래스를 또 선언하는 방식을 사용하였지만 저는 약간의 확장성(?)을 위해 내부 클래스들을 파일들로 분리하여 다시 만들어보았습니다.
1) JPCT_ExampleActivity.java
package com.jpct.example;
import java.lang.reflect.Field;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import com.threed.jpct.Logger;
public class JPCT_ExampleActivity extends Activity {
private static JPCT_ExampleActivity master = null;
private GLSurfaceView glSurfaceView;
private JPCT_Renderer renderer = null;
public static JPCT_ExampleActivity getActivity() {
return master;
}
private void copy(Object src) {
try {
Logger.log("Copying data from master Activity!");
Field[] fs = src.getClass().getDeclaredFields();
for (Field f : fs) {
f.setAccessible(true);
f.set(this, f.get(src));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
// activity가 생성되었을 때의 동작
super.onCreate(savedInstanceState);
if(master != null) {
copy(master);
}
master = this;
// GLSurfaceView 생성
glSurfaceView = new GLSurfaceView(getApplication());
glSurfaceView.setEGLContextClientVersion(2); // OpenGL ES 2.0을 사용함
if(renderer == null)
renderer = new JPCT_Renderer();
glSurfaceView.setRenderer(renderer);
// 메인 view를 설정함
setContentView(glSurfaceView);
}
}2) JPCT_Renderer.java
package com.jpct.example;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import com.threed.jpct.Camera;
import com.threed.jpct.FrameBuffer;
import com.threed.jpct.Light;
import com.threed.jpct.Logger;
import com.threed.jpct.Object3D;
import com.threed.jpct.Primitives;
import com.threed.jpct.RGBColor;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.Texture;
import com.threed.jpct.TextureManager;
import com.threed.jpct.World;
import com.threed.jpct.util.MemoryHelper;
import android.opengl.GLSurfaceView.Renderer;
public class JPCT_Renderer implements Renderer {
private World m_world;
private Light m_light;
private Camera m_cam;
private FrameBuffer buffer = null;
private RGBColor colBackground = new RGBColor(0x33, 0xcc, 0xcc);
private Object3D m_cube;
private long tick = 0;
private int fps = 0;
@Override
public void onDrawFrame(GL10 gl) {
// 화면 지움
buffer.clear(colBackground);
// 그리기
m_world.renderScene(buffer);
m_world.draw(buffer);
// 그린 화면으로 갱신
buffer.display();
// FPS계산
if(System.currentTimeMillis() - tick > 1000) {
Logger.log("fps: " + fps);
fps = 0;
tick = System.currentTimeMillis();
}
else fps++;
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
if(buffer == null) {
// World 생성
m_world = new World();
// light 생성
m_light = new Light(m_world);
m_light.setIntensity(250, 250, 250);
m_light.setPosition(new SimpleVector(50, -50, 50));
// 주변광 설정(m_light와는 무관)
m_world.setAmbientLight(100, 100, 100);
// Texture 생성
Texture t = new Texture(100, 100, new RGBColor(0, 0xff, 0, 0x7f));
TextureManager.getInstance().addTexture("test", t);
// 크기 10의 정육면체 객체 생성
m_cube = Primitives.getBox(10, 1); // cube 생성
m_cube.calcTextureWrap(); // texture로 도형을 감싸도록 함
m_cube.translate(0, -10, 0); // 이동
m_cube.setTexture("test"); // 아까 생성한 test texture으로 설정함
m_cube.strip();
m_cube.build();
m_world.addObject(m_cube); // World에 추가
// camera 생성
m_cam = m_world.getCamera();
m_cam.setPosition(20, -20, 20);
m_cam.lookAt(m_cube.getTransformedCenter());
}
if(buffer != null)
buffer.dispose();
buffer = new FrameBuffer(width, height);
MemoryHelper.compact();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
}
}
위와 같이 소스를 코딩하고 실행해 보면 다음과 같은 결과 화면을 얻을 수 있습니다.
'Programming > Graphics' 카테고리의 다른 글
| 2D 물체 겹침 표현하기 (0) | 2012.08.07 |
|---|---|
| jPCT로 2D 렌더링을 구현해보자 - line, fillRect (0) | 2012.07.28 |
| Java를 위한 3D 엔진, jPCT (2) | 2012.06.28 |
| 안드로이드용 Irrlicht엔진 개발 환경설정 (0) | 2012.06.25 |
| cygwin에서 Irrlicht엔진 빌드 오류 (0) | 2012.06.23 |