'프로그래밍'에 해당되는 글 109건

  1. 2011/12/26 C++ Template을 활용한 FactoryPattern 일반화 하기
  2. 2011/06/27 Verlet Integration - 게임에 어울리는 객체 운동 시뮬레이션
  3. 2010/10/20 3D 농구게임 - 플래시 (2)
  4. 2010/07/23 유머나라에 올라간 예전에 만들었던 플래시 (2)
  5. 2010/07/08 Actionscript 3 - 읽기쉬운 프로그래밍 하기 (2)
  6. 2010/07/03 플렉스로 만든 웹기반 그래픽 저작 툴 – Sumo Paint (2)
  7. 2010/07/01 중복을 최소로 하는 프로그래밍 하기 (4)
  8. 2010/06/29 플래시의 uint 표현방법
  9. 2010/06/26 Actionscript Project 로 Air 프로그래밍 하기
  10. 2010/05/26 플래시의 정수 표현 방법 - 2의 보수 표기법 (3)
  11. 2010/05/03 게임 서버 프로그래밍의 배경지식 (2)
  12. 2010/05/01 jQuery 강좌 - 핸드폰 번호만 입력받기 (6)
  13. 2010/04/30 심심풀이로 만들어본 플래시 게임
  14. 2010/04/28 Actionscript3 - Matrix3D 의 버그?? (5)
  15. 2010/04/24 안드로이드 멀티플레이 게임 엔진 - Mages
  16. 2010/04/21 Android & Eclipse - "unparsed aapt error" 오류 해결 (1)
  17. 2010/04/18 간단한 Cairngorm 로직 예제
  18. 2010/04/07 벡터의 외적 연산
  19. 2010/04/03 플레시 Actionscript 3.0 - 10만개 파티클 테스트 mouseX의 비용 체험 (6)
  20. 2010/04/02 Processing JMyron can't find dependent libraries 오류 발생 해결 (3)
  21. 2010/03/25 jQuey 강좌 7 - 폰트 크기 변경하기 (2)
  22. 2010/03/20 flash - 3D rendering Test 와이어 프레임
  23. 2010/03/18 Processing & Eclipse - 비디오(video) 출력하기 (1)
  24. 2010/03/17 Processing - 원하는 폰트 Eclipse에서 사용하기
  25. 2010/03/17 Processing 이클립스(Eclipse)에서 사용하기
  26. 2010/03/03 Actionscript 3 - Catmull-Rom Spline curve code
  27. 2010/02/26 Actionscript 3.0 /flash drawing
  28. 2010/02/13 JOGL - glOrtho 와 Viewport의 개념잡기 (1)
  29. 2010/02/07 jQuery 강좌 - Selector(선택자) 개념 (2)
  30. 2010/02/04 컴퓨터가 그린 설리와 손담비 (3)

  저는 같은 카테고리에 속하는 다양한 Device들의 인터페이스를 일반화 하고 생성 함수를 만들어서 클라이언트 코드가 특정 구현객체에 의존하지 않을 수 있도록 하기 위해 Factory Pattern을 사용합니다. 주로 사용성은 아래와 같습니다.

 

   1:  //Radiometer 카테고리의 디바이스.
   2:   
   3:  DevRadiometer* radiometer = DevRadiometerCreator::Instance().Create( “K6485” );
   4:   
   5:  DevRadiometer* radiometerEmul = DevRadiometerCreator:Instance().Create( “emulator” );
   6:   
   7:   
   8:   
   9:  //Thermometer 카테고리의 디바이스.
  10:   
  11:  DevThermometer* thermometer = DevThermometerCreator::Instance().Create( “pk2000” );
  12:   
  13:  DevThermometer* themometerEmul = DevThermometerCreator::Instance().Create( “emulator” );
  14:   

  위와 같이 Device 종류 별로 Factory 클래스를 만들어서 사용을 해 왔었는데요. 각각의 Factory 클래스 마다 반환하는 특정 클래스를 제외하면 구현 내용은 중복이 되었습니다. 이러한 중복을 제거하기 위해서 Template을 사용하여 Factory 자체를 일반화 하는 것을 구상해 보았습니다. 사용성은 아래와 같습니다.

   1:  DevRadiometer* radiometer = Factory<DevRadiometer>::Instance().Create( “K6480” );
   2:   
   3:  DevRadiometer* radiometerEmul = Factory<DevRadiometer>::Instance().Create( “emulator” );
   4:   
   5:   
   6:   
   7:  DevThermometer* thermometer = Factory<DevThermometer>::Instance().Create( “pk2000” );
   8:   
   9:  DevThermometer* thermometerEmul = Factory<DevThermometer>::Instance().Create( “emulator” );
  10:   
  위와 같이 Factory Template 클래스를 한번 구현해 놓으니 수정이나 기타 구현이 필요 없이 재사용이 가능한 것 같습니다. 구현 코드는 파일로 첨부 하였습니다.

