회피(avoid) 게임의 일종입니다. 사실 이런 게임을 어디선가 보고 약간의 아이데이션만 추가해서 만들어본 게임입니다.
게임이라 하기에는 무리가 있을수도 있습니다. ^^;

간단한 공 충돌만 필요해서 다른 물리엔진은 사용하지 않았습니다.

운동량 보존법칙을 사용해서 충돌반응을 하는 시뮬레이션 자체는 어렵지 않은것이나 "어디선가 보았던" 아름다운 알고리즘이 있어서 그것을 약간 손보고(버그 해결?) 적용해보았습니다.

그 알고리즘에 관련되서 간단히 포스팅한게 있는데 날려먹기로 포스팅 한것이라 ;; 나중에 출처(어느 외국인 블로거 분이셨는데 까먹었..;;) 부터 해서 소스를 분석하는 시간을 가져보도록 해야겠습니다.

지금은 구조를 공부하고 있으니 이 게임에 한번 실험해 봐야겠네요..


녹색공을 마우스로 콘트롤하여 빨간색 공을 피하셔야 합니다. 빨간색 공끼리 충돌하면 일정 확률로 파란색 공이 되는데 그것을 드셔서 위험을 줄이세요!
저작자 표시 비영리 변경 금지
Posted by 웹눈
책 리뷰,책 소개

hika님의 book 카테고리를 보고 저도 한번 책 리뷰를 해보고 싶다는 생각이 들었습니다.

어떠한 주제에 관심이 있으며 왜 그런 책을 읽게 되었고 무엇을 얻을수 있었는지 공유하는건 참 괜찮은 것이라고 생각되네요.

1. 색채학 원론
"느낌 좋은데?" , "색감 좋다~" , "이쁘다" <- 주로 주위에 디자인 하는 친구나 직장에서 듣게 되는 말이었습니다. 그런데 저는 "왜 저런 색조합이 느낌이 좋을까?" 라는 원론적인 이론을 알고 싶었습니다. 그런데 빛이 성질에 대한 물리적인 의미를 알수 있기에는 꽤 훌륭한 책이지만 "그래서 저런 색조합이 느낌이 좋구나" 라는 대답은 얻기 힘든것 같습니다. ㅎㅎ

2. 수치해석과 그의 알고리즘
대수적, 해석적 해법을 컴퓨터로는 어떻게 풀수 있을까? 라는 궁금해서 구입하게 된 책입니다. 초보자를 대상으로 한 책입니다. 구성이 깔끔하고 이해하기 좋았습니다.

3. 공업수학
물리가 전공이긴 합니다만... 워낙 담을 쌓고 지내다가.. 컴퓨터 프로그래밍을 접하면서 그렇겍 하기 싫었던 수학과 물리가 좋아지기 시작했습니다. ^^; 그렇지만.. 워낙 두껍게 쌓인 담인지라.. 기초적인 부분부터 다시 시작하고자 구입한 책입니다. 설명도 명쾌하니 구성도 깔끔하고 좋았습니다.

4. 천재성의 비밀
이 책을 설명하기 위해 책의 서문을 인용하자면 "세계를 체계적으로 이해하려면, 무엇보다도 밑바닥부터 차근차근 알아나가야 할 것이다. 이 책은 밑바닥부터 훑어 올라가면서 세상을 통째로 이해하겠다는 야심찬 기획의 한 갈래이고, 물리학을 그 출발점으로 삼은 탐사여행이다. 물리적 세계상을 두루 살펴보고, 그 밑바탕이 되는 수학과 철학을 거쳐서, 모든 지식의 형태를 결정하는 우리 자신의 정신 작용을 살펴보고, 생각의 수단인 언어와 시각을 검토하는 여정은 물리학에서 출발한 기획의 필연적인 수순이라고 할수 있다" 라고 하고 있습니다. 얼마나 흥미로운 이야기입니까!

5. 수학교사를 위한 프랙탈 기하
생각보다 얇은 두깨에 놀랬던 책입니다. 그래서 그런지 내용이 그다지 충실하지 못하다는 생각을 합니다. 기분탓인지.. 아직도 손에 잘 안잡히는 책..


오늘 구입한 책입니다.. 최근들어 개발 공부를 좀더 심도있게 해야겠다는 생각이 들었습니다. 무엇인가를 만들고자 할때 어디서부터 어떻게 시작해야 할지 항상 고민이 되어서 소프트웨어 구조에 대해서 공부를 해야겠다고 느꼇습니다.

이 책은 재미있게도 1장에서 초인지, 두뇌를 정복하는 방법에 대해서 이야기 하고 있습니다. 사실 이 내용이 끌려서 책을 구입한걸수도.. ㅎㅎ

풍부한 예제와 초보자를 배려한 세세한 설명, 다양한 그래픽적 요소들로 책을 읽는데 지루함을 덜하고 본연의 임무에도 충실한 괜찮은 책인것 같습니다. 이책은 다 읽고 다시한번 리뷰해야겠네요 ㅎㅎ