Posted by 웹눈

  이곳에 가시면 Verlet Inegration의 구현에 대해 매우 상세히 설명되어 있는 글을 보실 수 있습니다. 설명되어 있는 예제가 html5의 Canvas를 이용하였기 때문에, 크롬 브라우저나 파이어폭스 혹은 익스 9 버전으로 확인 하셔야 합니다.


위의 예제는 Verlet Integration을 이용하여 구현해본 것입니다.  전에 Euler Integration을 사용하여 비슷한걸 구현해 본적이 있는데요. Verlet Integration을 이용하면 놀라울 정도로 간단히 구현할 수 있습니다.

Posted by 웹눈

( 위 아래 화살표로 화면 회전 가능합니다 )
3D 링과 백보드 충돌 테스트를 해볼겸 만들었던 것입니다.

회전력에 대한 운동도 구현해 보아야 겠습니다.

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

10만개 파티클 

제가 만든게 웹상에 돌아다니니까 신기하네요.. 지돌스타님이 손봐주신거지만.. ㅋㅋ

http://webnoon.net/entry/플레시-Actionscript-30-10만개-파티클-테스트-mouseX의-비용-체험

Posted by 웹눈

Actionscript 3 로 만든 프로그램을 이해하기 위해서는 프로그램의 수행흐름을 따라가야 합니다. 즉, 머리속에 현재 프로그램의 수행상태, 제어흐름, 데이터 흐름등을 파악하고 있어야 합니다.

저는 플래시 프로그래밍을 하다보면, 이벤트 모델의 사용으로 인해 수많은 함수 분기가 일어나서 나중에 그 프로그램을 다시 보았을때 수행흐름을 파악하는데 어려움을 겪었습니다.

즉, 제가 원했던 것은 아래와 같은 수행흐름을 이해하기 편한 표현방법 이었다면,

이해하기 쉬운 플래시 프로그래밍 하기

실제로는 아래와 같이 되는게 일반적이였습니다.

읽기 쉬운 프로그래밍 하기

이렇게 되면 구현내용을 일일이 파악해야지 이 프로그램이 무엇을 하는것인지 이해가 가능할것입니다.

이런 어려움을 겪고 있던 저는 얼마전 구세주와 같은 해결방법을 보게되었습니다. 바로 hika님이 포스팅 하신 “Message Queueing 서비스” 라는 포스트입니다. hika님이 알려주신 팁을 적용하면, 위와 같은 문제점은 대략 아래와 같이 해결가능해졌습니다.

이해하기 쉬운 플래시 프로그래밍 하기

(위에 예를든 프로그램과 별개입니다. 헷갈리실수도 ^^;) 아래는 디버그 결과입니다.

이해하기 쉬운 프로그래밍 - 디버그 결과

init 함수 안에 이 프로그램에 대한 수행흐름을 모두 나타낼수 있었습니다. 이로써 자세한 구현사항을 파악하지 않아도 이 프로그램이 무엇을 하는 프로그램인지 보다 쉽게 이해가 가능해진것 같습니다.

 

p.s - 제목은 마치 읽기쉬운 프로그래밍을 할수 있는 방법을 제시할것처럼 해놓았지만 결국은 “Message Queueing 서비스”에 대한 저의 감상문 정도의 글이 였습니다. ^^; 개인적으로 이런 훌륭한 팁을 마구마구 알려주시는 hika님께 매우 감사드린다는… 아무튼, 보다 구체적이고 원론적인 내용을 원하시는 분들은 위에 언급한 포스트를 읽어보세요.

Posted by 웹눈

웹기반 소프트웨어에 대한 자료를 조사하던중 플렉스로 제작된 그래픽 저작툴을 발견하였습니다. 아무래도 포토샵에 비해서는 기능이 부족해보이지만 플렉스로 이런 소프트웨어를 만들었다는 자체가 저에게는 놀랍기만 하네요.

 

플렉스로 만든 그래픽 저작툴 - sumo paint

Sumo Paint는 보시는 바와같이 무료는 아니지만 Try Online 버튼을 클릭하시면 테스트하실수 있습니다. 아래는 테스트 화면입니다.

Sumo Paint 실행화면 - 플렉스로 만든 웹기반 소프트웨어

Posted by 웹눈

리팩토링전의 클래스 다이어그램

위의 클래스 다이어그램은 리팩토링 하기전의 클래스 다이어그램 입니다. 언뜻보기에는 문제가 없어보이지만, AlphaStyleSoftJob과 AlphaStyleHard 클래스에서 AlphaStyle에 관한 코드가 있을듯 합니다. 또한 BetaStyleSoftJob과 BetaStyleHardJob도 마찬가지로 BetStyle에 관한 코드가 있을것 같습니다.

이러한 것을 리팩토링에서는 {중복된 코드}라는 코드의 악취라고 합니다.

중복이 발생하게 되면 유지보수 단계에서 많은 비용이 발생하게 됩니다. 위의 예로, AlphaStyle에 대한 속성값을 변경할라치면 AlphaStyleSoftJob과 AlphaStyleHardJob이라는 두개의 클래스 모두 변경이 필요합니다.

“켄트 벡의 구현 패턴” 에서는 위와 같은 중복을 없애는 한가지 방법으로 프로그램을 여러가지 작은 부분 – 짧은 구문, 짧은 메소드, 작은 객체, 작은 패키지 – 으로 나누라고 하고 있습니다.

위의 클래스 다이어그램에서 보이는 하위 클래스 AlphaStyleSoftJob에는 두개의 개념이 포함되어 있습니다. 이러한 부분을 두가지 개념으로 나누어서 개념의 중복을 없애 보면, Style과 Job 으로 나눌수 있을것 같습니다.

이렇게 나누어진 개념으로 다시 상속구조를 다이어그램으로 나타내어 본것은 아래와 같습니다.

image

위와 같은 구조에서는 대부분의 코드 변경이 지역적으로 일어날 것을 알수 있습니다.

'프로그래밍' 카테고리의 다른 글

중복을 최소로 하는 프로그래밍 하기  (4) 2010/07/01
CDATA !?  (0) 2009/04/22
Posted by 웹눈

저번에 “플래시의 정수 표현방법 - 2의 보수표기법” 이라는 제목으로 포스팅한 적이 있습니다. 그 포스트에 hika 님이 uint 에 관해서도 진리표 작성을 권유(?) 하셔서 한번 삽질을 해보았습니다.

우선 uint는 양의 정수만을 표현할때 사용하는 기본형으로, 32비트를 사용하여 양의 정수를 표현한다고 레퍼런스에 나와있습니다. 최대값이 int 형의 두배가 된다고도 나와있는데 (즉, 2^32  – 1 ,정확히 두배는 아니…음..) 여기에서 32비트 전부를 수를 표현하는데 사용한다는걸 알수 있었습니다.

그럼 간단히 테스트를 해본 결과를 보겠습니다.

플래시의 uint 표현방법

위 그림과 같이 255 크기의 uint 를 byteArray에 쓰고, 한 바이트씩 읽었습니다.

여기서 4번째 바이트를 읽어왔을때 반환값이 –1 인것을 볼수 있는데, 이것은 ByteArray의 readByte() 메소드는 int형을 반환하고, 2의 보수표기법을 사용하는 int형은 비트열 11111111 을 -1로 표현한다는것을 알수 있습니다.

따라서 플래시의 uint형은 비트열의 32비트열의 2진 체계를 그대로 10진법으로 변환하여 표현해주는 방식을 사용한다고 볼수 있겠습니다.