저작자 표시 비영리 변경 금지
Posted by 웹눈
아래와 같이 내장 API인 Matrix3D 을 사용해서 객체를 X,Y,Z 축으로 로테이션 시켜보려하였습니다.

_mat = new Matrix3D();
_mat.identity();
_mat.appendRotation(1, Vector3D.Y_AXIS) ;

_vec = new Vector3D(100,0,0) ;

private function loop(e:Event):void
{
_vec = _mat.transformVector(_vec) ;

_obj.x = _vec.x ;
_obj.y = _vec.y ;
_obj.z = _vec.z ;
}

그런데 위와 같이 실행하면 _vec (Vector3D) 의 x,y,z 성분이 모두 0으로 수렴(?) 하게 되네요. 레퍼런스를 찾아보면 Matrix3D 의 transformVector 멤버함수는 매개변수로 넘어온 벡터에 변환을 적용한후 새로운 Vector3D 객체를 반환한다고 나오는데 해석을 잘못한건지 ..

그래서 일단 CustomMatrix3D 클레스를 만들어 보았습니다.

CustomMatrix3D 를 사용해서 위와 같은 시도를 해보았습니다.
package example.matrix {
   
    import flash.display.Shape;
    import flash.events.Event;
    import flash.geom.Vector3D;
   
    import flash.display.Sprite;

    /**
     * @author Lee
     * http://webnoon.net
     */
    public class MatrixMain extends Sprite {

       
       
       
        private var _vec : Vector3D;
        private var _ball : Shape;
        private var _mat : CustomMatrix3D;

        public function MatrixMain() {
           
           
           
           
            _vec = new Vector3D(100,0,0) ;
            _vec.w = 1 ;
            var rad : Number = Math.PI/180 ;
           
            _mat = new CustomMatrix3D() ;
            _mat.rotationY(rad) ;
            //_mat.rotationZ(rad) ;
            //_mat.rotationX(rad) ;
            //_mat.translation(0, 1, 0) ;
           
            _ball = new Shape();
            with(_ball.graphics)
            {
                beginFill(0xff0000) ;
                drawCircle(.0, .0, 10) ;
                endFill();
            }
            addChild(_ball) ;
           
            addEventListener(Event.ENTER_FRAME,loop);
        }
       
        private function loop(event : Event) : void {
           
            _mat.transformVector(_vec) ;
           
            _ball.x = _vec.x + stage.stageWidth/2;
            _ball.y = _vec.y + stage.stageHeight/2 ;
            _ball.z = _vec.z ;
           
        }
    }
}

[소스코드]

아래는 실행 결과...


rotationX,Y,Z , translation 모두 잘 적용됨을 알수 있습니다.

Flash Builder4 에서 실행결과 flash.geom.Matrix3D 사용에는 이상이 없었습니다.
오류(?) 가 발생한 환경은 FDT + Flash CS4(컴파일) 입니다.
개발 환경이 잘못된건지 제가 실수한건지 정확히 알수는 없지만 Flash Builder4 에서 실행한 코드는 같은 코드로 실행하였습니다.

저작자 표시 비영리 변경 금지
Posted by 웹눈

Mages는 안드로이드와 다른 모바일 기기를 위한 멀티플레이어 클라이언트/서버 게임 엔진입니다. http://code.google.com/p/mages/

저작자 표시 비영리 변경 금지
Posted by 웹눈

XML 파일을 수정할때 종종 생기는 오류 메세지입니다. 정확한 원인은 모르겠지만 컴파일 차원에서 오류가 생기는것 같네요. 아무튼 해결법은 아래와 같습니다.

 오류 메세지에 마우스 오른쪽 버튼 클릭후 "Delete"를 선택.

저작자 표시 비영리 변경 금지
Posted by 웹눈
TAG Android

SMASHING 에서 Showcase Of Beautiful Vertical Navigation Designs 라는 제목으로 훌륭한 네비게이션 디자인을 소개하고 있네요.
디자인이 훌륭한 메뉴 예제
저작자 표시 비영리 변경 금지
Posted by 웹눈
a simple cairnngorm logic flow example

출처 - ProfessionalCairngorm
저작자 표시 비영리 변경 금지
Posted by 웹눈
저작자 표시 비영리 변경 금지
Posted by 웹눈
Mockingbird 에서는 웹 사이트 스토리 보드 작성 어플리케이션을 제공하고 있습니다.
그림 1-1. 에서 볼수 있듯이 웹사이트 각각의 요소를 위젯처럼 추가/제거 할수 있게 되어 있네요.

스토리 보드 툴 웹 어플리케이션

그림 1-1



저작자 표시 비영리 변경 금지
Posted by 웹눈

벡터 외적 연산의 핵심은 연산한 결과가 연산한 두 벡터에 수직인 벡터로 표현된다는 점이였습니다.
외적 연산의 수학적 표기방법은 X 를 사용합니다.
(내적은 dot를 사용해서 dotproduct , 외적은 X 를 사용해서 crossProduct라고 불립니다.)