Posted by 웹눈

플래시 빌더4를 사용해서 Actionscript Project 형식으로 Air 프로젝트를 생성 하는 방법을 알아보겠습니다.

 

1. File > New > "Flex Project"
2. 프로젝트 이름을 입력합니다. 예로, “Foo”
3. "Desktop (runs in Adobe AIR)" 를 선택합니다.
4. "Finish" 버튼을 클릭.
5. "Foo.mxml" 지웁니다.
6. File > New > ActionScript Class 에서 Sprite 를 상속받는 Foo.as 파일을 생성합니다.
7. 완료 버튼 클릭.
8. "Foo.as" 파일에 마우스 우측 버튼을 클릭후,  "Set as Default Application" 를 선택합니다.
9. Foo.as 생성자에 다음과 같이 입력합니다. "this.stage.nativeWindow.visible = true;"
10. Run & Done!

image

Posted by 웹눈

플래시에서 정수를 표현하기 위해 어떤 비트패턴을 사용하는지 알아보고 정수를 사용할 때 나타날수 있는 이슈사항들에 대해 알아보도록 하겠습니다.

 

1. 컴퓨터의 정수표현 - 2의 보수 표기법

 

2의 보수 표기법(two’s complement) 은 컴퓨터에서 정수 표현에 사용되는 표기법이며 다른 표기법으로는 초과 표기법이 있습니다.

이 글에서는 플래시에서 정수를 표현하는데 사용되는 2의 보수 표기법에 대해서 알아보도록 하겠습니다.

 

현재 플래시는 길이가 32인 비트패턴을 사용하여 정수를 표현하고 있습니다. 여기서는 2의 보수 표기법이 무엇인지 설명하기 위해 내용전달이 충분히 가능면서 보다 설명하기 편한 길이가 4인 비트패턴을 사용하겠습니다.

 

2의 보수 표기법은 양수와 음수의 정보를 나타내는 하나의 최상위 비트와 나머지 값을 나타내는 비트들로 이루어져 있습니다. 길이가 4인 비트패턴으로 예를 들면 아래 표와 같습니다.

 

비트 패턴

표현 값

0111
0110
0101
0100
0011
0010
0001
0000
1111
1110
1101
1100
1011
1010
1001
1000

7
6
5
4
3
2
1
0
-1
-2
-3
-4
-5
-6
-7
-8

 

2의 보수 표기법에서 최상위 비트(제일 왼쪽 비트) 0은 양수를 , 1은 음수를 표현합니다. 이는 부호비트(sign bit) 라고 불립니다. 나머지 3비트는 정수의 크기를 나타내는데, 양수 표현에서는 일반 2진 체계로 정수를 나타내는 방법과 동일합니다. 즉, 정수 3은 2진 체계로 010 의 값으로 나타낼수 있습니다.

 

여기서 음의 정수를 표현한 비트패턴과 양의 정수를 표현한 피트패턴 사이에는 재미있는 규칙이 있습니다. 양의 정수 비트패턴을 오른쪽에서 왼쪽으로 읽어나갈 때 처음으로 1이 나오는 부분까지는 양과 음의 비트패턴이 같고, 나머지는 양의 정수 비트패턴과 보수관계 입니다. 예를 들어 정수 2와 -2의 비트 패턴을 살펴보면, 비트 패턴의 오른쪽으로 부터 2번째에 처음으로 1이 나오고, 3번째 부터는 양수와 음수의 비트패턴이 보수관계에 있는것을 볼수 있습니다. (보수 관계란 1은 0 , 0은 1 이 되는것을 말함.)

 

위의 보수 관계를 이용하면 음의 정수 7의 비트패턴을 양의 정수 7의 비트패턴을 이용하여 구할수가 있는데, 다음과 같이 양의 정수 7의 비트패턴을 구하고 (0111), 오른쪽으로부터 처음으로 1이 나오는 자리 다음부터 보수를 취하면 됩니다. (1001)

 

2. 플래시의 int 를 사용할때 나타날수 있는 이슈사항

 

정수를 표현하기 위해 이용하는 비트의 자리수에 따라 표현할수 있는 정수의 최대값과 최소값이 정해지는데, 위의 4비트로 예를 들면, 부호 비트 하나를 제외한 나머지 비트열들의 경우의 수 만큼 정수를 표현할수 있습니다( 즉, 양수는 2^3 –1 , 음수는 - 2^3 ).  플래시는 정수를 표현하기 위해 길기가 32인 비트패턴을 사용하므로, 최대값은 2^31 – 1 , 최소값은 -2^31 이 됩니다.

 

얼마전 팀에서 모 증권 사이트 프로젝트를 진행한적이 있는데, 다른 팀원분이 금액을 나타내기 위해 int 형을 사용해서 이슈가 되었던 적이 있습니다. 즉, 원(WON) 단위 금액을 표현하는데, 최대로 표현할수 있는 수 2,147,483,647 (약 21억) 을 넘어가니까 오버플로(overflow) 가 발생한것이지요.

 

 

 

Posted by 웹눈
http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc&page=18&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=73
저작자 표시 비영리 변경 금지
Posted by 웹눈
과제
폼 입력에 사용자가 숫자와 +, - 기호만 입력할수 있게 하고 싶다.

해결

먼저 아래와 같이 라벨과 submit 버튼 그리고 오류메세지 필드를 만들어 봅시다.

<form id="signup" method="post" action="">
<div><span class="test_label">핸드폰 번호를 입력하세요. </span><input type="text" class="test_infobox" name="phone" />

<span class="test_error">숫자와 +,- 만 입력하실수 있습니다.</span></div>
<input class="test_submit" type="submit" value="입력">
</form>

각 엘리먼트의 class 속성에 각각 "test_label" , "test_infobox", "test_submit", "test_error"를 지정해줍니다.

스크립트 소스는 아래와 같습니다.

$(document).ready(function() {
$('.test_error').hide();
$('.submit').click(function(event){
var data=$('.test_infobox').val();
if(validate_phoneno(data))
{
$('.test_error').hide();
}
else
{
$('.test_error').show();
event.preventDefault();
}
});
});
function validate_phoneno(ph)
{
var pattern=new RegExp(/^[0-9-+]+$/);
return pattern.test(ph);
}

동작은 아래와 같이...

핸드폰 번호를 입력하세요. 숫자와 +,- 만 입력하실수 있습니다.


저작자 표시 비영리 변경 금지
Posted by 웹눈
회피(avoid) 게임의 일종입니다. 사실 이런 게임을 어디선가 보고 약간의 아이데이션만 추가해서 만들어본 게임입니다.
게임이라 하기에는 무리가 있을수도 있습니다. ^^;

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

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

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

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


녹색공을 마우스로 콘트롤하여 빨간색 공을 피하셔야 합니다. 빨간색 공끼리 충돌하면 일정 확률로 파란색 공이 되는데 그것을 드셔서 위험을 줄이세요!
저작자 표시 비영리 변경 금지
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
a simple cairnngorm logic flow example

출처 - ProfessionalCairngorm
저작자 표시 비영리 변경 금지
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 웹눈

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

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

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