위 SWF 에서 볼수 있듯이

 녹색 선은 L2 벡터.
빨간색 선은 L1 벡터.
파란색 선은 L3 벡터. 로 표현하고 있고,

 L2 X L1 = L3 의 결과를 나타내고 있습니다.

 화살표키로 로테이션 시킬때마다 L2 X L1 의 연산결과를 나타내고 있습니다.

 

내장 Vector3D API 를 사용한 연산은 아래와 같습니다.

var l1 : Vector3D = new Vector3D(100,0,0);
var l2 : Vector3D = new Vector3D(0,100,0) ;
var l3 : Vector3D = l1.crossProduct(l2) ;

 

위 코드에서 벡터 l1은  방향은 x축방향이고 크기는 100 인 벡터입니다.
l2 는 방향은 y축 방향, 크기는 100인 벡터입니다.

 두 벡터의 외적 연산 결과는 l3로 벡터이며, 크기는 |l1|*|l2|*sin@ (여기서 @는 l1과 l2의 사이각) 이고 방향은 양의 Z축과 평행한 방향입니다.(l1과 l2의 수직한 방향).

 만약 여기서 외적 순서를 바꿔서 l2.crossProduct(l1) 을 하게 되면 l3는 크기는 위와 같고 방향은 음의 z축방향을 향하게 됩니다.

 여기서 볼수 있듯이 외적계산은 교환법칙이 성립하지 않으며, 이러한 성질을 이용해서 3D 엔진에서 평면을 렌더링할때,평면이 앞을 바라보고 있는지 뒤를 바라보고 있는지 알수 있습니다.

 예를들어, l3와 시선벡터 Vector(0,0,-1)를 내적을 하게 된 결과가 양수이면 앞면을 바라보고 있는것이고, 음수이면 뒤를 바라보고 있는것입니다.

 

위 예제 sWF에서 l3와 Vector(0,0,-1)을 내적해서 양수(앞면)이면 노란색으로 평면을 칠하고, 음수(뒷면)이면 회색을 칠하도록해보았습니다.

저작자 표시 비영리 변경 금지
Posted by 웹눈
어제 지돌스타님의 10만개 입자를 이용한 유체 시뮬레이션 포스팅에서 최적화에 관한 팁을 보고 간단한 시뮬레이션을 만들어 보았습니다.

플레시 10만개 파티클 particle 테스트

그림 1-1. 대충 이러한..


대충 모양은 그림 1-1과 같습니다. 마우스 포지션에 따라 각각의 파티클들이 적절한 힘을 받도록 해보았습니다. 그런데 분명 지돌스타님의 시뮬레이션보다 연산하는 양이 매우 적었음에도 불구하고 지돌스타님의 시뮬레이션과 같은 속도는 나오지 않았습니다.

그래서 차이점이 무엇인가 곰곰히 생각해보니, 마우스에 대한 인터랙션 부분이 보였습니다.

매번 프레임마다 수행되는 mouseX, mouseY의 값을 임의의 특정한 값으로 고정시켜 보았습니다.
var dx : Number = pt.x - mouseX ;
var dy : Number = pt.y - mouseY ;

//이부분을 아래와 같이..
var dx : Number = pt.x - 200 ;
var dy : Number = pt.y - 200 ;

그랬더니 체감 속도가 엄청 향상된것을 느낄수 있었습니다. (디버깅 모드는 귀찮아서 패스..)
아무래도 mouseX와 mouseY 가 많은 비용을 필요로 한다는것을 경험할수 있었습니다.

*추가사항

위와 같은 문제점에 대해서 hika님이 해결 방법을 알려주셨습니다.

실시간으로 fps를 측정하여서 render주기를 조절하는 방법입니다.
var time:uint
++fps;
time = getTimer();
if( time > fpsNext ){
fpsNext = time + 1000;
renderRate = 1000 / fps;
fps = 0;
}
if( time > renderNext ){
mx = mouseX;
my = mouseY;
renderNext = time + renderRate; 
}



저작자 표시 비영리 변경 금지
Posted by 웹눈

네이버캐스트에서 오늘의 미술란에 "회화에 있어 공간 표현과 원근법" 이라는 제목으로 좋은글이 올라 링크!
http://navercast.naver.com/art/theme/2355

회화에 있어 공간 표현과 원근법

저작자 표시 비영리 변경 금지
Posted by 웹눈

이 오류로 몇일을 허비했는지 모르겠습다.

분명 JMyron 인스톨 가이드대로 모든 dll 설치와 경로를 잡아주었는데도 불구하고 위에 오류가 발생했던 이유는..
MSVCP71.DLL 과 MSVCR71.DLL 파일이 없었기 때문이었습니다.

위 두 파일은 http://whitewnd.tistory.com/10 에서 다운받을수 있고, 오류가 났던 이유와 설치 가이드가 있습니다.

저작자 표시 비영리 변경 금지
Posted by 웹눈