저작자 표시 비영리 변경 금지
Posted by 웹눈
  • 시작하기 전에
  • 문제
    • 버튼이나 링크를 클릭해서 폰트의 크기를 변경하고 싶다.
      (대부분의 뉴스 사이트에서 구현되어 있는 기능)
      jQuery 강좌 - 폰트 크기 바꾸기

      그림 1-1


  • 해결
    • jQuery를 통해 현재의 폰트 사이즈를 알아낸 다음 그 수치에 버튼을 클릭할때마다 +1 이나 -1 을 해줌으로써 폰트 사이즈를 변경합니다.
  • 토의
    • 위 그림 1-1 에서 볼수 있듯이 크게, 작게 링크를 클릭하게 되면 현재 폰트 사이즈에서 +1이나 -1을 해줍니다. 예제 소스는 아래와 같습니다.

      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>폰트 사이즈 바꾸기 - 웹눈의 웹이야기</title>

      <script type="text/javascript" src="jquery.txt"></script>
      <script type="text/javascript">
      //현재 폰트 사이즈를 저장할 전역 변수
      var currentFontSize ;
      //문서가 준비되었는지 이벤트를 걸어준다.
      $(document).ready(init);
      //초기화
      function init()
      {
      // 1. 크게, 작게 링크에 이벤트를 걸어줍니다.
      $("#fontControll li a").click(clickHandler);
      }
      //크게, 작게 링크가 클릭되었을때 처리하는 함수
      function clickHandler(e)
      {
      //이벤트 전파를 막는다.
      e.preventDefault(); 
      //크게, 작게 중 어느것이 클릭되었는지 판별
      var whichClicked = $(this).attr("id");
      //현재의 폰트 사이즈를 전역 변수에 저장한다.
      currentFontSize = parseInt($(".article").css("font-size"));
      //클릭된 링크에 따라 폰트를 크게 혹은 작게 설정합니다.
      switch(whichClicked)
      {
      case "larger" :
      //1폰트 크게한다.
      setFontSize(1) ;
      break ;
      case "smaller" :
      //1폰트 작게한다.
      setFontSize(-1) ;
      break ;
      }
      }
      function setFontSize($size)
      {
      var totalFontSize = currentFontSize + $size ;
      $(".article").css({"font-size":totalFontSize+"px"});
      }

      </script>

      <style type="text/css">

      #fontControll li{
      display:inline ;
      font-size:12px ;
      }

      .article {
      font-size:12px ;
      }

      </style>

      </head>
      <body>
      <div id="titles">
          <h1>폰트 크기 바꾸기 예제 - <a href="http://webnoon.net" target="_blank">웹눈의 웹이야기</a></h1>
          </div>
          <div id="fontSizeControllBox">
              <ul id="fontControll">
                  <li><a href="http://naver.com" id="larger">크게</a></li>
                  <li><a href="http://google.com" id="smaller">작게</a></li>
              </ul>
          </div>
          <div id="contents">
              <p class="article">
                  이번 예제는 뉴스 사이트에서 흔히 볼수있는 폰트 사이즈를 변경해보는것입니다.<br />
                  크롬, 파이어폭스, 익스플로어7 에서 테스트 되었습니다.<br />
                  이 예제의 자세한 설명은 웹눈 블로그 <a href="http://webnoon.net" target="_blank">http://webnoon.net</a> 에서 자세히 보실수 있습니다.
              </p>
          </div>

      </body>

    • 코드는 매우 직관적으로 짜여져 있습니다. 여기서 "이벤트를 걸어준다" 라는 말이 모호하게 느껴질수도 있는데, 이말은 "이벤트 발생을 탐지한다" 정로도 해석할수 있겠습니다.

      즉, $(document).ready([callbackFunction]) 에서는 "문서가 로딩이 완료될때 발생시키는 이벤트" 를 탐지하기 위해서 $(document) 객체에 ready라는 이벤트를 걸어주었습니다.

      마찬가지로 크게, 작게 링크[$("#fontControll li a")]에도 click 이벤트를 탐지하도록 이벤트를 걸어준것입니다.(여기서 걸어준다는 표현은 전문용어가 아니므로 참고해주시기 바랍니다.)

      나머지 부분은 주석으로 자세히 설명되어 있어서 더이상 설명은 생략하겠습니다만, 질문이 있으시면 언제나 댓글란을 이용해주세요.
  • 참고자료
저작자 표시 비영리 변경 금지
Posted by 웹눈
+ SpaceBar = 와이어 프레임 보이기 / 숨기기
+ Shift = 폴리곤 보이기 /숨기기

플레시 캠프에서 본것을 따라해보려고.. 우선 와이어 프레임으로 구성된 Shape과 렌더링 엔진만 만들어보았습니다.
다음에는 쉐이더를 얹힌 버전으로 업로드 해봐야겠습니다.
Posted by 웹눈
TAG 3d, flash
  • 문제
    • 웹캠을 통해 영상이미지를 출력하고 싶다.
  • 해결
    • Window 운영체제에서는 QuickTime과 vdig(video digitizer)를 설치한다.
    • 개발이 중단된 vdig 대신에 JMyron 라이브러리를 사용한다.
  • 토의
    • QuickTime은 검색엔진에서 손쉽게 검색해서 다운받을수 있다. QuickTime을 설치한후에는 vdig를 설치하자. 개발이 중단되었지만 http://eden.net.nz/7/20071008 에서 다운받을수 있다.
    • vidig를 인스톨한다.
    • processing 코드
      import processing.video.* ; //video 라이브러리를 임폴트함.
      import processing.core.*;

      public class VideoTest extends PApplet
      {

      private Capture cam ; // Capture 오브젝트 선언.

      public VideoTest()
      {

      }

      public void setup()
      {
      size(320,240);
      /* PApplet args0, int width, int height, int frameRate*/
      cam = new Capture(this,320,240,15);

      }

      public void draw()
      {
      if(cam.available())
      {
      cam.read() ;
      }

      image(cam,0,0) ;
      }
      }
  • 기타
    • JMyron 라이브러리는 모션 트래킹등을 손쉽게 할수 있는 메서드를 제공한다.
    • JMyron 관련한 예제는 추후에 하나씩 다루어보도록 하겠습니다.
  • 참고자료

Posted by 웹눈
  • 해결
    • PDE (Processing Development Environment) 에서 제공하는 CreatFont 기능을 사용합니다.
  • 예제
    • PDE 를 실행한다.
    • 프로젝트를 저장합니다. (저장하지 않고 실행할시 폰트파일이 만들어지지 않음.)
    • PDE 메뉴의 Tools -> CreatFont 선택.
      processing 팁, 폰트

      그림 1-1

    • 그림 1-1 과 같은 창이 뜨면 원하는 폰트를 선택한후 OK 버튼을 클릭합니다. 이때, Filename을 기억하고 있어야 합니다.
    • 위 그림 1-1 경우 ArialMT-36.vlw 파일이 프로젝트 폴더의 data 폴더 안에 생성됩니다.
    • 예제 코드
      PFont f; // STEP 2 Declare PFont variable
      void setup() {
      size(200,200);
      f = loadFont( "ArialMT-36.vlw " ); // STEP 3 Load Font
      }
      void draw() {
      background(255);
      textFont(f,16); // STEP 4 Specify font to be used
      fill(0); // STEP 5 Specify font color
      text ( " Mmmmm... Strings ... " ,10,100); // STEP 6 Display Text
      }
    • Eclipse 예제 코드
      package test;

      import processing.core.*;
      import processing.opengl.*;

      public class MyProcessingSketch extends PApplet{
         
          private float a ;
          private PFont f ;
          private float _x = 0.0f;
          private float _y = 0.0f;
         
          public MyProcessingSketch()
          {
             
          }
         
          public void setup()
          {

              size(800, 600,OPENGL);
               
                f = loadFont("asset/YGO550-48.vlw");
               
          }
         
         
          public void draw() {

              background(255);
              fill(0) ;
              textFont(f,16) ;
              textAlign(CENTER) ;
             
              rotateX(radians(_x)) ;
             
              translate(width/2, height/2) ;
              text("이",10*cos(radians(_x)),10*sin(radians(_x))) ;
             
              _x++ ;
             
          }
         
      }



Posted by 웹눈

참고 자료 : http://processing.org/learning/eclipse/

  1. 프로세싱 라이브러리를 Import 합니다.
    1. 이클립스 메뉴에서 FILE -> IMPORT -> GENERAL -> FILE SYSTEM을 클릭.
    2. "from directory"란에서 "Browse..."를 클릭하여 프로세싱 라이브러리가 있는 폴더를 지정합니다.
      Processing -> Contents -> Resources -> Java
    3. core.jar 를 선택후 "FINISH"를 클릭.
      processing eclipse

      이클립스 메뉴에서 FILE --> IMPORT --> GENERAL --> FILE SYSTEM.

  2. 아래 그림과 같이 "Packgae Explorer" 상에 core.jar 이 보여야 합니다.
  3. core.jar 아이콘을 마우스 오른쪽 버튼으로 클릭후 BUILD PATH --> ADD TO BUILD PATH 를 선택합니다.
  4. 아래와 같은 새로운 클레스를 생성하면 프로세싱 라이브러리 사용가능합니다.
    import processing.core.*;

    public class MyProcessingSketch extends PApplet {

    public void setup() {
    size(200,200);
    background(0);
    }

    public void draw() {
    stroke(255);
    if (mousePressed) {
    line(mouseX,mouseY,pmouseX,pmouseY);
    }
    }
    }



Posted by 웹눈



more..


사용방법은.. 곡선을 이을 포인트(x,y쌍) 배열을 매개변수로 넘긴다. $n 은 보간 정도..

ex)
var points : Vector.<Number> = Vector.<Number>(50,50,100,200,200,100,300,300);
var path : Vector.<Number> = CatmullRomSpline.curve(points,20) ;

path[2*i] -> x
path[2*i+1] -> y

Posted by 웹눈




Posted by 웹눈

glOrtho 와 glViewprt 는 화면에 그리고자 하는 Shape을 원하던 위치와 원하던 사이즈로 표현가능하도록 도와줍니다.

glViewport 는 윈도우상에 표현하고자 하는 사물이 그려지는 영역(area)를 정의합니다. 예를들어 사물이 표시되는 영역을 전체 영역으로 설정하는것은 아래와 같습니다.

glViewport(0, 0, ClientWidth, ClientHeight);
// 처음 두개의 매개변수는 좌측 하단 좌표, 나머지는 사이즈 정보값.

위와같이 설정하면 아래 그림처럼 윈도우 전체 영역에 걸쳐 사물이 그려집니다.


만약 윈도우 창의 좌하단 25픽셀 영역에서만 사물을 그려지게 하고 싶다면 아래와 같이 설정합니다.

glViewport(0, 0, 25, 25);

만약 처음 두개의 매개변수를 마이너스로 설정하면, 그려지는 영역은 화면 좌측으로 영역을 벗어나게 됩니다.

void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
procedure glViewport(x,y: GLint; width, height: GLsizei); stdcall;
x, y Specify the lower left corner of the viewport rectangle, in pixels. The default is (0, 0).
width, height Specify the width and height, respectively, of the viewport. When a GL context is first attached to a window, width and height are set to the dimensions of that window.

glOrtho

void glOrtho(GLdouble left,
GLdouble right,
GLdouble bottom,
GLdouble top,
GLdouble near,
GLdouble far)

procedure glOrtho (left, right, bottom, top, zNear, zFar: GLdouble); stdcall;
left, right Specify the coordinates for the left and right vertical clipping planes.
bottom, top Specify the coordinates for the bottom and top horizontal clipping planes.
near, far Specify the distances to the nearer and farther depth clipping planes. These distances are negative if the plane is to be behind the viewer.

glOrtho 는 glViewport 와 관련있지만 개념은 완전히 다릅니다. OpenGL에서는 기존의 윈도우 좌표체계를 완전히 무시할수 있습니다. 즉, glOrtho를 설정함으로써 자신이 원하는 좌표체계를 만들수 있습니다.

작업중인 윈도우 사이즈가 640X480 이라고 가정합니다. 하지만 당신은 이 윈도우 사이즈를 1 X 1로 설정할수 있습니다. 즉 1X1로 설정한 위도우에서 0.5X0.5 는 실제 윈도우 창의 320X240 좌표가 됩니다.
Posted by 웹눈
우리가 선택하고자 하는것이 무엇이든지, jQuery 는 달러 사인으로 된 함수: $() 로 시작을 하게 됩니다.
$() 함수는 일반적으로 html 태그와 ID , Class 속성값과 함께 사용됩니다.

표1. CSS와 jQuery 의 선택자 비교문
 Selector CSS
jQuery
설명
 ID  #ID_Name  $('#ID_Name') ID값이  'ID_Name' 을 가지는 하나의 엘리먼트를 선택합니다.
 Class  .Class_Name $('.Class_Name')
Class 속성값이 'Class_Name' 값을 가지는 모든 엘리먼트를 선택합니다.
 Tag  P  $('P') 모든 P 태그를 선택합니다.

여기서 주목할만한 점은 Class Selector와 Tag Selector는 해당하는 엘리먼트를 하나만 선택하는것이 아니라 조건이 만족되는 모든 엘리먼트를 선택하고 있다는 점입니다.

관련 자료
- jQuey Selector 종류
Posted by 웹눈

ㅋㅋ... 그리는 과정은 아래에..


Posted by 웹눈