지구별에서-MyLifeStory :: 'IT/JOGL(Java OpenGL)' 카테고리의 글 목록

달력

062017  이전 다음

  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  

'IT/JOGL(Java OpenGL)'에 해당되는 글 9건

  1. 2005.12.27 왜 도둑질이 나쁜가? (4)
  2. 2005.12.25 인터넷은 쓰레기인가? (2)
  3. 2005.12.06 Jogl에서 KeyEvent 쓰는 법
  4. 2005.12.05 Jogl에서 MouseEvent 쓰는 법
  5. 2005.12.04 Jogl을 JApplet 에 담는 법
  6. 2005.12.03 Jogl을 Applet에 담는 법
  7. 2005.12.02 Swing 을 사용하는 Jogl 코드의 해설
  8. 2005.12.01 Jogl 과 Swing
  9. 2005.12.01 JOGL
 

왜 도둑질이 나쁜가?

도둑질이 나쁘다는 것은 누구나 다 안다.  그리고 오프라인 세계에서 물건을 훔치는 짓을 하는 이는 그리 많지 않다.  인터넷을 항해하는 대부분의 네티즌도 오프라인 세계에서 도둑질을 한다는 것은 생각조차 못할 것이라 믿는다. 그런데 온라인상에서는 이런 도덕률이랄까 윤리관이 너무나 희박하다는 것을 아주 절감하고 있다.  

내가 도둑질이라 하는 것은 남의 저작물을 훔치는 행위를 말한다. "저작권침해"라는 것은 완곡어법이지 그것은 도둑질, 즉, 절도행위다.  그런데 왜 이런 절도행위가 오프라인에서는 감히 상상도 못하는 "양심적"인 사람들이  아무 죄의식 없이 다반사로 저지르는 것일가? 그것은 의식수준의 문제라고 생각한다.

먼저 저작자의 입장에서  생각해 보기로 한다.

 

1. 온라인상의 저작물은 타인의 재산이라는 생각이 희박하다.   온라인상에 공표된(published) 저작물은 타인의 재산이 아니라 공공재산이라 생각하는  사람이 많다.  누가 지키고 있는 것도 아니고  저자가 익명을 쓰는 경우가 더욱 그러하다.   공공재산은 훔쳐도 양심의 가책을 덜 받는 사람이 의외로 많이 있다.  남의 집에 들어가 꽃이나 나무를 꺾지 않아도 공원에서 그런 짓을 하는 사람들을  자주 본다.  공공의 재산은 훔쳐도 덜 죄가 된다는 의식을 가진 사람들이다.  그러나 인터넷상에서도 모든 공표된 저작물에 주인이 있다는  사실을 알아야 한다.  또 공공 재산이라 해도 관리인이 있고 베껴 간다면 허락을 받아야 한다.  

 

2. 훔쳐가도 없어지는 것이 없다는 의식이다.  온라인상의 저작물은 베껴가도 그 자리에 그대로 남아 있으니 해를 끼치지 않았다는 의식이다.  오프라인 세계의 물리적 대상은 유일한 존재이기 때문에 훔쳐가면 주인은 물건을 잃게 되고 따라서 주인에게 해를 끼치게 되지만 온라인 세계에서는 베껴 갈뿐 가져 가지 않았다는 의식이다.  초등학교 수준의 의식구조를 갖는 사람이라면 그렇게 생각할 것이다. 그러나 오프라인세계에서 제대로 어른행세를 하고 어른 대접을 받는 이가 이런 의식수준을 갖고 있다면 참으로 한심한 일이다.

 

3. 내가 훔쳐다 내 홈페이지나, 블로그 또는 포탈사이트의 카페에 올리는 행위는 원저작자에 이로운 일을 하는 행위로 착각을 하는 네티즌이 있는것 같다. 원저자의 이름까지 밝히면 더욱 그렇다고 생각하는 사람들이 있다.  이것은 오프라인세계에서는 멀정하고 존경받을 만한 시민인 경우에도 자주 보게 된다.  이런 사람은 대부분 자신이 한번도 저작물을 창작한 일이 없는 사람들로서 저작자의 입장에 서 본 일이 없는 사람들이다.  저작물이 어떤 소유권을 가지며  어떻게 유통되는지  모르는 사람들이다.    저작자의 공적(credit)이라는 개념에 대한 인식이 없는 사람들이다.    저작물이란 경우에  따라서는 돈이 될 수도 있는 소유권이다.   그러한  권리가 자신이 원하지 않고 자신도 모르는 곳에 또 자신의 손으로 어쩔 수 없는 곳에 퍼져 버리면  원저작자에게 어떤 정신적이고 경제적인 손실을 입히게 될까를 생각해 보아야 한다.  

 

 이번에는 이런 행위를 저지르면 공공에 끼치는 해악에 대하여 생각해 보기로 한다.

 

1. 이러한 행위는 원저작물을 왜곡 훼손하여 전달된다.  아무리 컴퓨터가 정밀한 기계라 하여도 옮겨가는 과정에서 훼손되기 쉽다.   또 옮기는 이가 가감을 해서 자기것인양 포장을 하면 더더욱 왜곡훼손의 정도는 심각해 진다.  특히 컴퓨터 프로그램과 같은 것은 컴마하나 빠져도 기호하나 없어도 에러가 난다.  원저작자의 명예를 실추시킬 뿐 아니라  정보를 구하기 위해 항해하는 네티즌에게 오염된 정보를 전달하게 된다.  더욱 더 심각한 것은 소위 검색엔진이라는 로봇은 정보의 옥석을 구별할 줄 모른다.  인테넷상의 컨텐츠에는 등급이 없기 때문에 멍청이 검색 엔진은 제일 먼저 이런 "짝퉁"  컨텐츠를 진품 저작물에 앞서 인도 해 준다.  내가 내 강좌를 훔쳐간 사실을 알게 된 것도 내 강좌항목을  멍청이 검색엔진에게 검색 의뢰한 결과 베껴간 블로그로  나를 인도해 주었기 때문이었다.

 

2. 멍청이 검색엔진은 짝퉁을 좋아한다.  이것은 참으로 심각한 문제라고 생각한다.   왜냐하면 소위 포탈 사이트라는 인테넷의 중계소가 상업적으로만 운영되고 인터넷교통량(traffic)위주로 중요도를 매긴다.  따라서   주로 남의 저작물을 훔쳐다  치장하는 블로그나 카페가 교통량이 많기 때문에  멍청이 로봇은 짝퉁을 좋아하게 된다.   

 

3. 짝퉁 사이트는 정보의 원활한 흐름을 왜곡한다.   한 보기를 들겠다.  내 강좌 10 여편을  불법 전재한  한 카페가 있었다. 그런데 그 카페의 운영자라는 사람이 그럴듯한 물리 강좌를 여러편  게시해 놓았다.   그 모든 강좌는 그 운영자가 저작한 것처럼 진열되어 있었다.  한 강좌를 열어서 읽어 보니 대학교수가 아니면 쓸 수 없는 고급 내용이었다.   교수가 한가하게 그런 포탈사이트의 카페를 운영할 것 같지 않아 의아하게 생각하고 이리저리 카페를 둘러 보다가 그 강좌의 출처를 알게 되었다.  그 강좌는 P대학 I 교수가 쓴 글로서 한국 물리학회의 홍보지인 "물리학과 첨단기술"에 실린 글을 무단 전재한 것이었다.   

문제는 검색엔진이 고급정보를 찾는 네티즌에게 이런 짝퉁사이트로 유도한다는 데에 있다.  한국물리학회의 이 홍보지도 아주 오래된 기사나 논문을 아직도 인테넷상에  남겨 놓아 네티즌에 써비스하고 있다.  그런데 검색엔진은 이런 짝퉁만을 선호하기 때문에 고급정보를 차단하는 결과를 가져 온다.  다시 말해서 "옥"은 이런 쓰레기들에 가려져 일반 네티즌은 찾아 낼 수 없게 만들고 있는 것이다.  

 

4. 끝으로 이러한 행위는 잠재적 저작자에게 고급컨텐츠를 생산할 의욕을 상실하게 만든다.  결과적으로 인터넷을 쓰레기더미만 양산한다.   이것은 이미"인터넷은 쓰레기인가?"에서 언급하였므로 줄이기로 한다.

 

결론적으로 말하면 좋게는 저작권 침해요,  노골적인 표현을 쓰면 도둑질이 자신까지 포함해 그 누구에게도 도움이 되지 않는 행위라는 것을 깨달았으면 한다.  

 네티즌이 알아야 할 저작권 상식

신고

'IT > JOGL(Java OpenGL)' 카테고리의 다른 글

왜 도둑질이 나쁜가?  (4) 2005.12.27
인터넷은 쓰레기인가?  (2) 2005.12.25
Jogl에서 KeyEvent 쓰는 법  (0) 2005.12.06
Jogl에서 MouseEvent 쓰는 법  (0) 2005.12.05
Jogl을 JApplet 에 담는 법  (0) 2005.12.04
Jogl을 Applet에 담는 법  (0) 2005.12.03
Swing 을 사용하는 Jogl 코드의 해설  (0) 2005.12.02
Posted by 샛솔

댓글을 달아 주세요

  1. 반찬@  댓글주소 수정/삭제 댓글쓰기 2012.10.04 18:16 신고

    우연치 않게 교수님이 만드신 물리로 배우는 플래시 라는 사이트를 접하게 되었습니다. 정말 필요한, 알고 싶은 내용들이 가득 합니다. 얼굴은 뵌적 없지만 감사히 배우겠다는 말 남기려 왔는데 저작권 관련 글에 안타까운 맘이 드네요. 전 이제 31살입니다. 세대를 넘어서 교수님 덕을 보는 저에겐 교수님덕에 인터넷이 쓰레기라 생각되지 않습니다. 다만 이런 혜택을 받기위해서 저작권등의 올바른 인터넷 문화 의식을 갖추어야 겠다는 생각을 합니다. 얼굴을 뵙고 이야기 한적은 없지만 존경스럽고 감사합니다.

    • 샛솔  댓글주소 수정/삭제 2012.10.05 10:18 신고

      이 글은 2005년에 쓴 글이라 오늘의 인터넷 비판에 맞지 않을 것 같습니다. 인터넷 문화에 아직도 문제점이 있긴 하지만 2005년 당시 보다는 많은 점이 개선되었습니다. 감사합니다.

  2. 김성환  댓글주소 수정/삭제 댓글쓰기 2012.10.12 03:08 신고

    안녕하세요? 저는 남가주 토랜스에 살고 있는 김성환 이라고 합니다.
    현재 가디나장로교회에서 목회하고 있습니다.
    자전거 여행에 관심이 많은데 우연히 이곳을 알게 되어 어떤 분이신가 궁금한 마음에 댓글을 남깁니다.
    이곳 사우스베이에 사시는지요? 그러시다면 언제 커피라도 마시며 자전거 얘기 나눌 수 있으면 좋겠습니다.

    • 샛솔  댓글주소 수정/삭제 2012.10.12 12:00 신고

      안녕하세요. 반갑습니다. 저는 서울에 살고 있습니다. 전엔 LA 에 자주 갔습니다만 한 2,3년 못 갔습니다. 언제 또 가게 될지 모르겠습니다. 자전거여행기를 이 블로그에 쓰고 있이니까 자주 들러 주십시요. 남가주 자전거 여행기가 새롭게 올라 오면 그 땐 남가주에 있을 것입니다. 감사합니다.

내가 여기에 Jogl 에 대한 강좌를 올리고 실수로 하나만 빼고 모두 스크랩을 허용하지 않는다고 체크하였습니다.  그런데 어떤 blogger 가 여기를 방문하고 그 강좌를 모두 스크랩하여다가 자신의 블로그에 게재하였습니다.  내가 강좌와 같은 것은 스크랩하지 못하게 하는것은 그 내용이 정밀성과 기술성을 내포하고 있기 때문에 자칫 훼손 왜곡되기 쉽고 따라서 자칫 내 인격이나 명예가 훼손될 우려가 있기 때문입니다.  그래서    offline 출판에 있어도 전재나 인용에 대해서 엄격한 규율을 정하고 실행하고 있는 것입니다.   아래의 글은 내가 50여편을 올린 "물리로 배우는 플래시" 

 http://phya.snu.ac.kr/~kclee/lects/contents.php

의 강좌에서 10여편을 마구잡이 퍼다 옮긴 사건이 생겨서 그 사이트에 올린 글입니다.

 

 

 

얼마전 미국에서 아직도 교수생활을 하고 있는 나와 같은 연배의 K교수와 함께 저녁을 한 일 있다.(미국에는정년퇴직이 없다) 은퇴후 어떻게 지내는가라는 물음에 여행을 다니고 여가에는 인터넷에 강의를 쓰고 있다고 했더니 의아한 표정을 지었다. 인터넷 이야기를 하다가 결국 K교수의 본심이 나왔다. 한 마디로 "Internet is trash" 라는 것이었다. 내가 살아 있는 백과 사전이요. 고급정보도 많이 있다고 인터넷 자랑을 하였는데 나온 말이기에 나는 당혹했었다.

사실 나는 인터넷의 예찬자이다. 인테넷에는 무한한 가능성이 있다. "A few mouse clicks away" 라든가 "Interactive engagement(양방향성)"과 같은 표어는 새로운 교육 매체로서 가능성을 말해 주고 있다.

그런데 학계의 일각에서는 인터넷에 우려를 표명하고 있다. 그것은 너무나 당연한 것이었다. 그것은 누구도 심사하거나 등급을 매기지 않고 모든 컨텐츠가 평등하게 존재하기 때문에 왼만한 눈을 가지지 않고는 정보의 옥석을 가릴 수 없고 대부분의 경우 옥보다는 돌이 많이 눈에 띄게 되기 때문이다. 그러니까 많은 경험과 바탕지식 없이 인터넷을 항해하면서 정보를 얻는다는 것은 위험하기 짝이 없는 일이다. K교수는 그것을 경계한 것이 었다.

이번주 타임지에는 "It's a Wiki, Wiki World" 라는 기사가 났다. Wikipedia 를 빗댄 것이지만 "Wiki, Wiki"에 푸른 색을 써서 표현한 것은 "사악한 세상"(Wicked World) 이라는 펀(pun)으로 쓴듯하다. 대영백과사전 (Encyclopaedia Britanica)의 편집자는 위키피디아는 공중변소의 변좌에 비교한 일이 있다. 누가 마지막에 사용했는지 모르기 때문에 꺼림직하다는 것이다. 학계에서도 일반적으로 이 백과사전을 신뢰하지 않는 분위기이다. 심지어 한때 위키피디아 편집을 맡았던 현재 오하이오 주립대 강사인 래리 생거씨도 학생들의 과제물에 위키피디아를 인용하는 것을 금지하고 있다한다. 왜냐하면 학생들 자신이 위키피디아 내용을 뜯어 고칠 수 있기 때문이라 한다.

인터넷이 왜 사악한 세상인가? 그것은 우리 인터넷을 보면 금방 알 수 있다. 우리나라 인터넷의 "사악성"은 미국이나 세계 평균보다 더 심하다. 우리나라의 인터넷의 사악성은 이 문화가 아이들에서 젊은 사람들에서 시작된 것에 연유하지 않나 생각된다. 아직 도덕적으로 성숙하지 못하고 오프라인 세계에서 통용되는 최소한의 관례에 조차 익숙하지 못한 그리고 더 많이 배우고 경험을 가진 어른들의 감독에서 벗어나 자기들의 편리한것 만 골라 익명과 평등이라는 자유를 누리다 보니 이른바 "윤리"라는 틀이 생겨 날 수 가 없었던 같다.

그리고 더 심각한 것은 우리나라 네티즌들은 저작권에 대한 존중이 너무나 희박하다. 거의 백치에 가깝다고 생각된다. 저작권이란 양질의 저작품, 인테넷상의 컨텐츠를 생산하도록 생산자에게 인센티브를 주는 것이 궁극적 목적이다. 지난 2월에 문공부가 공표한 "네티즌이 알아야 할 저작권 상식"에 보면 저작물이란 저작자의 인격의 일부로 보는 견해도 있다고 되어 있다. 그 뜻을 이해하는 사람이 얼마나 될가?

나처럼 과학적 기술적인 내용을 쓰는 강좌에도 내 인생관 학문관이 스며 있다. 내가 강좌를 쓰면서 줄과 줄 사이에 보이지 않는 내 생각과 의도가 들어 있다. 어떤 사람은 이것들을 읽고 어떤사람은 이것을 읽지 못한다. 그러기 때문에 내 강좌는 내 인격의 일부가 되는 것이다. 내가 강좌를 통해서 전달하고져 하는 것은 여러가지가 있다. 새로운 교육관을 전파하고 , interactive engagement의 파워를 시범하고, 내가 주관해서 만든 한글용어를 보급한다는 ...등 다양한 내 인격속에 포함된 의도가 스며 있다.

그런데 최근에 내가 저작권 침해 사이트이기에 가담하지 말라고 구체적으로 지적한 한 포탈 사이트의 카페에 내 강좌 10여편을 내 허락도 없이 옮겨 싣는 불법행위를 저지르는 사건이 생겼다. 그것도 내 강좌에 들어 와 열심히 읽고 덧글을 붙이고 하던 사람이었기에 경악을 금할 수 없었다. 자신의 아이디로 게시한 이 "강좌"명도 마치 새로운 강좌인듯 "플래시로 배우는 물리" 라고 거꾸로 붙였다.

더욱 경악할 일은 내가 이를 뒤늦게 발견하고 경고하자 불법이라니까 지우기는 지우되 자신의 잘못은 없다는 항변이다. 내 이름도 내 사진도 붙였으니 잘못이 아니란다. 내 사진을 허가 없이 옮겼으니 저작권침해에 초상권까지 침해 한 셈인데도 잘못이 없다니 어이가 없다.

그리고 더욱 나를 화나게 한 것은 내가 강의한 Affine 변환을 옮기면서 내가 사용한 "층밀리기" 라는 용어에 대하여 이러쿵 저러쿵 다른 용어도 있다고 "친절하게" 덧글을 부친것이었다. "층밀리기"는 한국물리학회의 공식용어로 어떤 다른 용어도 함께 쓰지 못하게 유일한 용어로 지정한 것이다. 그러니 이 사람은 내 인격체에 상채기를 냈을 뿐 아니라 한국물리학회의 공식적인 입장까지 거역하는 행동을 한 셈이 된다. 쥐뿔도 므르면서 물리를 가르친다고 "강좌"를 한답시고 하니 참으로 기가 막히는 일이다. 그리고도 반성은 커녕 왜 쓰레기냐고 항변을 하고 있다. 제대로 알지 못하는 사람이 잘 못을 저지르면 그 잘못이 무엇인지 조차도 모른다.

이런 사람들이 이런 의식수준을 가지고 인터넷공간을 누비고 다니면 나 같은 사람은 강좌를 더 쓰고 싶은 의욕을 상실한다. 나는 은퇴후 내가 할 수 있는 마지막 봉사, 나 이외에 어떤 다른 사람도 대신할 수 없는 일을 해서 인터넷상에 좋은 고급정보를 남겨 두고 갈 생각이었지만 이번 사건을 겪고는 정말 더 이상 강좌를 쓰고 싶은 생각이 가시고 말았다. 결국 인터넷은 옥은 사라지고 쓰레기만 남고 말 것이다.

나야 이제 나이가 70 대에 인터넷에 강좌를 쓴다 해도 쓸 기간이 몇년밖에 더 되지 않을 것이고 또 이 세상에 살 햇수도 별로 많이 남아 있지 않다. 그러나 여러분은 앞날이 창창한 사람들이다. 인터넷을 잘 가꾸고 키워야 내가 내다 본 이 무한한 가능성을 제대로 꽃 피울 수 있다. 지금은 인터넷에서 정보를 얻는 사람이라 할 지라도 언젠가는 인테넷에 정보를 제공하고 베푸는 위치에 올 수도 있다. 그럴때 여러분의 저작물을 왜곡하고 훼손하는 사람들을 만난다면 어떻겠는가를 생각해야 한다. 그것을 생각하고 지금 다른 사람의 인격체의 일부인 저작물과 저작권을 존중하는 풍습을 길러야 할 것이다. 모든 것은 돌고 도는 것이다. 윤리라는 것은 자신을 위하는 것이지 결코 남을 위하는 것이 아니다. 
 

 

신고

'IT > JOGL(Java OpenGL)' 카테고리의 다른 글

왜 도둑질이 나쁜가?  (4) 2005.12.27
인터넷은 쓰레기인가?  (2) 2005.12.25
Jogl에서 KeyEvent 쓰는 법  (0) 2005.12.06
Jogl에서 MouseEvent 쓰는 법  (0) 2005.12.05
Jogl을 JApplet 에 담는 법  (0) 2005.12.04
Jogl을 Applet에 담는 법  (0) 2005.12.03
Swing 을 사용하는 Jogl 코드의 해설  (0) 2005.12.02
Posted by 샛솔

댓글을 달아 주세요

  1. 노경배  댓글주소 수정/삭제 댓글쓰기 2016.03.26 14:09 신고

    당시에 교수님이 느꼈을 실망과 안타까움이 느껴집니다.
    포스팅하신글의 주제와는 거리가있지만,
    어쭙잖은 지식으로 아는체 하며.. 학원강의를 하는 저, 스스로가 부끄러움을 느꼈습니다.

Jogl에서 KeyEvent 쓰는 법

Jogl에 KeyEvent를 쓰는 법은 바로 앞 강좌 MouseEvent 를 쓰는 것과 별반 다를 것이 없다.  여기서는 Numeric Pad 의 방향 키를 누르면 그 방향으로 작은 네모꼴이 움직이는 Applet을 만들어 본다. 사실 모든 코드가 앞강좌와 거의 같으므로 설명이 별로 필요 없다.  21째 줄 canvas.addKeyListener(listener);   만 바뀌었다.     코드만 자세히 검토해 보기 바란다.

  1. import java.applet.Applet;
  2. import java.awt.*;
  3. import net.java.games.jogl.*;
  4. @SuppressWarnings("serial")
  5. public class JoglApplet extends Applet {
  6.         static int WIDTH = 500,  HEIGHT = 300 ;
  7.         GLCanvas canvas;
  8.         JoglDisplay listener ;
  9.                 
  10.           public void init() {
  11. //          canvas.requestFocusInWindow();
  12.             GLCapabilities glc = new GLCapabilities();
  13.             canvas = GLDrawableFactory.getFactory().createGLCanvas(glc);
  14.             add(canvas, BorderLayout.CENTER);
  15.             listener = new JoglDisplay();
  16.                 canvas.addGLEventListener(listener);
  17.                 canvas.addKeyListener(listener);        
  18.                 listener.glc = canvas;
  19.                 setSize(WIDTH, HEIGHT);
  20.                 canvas.setSize(WIDTH, HEIGHT);
  21.                 }
  22.         }

 이 부분은 앞강좌의 Applet 클래스 정의와 같다.

아래에 GLEventListener의 자식클래스 JoglDisplay를 정의한다. 이때  MouseListener 대신 KeyListener를 임프리먼트한다. (6째줄)

47~59째 줄까지가 이 KeyListener 의 메쏘드들을 정의한 것이다.  

  1. import java.awt.event.*;
  2. import net.java.games.jogl.*;
  3. public class JoglDisplay
  4. implements GLEventListener, KeyListener
  5. {
  6. int xPosition = 25;
  7. int yPosition = 25;
  8. GLCanvas glc;
  9. public void init(GLDrawable drawable) {
  10. GL gl = drawable.getGL();
  11. GLU glu = drawable.getGLU();
  12. gl.glClearColor(0.0f, 0.0f,0.0f, 0.0f);
  13. gl.glViewport(0, 0, 50, 50);
  14. gl.glMatrixMode(GL.GL_PROJECTION);
  15. gl.glLoadIdentity();
  16. glu.gluOrtho2D(0.0, 50.0, 0.0, 50.0);
  17. }
  18. public void display(GLDrawable drawable) {
  19. GL gl = drawable.getGL();
  20. gl.glClear(GL.GL_COLOR_BUFFER_BIT);
  21. gl.glPointSize(6.0f);
  22. gl.glColor3f(1, 1, 1);
  23. gl.glBegin(GL.GL_POINTS);
  24. gl.glVertex2i(xPosition, yPosition);
  25. gl.glEnd();
  26. }
  27. public void reshape(
  28. GLDrawable drawable,
  29. int x,
  30. int y,
  31. int width,
  32. int height
  33. ) {}
  34. public void displayChanged(
  35. GLDrawable drawable,
  36. boolean modeChanged,
  37. boolean deviceChanged
  38. ) {}
  39. public void keyPressed(KeyEvent e) {}
  40. public void keyReleased(KeyEvent e) {}
  41. public void keyTyped(KeyEvent e) {
  42. if (e.getKeyChar() == KeyEvent.VK_8 || e.getKeyChar() == KeyEvent.VK_KP_UP )
  43. yPosition += 1;
  44. else if (e.getKeyChar() == KeyEvent.VK_2 || e.getKeyChar() == KeyEvent.VK_KP_DOWN)
  45. yPosition -= 1;
  46. else if (e.getKeyChar() == KeyEvent.VK_4 || e.getKeyChar() == KeyEvent.VK_KP_LEFT )
  47. xPosition -= 1;
  48. else if (e.getKeyChar() == KeyEvent.VK_6 || e.getKeyChar() == KeyEvent.VK_KP_RIGHT )
  49. xPosition += 1;
  50. glc.repaint();
  51. }
  52. }

 이 코드를 컴파일하고 실행시켜 보기 바란다.  여기를 열면 그 결과를 볼 수 있다.  먼저 검은 화면부분에 마우스를 갖다 놓고한번 클릭하여 Focus를 얻은 다음뉴메릭 패드에서 화살표를 눌러 네모가 화살표방향으로 움직이는 것을 확인하기 바란다.NumLock을 한 상태에서 화살표를 클릭해야 한다.위 코드에는  Numeric pad를 해제한 경우에도 작동하도록 프로그램을 작성했지만   NumLock을 해제하면 작동하지 않는다.  

신고

'IT > JOGL(Java OpenGL)' 카테고리의 다른 글

왜 도둑질이 나쁜가?  (4) 2005.12.27
인터넷은 쓰레기인가?  (2) 2005.12.25
Jogl에서 KeyEvent 쓰는 법  (0) 2005.12.06
Jogl에서 MouseEvent 쓰는 법  (0) 2005.12.05
Jogl을 JApplet 에 담는 법  (0) 2005.12.04
Jogl을 Applet에 담는 법  (0) 2005.12.03
Swing 을 사용하는 Jogl 코드의 해설  (0) 2005.12.02
Posted by 샛솔

댓글을 달아 주세요

Jogl에서 MouseEvent 쓰는 법

Jogl에 MouseEvent를 쓰는 법은 여느 Java Applet 이나 Application에서 MouseEvent 를 쓰는 것과 별반 다를 것이 없다.  여기서는 Mouse를 클릭하는 곳에 작은 네고꼴이 옮겨 지는 Applet을 만들어 설명할까한다.  먼저 GLCanvas를 생성하고 GLEventListener의 인터페이스를 부착시키고 하는 따위 기본인프라를 구축하는 JoglApplet 클래스를 작성하는 법은 12째 강좌에서 설명한 바 있다.  12 강좌의 애플랫클라스와 다른 점은 GLEventListener의 자식 클래스를 정의하는데  애플렛윈도우의 사이즈를 인수로 전달하였는데 여기서 그 쓸모가 없으므로 생략한다.  

그 대신 마우스 이벤트와 관련해서 여기서 정의된 (10, 16째줄) canvas를 인자로 전달해야 할 필요가 있다.  간단한 방법은  GLEventListener의 자식클래스 JoglDisplay 에 GLCanvas의 객체변수 하나를 정의하고 거기에 canvas 의 참조를 제 22째 줄 처럼 넘기는 것이다.    

  1. import java.applet.Applet;
  2. import java.awt.*;
  3. import net.java.games.jogl.*;
  4. @SuppressWarnings("serial")
  5. public class JoglApplet extends Applet {
  6.         static int WIDTH = 500,  HEIGHT = 300 ;
  7.         GLCanvas canvas;
  8.         JoglDisplay listener ;
  9.                 
  10.           public void init() {
  11.             GLCapabilities glc = new GLCapabilities();
  12.             canvas = GLDrawableFactory.getFactory().createGLCanvas(glc);
  13.             add(canvas, BorderLayout.CENTER);
  14.             listener = new JoglDisplay();
  15.                 canvas.addGLEventListener(listener);
  16.                 canvas.addMouseListener(listener);
  17.                 listener.glc = canvas;
  18.                 setSize(WIDTH, HEIGHT);
  19.                 canvas.setSize(WIDTH, HEIGHT);
  20.                 }
  21.         }

 아래에 GLEventListener의 자식클래스 JoglDisplay를 정의한 것이다.

 아래의 코드 중에서 54째 줄에서 56째 줄이 Jogl 과  MouseEvent를 통합하기 위해서 불가피하게 변환시키는 코드가 된다.  Jogl 은 자리표의 y의 증가 방향이 아래에서 위로 올라가는 방향이 되는데 MouseEvent 에 마우스 이벤트가 일어난 자리표는 위에서 아래로 가는 방향이 Y 값의 증가방향이 된다.  그래서 이 서로 반대되는 자리표읽기를 융합한 부분이다.  잘 음미해 두기를 권장한다.

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import net.java.games.jogl.*;
  4. public class JoglDisplay
  5. implements GLEventListener, MouseListener
  6. {
  7. int xPosition = 50;
  8. int yPosition = 50;
  9. GLCanvas glc;
  10. public void init(GLDrawable drawable) {
  11. GL gl = drawable.getGL();
  12. GLU glu = drawable.getGLU();
  13. gl.glClearColor(0.0f, 0.0f,0.0f, 0.0f);
  14. gl.glViewport(0, 0, 100, 100);
  15. gl.glMatrixMode(GL.GL_PROJECTION);
  16. gl.glLoadIdentity();
  17. glu.gluOrtho2D(0.0, 100.0, 0.0, 100.0);
  18. }
  19. public void display(GLDrawable drawable) {
  20. GL gl = drawable.getGL();
  21. gl.glClear(GL.GL_COLOR_BUFFER_BIT);
  22. gl.glPointSize(6.0f);
  23. gl.glColor3f(1, 1, 1);
  24. gl.glBegin(GL.GL_POINTS);
  25. gl.glVertex2i(xPosition, yPosition);
  26. gl.glEnd();
  27. }
  28. public void reshape(
  29. GLDrawable drawable,
  30. int x,
  31. int y,
  32. int width,
  33. int height
  34. ) {}
  35. public void displayChanged(
  36. GLDrawable drawable,
  37. boolean modeChanged,
  38. boolean deviceChanged
  39. ) {}
  40. public void mouseClicked(MouseEvent e) {
  41. double x = e.getX();
  42. double y = e.getY();
  43. Component c = e.getComponent();
  44. double width = c.getWidth();
  45. double height = c.getHeight();
  46. xPosition = (int) ((x / width) * 100);
  47. yPosition = ((int) ((y / height) * 100));
  48. yPosition = 100 - yPosition;
  49. glc.repaint();
  50. }
  51. public void mouseEntered(MouseEvent e) {}
  52. public void mouseExited(MouseEvent e) {}
  53. public void mousePressed(MouseEvent e) {}
  54. public void mouseReleased(MouseEvent e) {}
  55. }

 이 코드를 컴파일하고 실행시켜 보기 바란다.  여기를 열면 그 결과를 볼 수 있다. 마우스를 클릭해 보세요  작은 네모꼴이 마우스 클릭한 곳이 따라 온다.

신고

'IT > JOGL(Java OpenGL)' 카테고리의 다른 글

왜 도둑질이 나쁜가?  (4) 2005.12.27
인터넷은 쓰레기인가?  (2) 2005.12.25
Jogl에서 KeyEvent 쓰는 법  (0) 2005.12.06
Jogl에서 MouseEvent 쓰는 법  (0) 2005.12.05
Jogl을 JApplet 에 담는 법  (0) 2005.12.04
Jogl을 Applet에 담는 법  (0) 2005.12.03
Swing 을 사용하는 Jogl 코드의 해설  (0) 2005.12.02
Posted by 샛솔

댓글을 달아 주세요

Jogl을 JApplet 에 담는 법

jogl 페이지를 JApplet 에 담는법을 설명한다.  이번에는 조금 복잡한 jogl 페이지를 JApplet 에 담아 본다.  제 11~12강좌에서 다루었던 보기를 JApplet 으로 만들어 본다.

JApplet의 자식 클래스로 JoglJApplet을 아래와 같이 작성한다.  이것은 AWT의 Applet 작성법과 크게 다른지 않다.  17째 줄에 사용한 JoglRender는 AWT의 JoglDisplay에 해당하는 것으로 GLEventListener를 임프리멘트하는 클래스로 Swing 컴포넌트를 사용한다는 점을 구별하기 위해서 그렇게 쓰기로 한다.  같은 내용을 JApplet 로 바꾸는 것이기 때문에 11째 강좌에서 사용한 클래스 정의를 그대로 변동없이 사용한다.  따라서 따로 이곳에 나열하지 않는다.  11째 강좌에 나열한 것을 참조하기 바란다.

 

  1. import java.awt.*;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import javax.swing.ButtonGroup;
  5. import javax.swing.JApplet;
  6. import javax.swing.JPanel;
  7. import javax.swing.JRadioButton;
  8. import net.java.games.jogl.*;
  9. @SuppressWarnings("serial")
  10. public class JoglJApplet extends JApplet implements ActionListener {
  11.         static int WIDTH = 500,  HEIGHT = 300 ;
  12.         GLCanvas canvas;
  13.         JoglRender listener ;
  14.                 
  15.           public void init() {
  16.             GLCapabilities glc = new GLCapabilities();
  17.             canvas = GLDrawableFactory.getFactory().createGLCanvas(glc);
  18.             add(canvas, BorderLayout.CENTER);
  19.             listener = new JoglRender();
  20.                 canvas.addGLEventListener(listener);
  21.                 
  22.                 JPanel jp = new JPanel();
  23.                 ButtonGroup bg = new ButtonGroup();
  24.                 JRadioButton jrb1 = new JRadioButton("Sine", true);
  25.                 jrb1.setActionCommand("sine");
  26.                 jrb1.addActionListener(this);
  27.                 JRadioButton jrb2 = new JRadioButton("Cosine");
  28.                 jrb2.setActionCommand("cosine");
  29.                 jrb2.addActionListener(this);
  30.                 JRadioButton jrb3 = new JRadioButton("Tangent");
  31.                 jrb3.setActionCommand("tangent");
  32.                 jrb3.addActionListener(this);
  33.                 bg.add( jrb1 );
  34.                 bg.add( jrb2 );
  35.                 bg.add( jrb3 );
  36.                 jp.add( jrb1 );
  37.                 jp.add( jrb2 );
  38.                 jp.add( jrb3 );
  39.                 add(jp, BorderLayout.SOUTH);
  40.                 setSize(WIDTH, HEIGHT);
  41.                 }
  42.           
  43.           public void actionPerformed(ActionEvent ae) {
  44.                   listener.whatToDraw = ae.getActionCommand();
  45.                   canvas.repaint();
  46.                   }
  47.                   
  48.         }

 이 코드를 컴파일하고 실행시켜 보기 바란다.  여기를 열면 그 결과를 볼 수 있다.

신고

'IT > JOGL(Java OpenGL)' 카테고리의 다른 글

인터넷은 쓰레기인가?  (2) 2005.12.25
Jogl에서 KeyEvent 쓰는 법  (0) 2005.12.06
Jogl에서 MouseEvent 쓰는 법  (0) 2005.12.05
Jogl을 JApplet 에 담는 법  (0) 2005.12.04
Jogl을 Applet에 담는 법  (0) 2005.12.03
Swing 을 사용하는 Jogl 코드의 해설  (0) 2005.12.02
Jogl 과 Swing  (0) 2005.12.01
Posted by 샛솔

댓글을 달아 주세요

 

Jogl을 Applet에 담는 법

아주 크지 않은 프로그램을 배포하는데에는 아직도 Applet 이 가장 흔하고 손쉬운 방법이다.

오늘의 강좌에서는 jogl을 애플랫에 담는 방법을 설명하려 한다.  가장 간단한 jogl프로그램을 보기로 들어 짧은 코드로  설명할까 한다.

여기 Jogl로 원 하나를 그리는간단한 Applet이 있다.  이 원을 그리는 Jogl을 Applet에 담는 방법을 설명한다.  Applet 의 으뜸 프로그램,  <JoglApplet> 클래스는 아래와 같다.

  1. import java.awt.*;
  2. import java.applet.Applet;
  3. import net.java.games.jogl.*;
  4. @SuppressWarnings("serial")
  5. public class JoglApplet extends Applet {
  6.           static  int WIDTH  = 300,   HEIGHT = 300  ;
  7.                 
  8.           public void init() {
  9.             GLCapabilities glc = new GLCapabilities();
  10.             GLCanvas canvas = GLDrawableFactory.getFactory().createGLCanvas(glc);
  11. //          add(canvas, BorderLayout.CENTER);
  12.             add(canvas);
  13.             JoglDisplay listener = new JoglDisplay(WIDTH, HEIGHT );
  14.                 canvas.addGLEventListener(listener);
  15.         setSize(WIDTH, HEIGHT);
  16.         canvas.setSize(WIDTH, HEIGHT);
  17.                 }
  18.         }

 Application의 Frame의 생성자 부분에서 하던 일을 Applet 의 init() 함수안에서 수행한다.  즉 Jogl Canvas GLCanvas를 생성하여 (13째줄) 애플랫에 부착한다 (15째줄).

16째줄 listener 객체의 원형 클래스 JoglDisplay는 Application 때와 달리 인수를 받게 정의한다. 이는 GLCanvas 의 크기를 그리기에 사용하는 변수로 전달하기 위해서 그렇게 설계한 것이다. 아래에서 보듯이 이 클래스의 생성자는  정수(int) 인수 둘을 받아 들인다. 이 들 인자는 Applet 의 너비와 높이다. 아래에 GLEventListener의 자식 클래스인 <JoglDisplay>를 나열한다.  짧은 코드임에도 둘을 갈라 놓는 것은 여기에도 init 함수가 있어 혼돈을 일으킬 수도 있기 때문이다. 물론 인수가 있고 없고로 둘은 구별이 되기는 한다.

  1. import net.java.games.jogl.*;
  2. public class JoglDisplay implements GLEventListener  {
  3.         
  4.         int w, h;
  5.         
  6.         public JoglDisplay(int w1, int h1) {w= w1; h = h1;}
  7.         public void init(GLDrawable gld) {
  8.                 GL gl = gld.getGL();
  9.                 GLU glu = gld.getGLU();
  10.                 gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  11.                 gl.glMatrixMode(GL.GL_PROJECTION);
  12.                 gl.glLoadIdentity();
  13.                 glu.gluOrtho2D(0, w, 0, h);
  14.         }
  15.         public void display(GLDrawable drawable) {
  16.                 GL gl = drawable.getGL();
  17.                 gl.glClear(GL.GL_COLOR_BUFFER_BIT);
  18.         drawCircle(w/2, h/2, 100.0d , gl);
  19.                         }
  20.                 public void reshape(GLDrawable gld, int x, int y,
  21.                 int width, int height) {        
  22.                 }
  23.                 public void displayChanged(GLDrawable arg0, boolean arg1, boolean arg2) {
  24.                         }
  25.                 
  26.                 protected void drawCircle(double x, double y, double  r, GL gl) {
  27.                         double del= Math.PI/100;
  28.                         gl.glBegin (GL.GL_LINE_LOOP);
  29.                 for (int i = 0; i<200; i++)
  30.                         gl.glVertex2d(x+r*Math.cos(del*i), x+r*Math.sin(del*i));
  31.                 gl.glEnd ();
  32.             }
  33. }

27~33째 줄 까지 Jogl로 원을 그리는 코드이다.  이 프로그램을 컴파일하고 실행시켜보면 아래와 같은 그림을 얻는다.  

사용자 삽입 이미지

신고

'IT > JOGL(Java OpenGL)' 카테고리의 다른 글

Jogl에서 KeyEvent 쓰는 법  (0) 2005.12.06
Jogl에서 MouseEvent 쓰는 법  (0) 2005.12.05
Jogl을 JApplet 에 담는 법  (0) 2005.12.04
Jogl을 Applet에 담는 법  (0) 2005.12.03
Swing 을 사용하는 Jogl 코드의 해설  (0) 2005.12.02
Jogl 과 Swing  (0) 2005.12.01
JOGL  (0) 2005.12.01
Posted by 샛솔

댓글을 달아 주세요

Swing 을 사용하는 Jogl 코드의 해설

Swing 을 사용하는 Jogl 코드라고는 하지만 Swing 과 Jogl 의 통합이 아니라 Swing(lightweight component) 와 Awt(heavyweight component)의 통합이라는 표현이 합당할 것이다.  Awt 는 스크린에 직접 접근할 수 있으나 Swing 은 오직 상위계층인 awt 의 네이트브 리소스를 통해서만 스크린에 접근할 수 있다. 이런 연유로  Awt 는 중량급 컴포넌트, Swing 은 스크린의 네이티브 리소스를 거니리지 않는 경량급 컴포넌트라 부른다. 어것은 아래의 클래스 계층구조를 보면 잘 알 수 있다.

javax.swing
Class JFrame

java.lang.Objectjava.awt.Componentjava.awt.Containerjava.awt.Windowjava.awt.Framejavax.swing.JFrame

위에서 보듯이 JFrame은 awt의 Frame의 하위 클래스로 Frame과 그 상위 awt 컴포넌트의 메쏘드를 빌려 네이티브 스크린 리소스에 접근하는 구조를 갖고 있다.  

 

 awt 와 Swing 의 다른점은

첫째는 awt의 Frame을 썼을 때에 사용한

                        JoglFrame  frame = new JoglFrame ();

                         frame.setVisible(true);

에 해당하는 부분이

   final JoglJFrame app = new JoglJFrame();

   SwingUtilities.invokeLater (new Runnable() {public void run() {app.setVisible(true);}});

  로서 window 가 update 될 때에도 다시 보이도록 한다.

 둘째는 awt의 Frame을 썼을 때에 사용한

                addWindowListener(new WindowAdapter() {

                        public void windowClosing(WindowEvent e) {

                        if (anim != null) anim.stop();  

                        System.exit(0);

                        }

에 24째 줄의

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

로 바꿔 주는 것이다.

나머지 것은 거의 awt 의 컴포넌트를 쓰는 방식과 대동 소이함으로 생략한다.

경량급 컴포넌트(Swing)와 중량급 컴포넌트(Awt) 섞어쓰기에 관해서는

http://java.sun.com/products/jfc/tsc/articles/mixing/

를 참조하고

JFrame의 구조에 대해서는 아래의 참고 문헌

http://www.cc.gatech.edu/classes/cs4812_99_winter/swing/sld014.htm

을 참조하기 바란다.

신고

'IT > JOGL(Java OpenGL)' 카테고리의 다른 글

Jogl에서 KeyEvent 쓰는 법  (0) 2005.12.06
Jogl에서 MouseEvent 쓰는 법  (0) 2005.12.05
Jogl을 JApplet 에 담는 법  (0) 2005.12.04
Jogl을 Applet에 담는 법  (0) 2005.12.03
Swing 을 사용하는 Jogl 코드의 해설  (0) 2005.12.02
Jogl 과 Swing  (0) 2005.12.01
JOGL  (0) 2005.12.01
Posted by 샛솔

댓글을 달아 주세요

Jogl 과 Swing

O'Relly에서 최근에 출판된  "Swing Hacks"이란 책의 공동 저자인Chris Adamson은 Jogl 에 대한 기사와 튜토리알을 많이 써 오고 있다.  그중에서도 가장 오래전에 쓴(09/11/2003)  튜토리알인"Jogl 에 뛰어들기(Jumping into JOGL)"는 사람들이 가장 많이 읽었고 또 JOGL에 입문하는 사람들에 큰 영향을 끼친 기사라 할 수 있다.    

그 튜토리알안에는 AWT 의 GLCanvas 에 대응하는 GLJPanel 이 있지만 하드웨어적 가속화 렌더링을 당시는 지원하지 않기 때문에 JOGL에 GLJPanel 이 정의되어 있지만 사용하지 않기로 한다는 글귀가 있다. (It might seem odd that the sample uses AWT instead of the more-popular Swing API. While theGLCanvashas a Swing equivalent,GLJPanel, the Swing version does not currently enjoy hardware-accelerated rendering. That means it's slow, which for many would defeat the whole purpose of using JOGL.)

    사실 이제 까지 이 강좌에서 Swing을 기피하여 온 이유도 이러한 경고가 한 몫 했다해도 과언이 아니다.  그러나 최근의 Jogl에서는 사정이 많이 달라졌다.  2005년 2월 7일자 버전서 부터는 하드웨어적 가속화 렌더링을 지원한다고JOGL Release Information에서 공표한였다. (JOGL's Swing component, GLJPanel, now supports hardware acceleration via pbuffers on all of JOGL's supported platforms. Performance is quite good, at least on NVidia hardware; more performance work is planned on this component's implementation. )

여러분이 이 강좌 머리부분에서 필자가 기술한 Jogl 사이트에서 최신 Jogl 버전을 다운 받았다면 GLJPanel을 사용해도 하드웨어적 가속화 렌더링의 효과를 누릴 수 있다. 그러나 거기에는 약간의 오버헤드를 지불해야 한다.  여러분이 Jogl을 내려 받은사이트에는  javadoc_public.zip 라는 Jogl 의 참고문헌이 있는데 이를 내려 받아 GLJPanel  을 열어 보기 바란다.  거기에는

"이 컴포넌트는 pbuffer를 통해서 하드웨어적 가속화 렌더링을 시도하지만 문제가 생기면 소프트웨어적 렌더링모드로 전환하다 (This component attempts to use hardware-accelerated rendering via pbuffers and falls back on to software rendering if problems occur.)고 적혀 있다.  

또한 직접 렌더링하는 것이 아니고  pbuffer를 통해서 렌더링하는 것도 약간 시간이 더 걸릴지도 모른다고 경고 하고 있다.

이런 저런 이유로 Swing을 꼭 써야할 이유가 없을 때에는 AWT를 쓸 것을 권장하고 있다.  그럼에도 Swing 이외에는 선택이 없는 경우를 위해서 아래에  Swing 을 섞어 쓰는 풀그림을 작성하여 사용해 보기로 한다.  아래의 보기에서는 JFrame에 GLCanvas를 부착하는 방법을 썼으므로  실질적으로 위에 논의한 Swing 의 하드웨어적 가속화 렌더링 의 제약과는 무관하고 100% 하드웨어적 가속화 렌더링을 지원할 것으로 예상된다.

  1. package joglJFrame;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import javax.swing.*;
  5. import net.java.games.jogl.*;
  6. @SuppressWarnings("serial")
  7. public class JoglJFrame
  8. extends JFrame implements ActionListener
  9. {
  10. //Notice we've given these two objects a larger scope.
  11. //Local scope to the constructor was no longer sufficient.
  12. JoglRender listener = new JoglRender();
  13. GLCanvas canvas;
  14. public static void main(String[] args) {
  15.    final JoglJFrame app = new JoglJFrame();
  16. SwingUtilities.invokeLater (new Runnable() {public void run() {app.setVisible(true);}});
  17.     }
  18. public JoglJFrame() {
  19. super("Sine, Cosine and Tangent");
  20. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  21. JPanel jp = new JPanel();
  22. ButtonGroup bg = new ButtonGroup();
  23. JRadioButton jrb1 = new JRadioButton("Sine", true);
  24. jrb1.setActionCommand("sine");
  25. jrb1.addActionListener(this);
  26. JRadioButton jrb2 = new JRadioButton("Cosine");
  27. jrb2.setActionCommand("cosine");
  28. jrb2.addActionListener(this);
  29. JRadioButton jrb3 = new JRadioButton("Tangent");
  30. jrb3.setActionCommand("tangent");
  31. jrb3.addActionListener(this);
  32. bg.add( jrb1 );
  33. bg.add( jrb2 );
  34. bg.add( jrb3 );
  35. jp.add( jrb1 );
  36. jp.add( jrb2 );
  37. jp.add( jrb3 );
  38. add("South", jp);
  39. GLCapabilities glcaps = new GLCapabilities();
  40. canvas = GLDrawableFactory.getFactory().createGLCanvas(glcaps);
  41. canvas.addGLEventListener(listener);
  42. add(canvas, BorderLayout.CENTER);
  43. setSize(500, 300);
  44. centerWindow(this);
  45. }
  46. public void centerWindow(Component frame) {
  47. Dimension screenSize =
  48. Toolkit.getDefaultToolkit().getScreenSize();
  49. Dimension frameSize = frame.getSize();
  50. if (frameSize.width > screenSize.width )
  51. frameSize.width = screenSize.width;
  52. if (frameSize.height > screenSize.height)
  53. frameSize.height = screenSize.height;
  54. frame.setLocation (
  55. (screenSize.width - frameSize.width ) >> 1,
  56. (screenSize.height - frameSize.height) >> 1
  57. );
  58. }
  59. public void actionPerformed(ActionEvent ae) {
  60. listener.whatToDraw = ae.getActionCommand();
  61. canvas.repaint();
  62. }
  63. }

<JoglRender>

 

  1. package joglJFrame;
  2. import net.java.games.jogl.*;
  3. public class JoglRender implements GLEventListener {
  4. public String whatToDraw = "sine";
  5. public void init(GLDrawable gld) {
  6. GL gl = gld.getGL();
  7. GLU glu = gld.getGLU();
  8. gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  9. gl.glLineWidth(2.0f);
  10. gl.glPointSize(2.0f);
  11. gl.glViewport(-250, -150, 250, 150);
  12. gl.glMatrixMode(GL.GL_PROJECTION);
  13. gl.glLoadIdentity();
  14. glu.gluOrtho2D(-250.0, 250.0, -150.0, 150.0);
  15. }
  16. public void display(GLDrawable gld) {
  17. GL gl = gld.getGL();
  18. drawGraph( gl );
  19. gl.glColor3f(1.0f, 0.2f,0.2f);
  20. gl.glBegin(GL.GL_POINTS);
  21. if (whatToDraw.equals("sine")) {
  22. //draw enlarged sine function
  23. for (int x=-250; x<250;x++)
  24. gl.glVertex2d(x, (Math.sin(x/60.0)*100.0));
  25. } else if (whatToDraw.equals("cosine")) {
  26. //draw enlarged cosine function
  27. for (int x=-250; x<250;x++)
  28. gl.glVertex2d(x, (Math.cos(x/60.0)*100.0));
  29. } else if (whatToDraw.equals("tangent")) {
  30. //draw enlarged tangent function
  31. for (int x=-250; x<250;x++)
  32. gl.glVertex2d(x, (Math.tan(x/60.0)*30.0));
  33. }
  34. gl.glEnd();
  35. }
  36. public void reshape(
  37. GLDrawable drawable,
  38. int x,
  39. int y,
  40. int width,
  41. int height
  42. ) {}
  43. public void displayChanged(
  44. GLDrawable drawable,
  45. boolean modeChanged,
  46. boolean deviceChanged
  47. ) {}
  48. private void drawGraph(GL gl) {
  49. float red;
  50. float green;
  51. float blue;
  52. gl.glClear(GL.GL_COLOR_BUFFER_BIT);
  53. //drawing the grid
  54. red = 0.2f;
  55. green = 0.2f;
  56. blue = 0.2f;
  57. gl.glColor3f(red, green, blue);
  58. gl.glBegin(GL.GL_LINES);
  59. //draw the vertical lines
  60. for (int x=-250; x<=250; x+=10) {
  61. gl.glVertex2d(x, -150);
  62. gl.glVertex2d(x, 150);
  63. }
  64. //draw the horizontal lines
  65. for (int y=-150; y<=150; y+=10) {
  66. gl.glVertex2d(-250, y);
  67. gl.glVertex2d(250, y);
  68. }
  69. gl.glEnd();
  70. // draw the x-axis and y-axis
  71. gl.glColor3f(0, 0.5f, 0.5f);
  72. gl.glBegin(GL.GL_LINES);
  73. //line for y-axis
  74. gl.glVertex2d(0, 140);
  75. gl.glVertex2d(0, -140);
  76. //line for x-axis
  77. gl.glVertex2d(240, 0);
  78. gl.glVertex2d(-240, 0);
  79. gl.glEnd();
  80. // draw arrow heads
  81. gl.glBegin(GL.GL_TRIANGLES);
  82. gl.glVertex2d( 0, 150);
  83. gl.glVertex2d(-5, 140);
  84. gl.glVertex2d( 5, 140);
  85. gl.glVertex2d( 0, -150);
  86. gl.glVertex2d(-5, -140);
  87. gl.glVertex2d( 5, -140);
  88. gl.glVertex2d(250, 0);
  89. gl.glVertex2d(240,-5);
  90. gl.glVertex2d(240, 5);
  91. gl.glVertex2d(-250, 0);
  92. gl.glVertex2d(-240,-5);
  93. gl.glVertex2d(-240, 5);
  94. gl.glEnd();
  95. }
  96. }

이 파일들을 컴파일하여 실행 시켜 보기 바란다.  이 코드의 설명은 다음 강좌에서 할 것이다.

신고

'IT > JOGL(Java OpenGL)' 카테고리의 다른 글

Jogl에서 KeyEvent 쓰는 법  (0) 2005.12.06
Jogl에서 MouseEvent 쓰는 법  (0) 2005.12.05
Jogl을 JApplet 에 담는 법  (0) 2005.12.04
Jogl을 Applet에 담는 법  (0) 2005.12.03
Swing 을 사용하는 Jogl 코드의 해설  (0) 2005.12.02
Jogl 과 Swing  (0) 2005.12.01
JOGL  (0) 2005.12.01
Posted by 샛솔

댓글을 달아 주세요

JOGL

IT/JOGL(Java OpenGL) 2005.12.01 20:47

Processing 강좌를 쓰다 말고 JOGL 강좌를 다시 시작하게 된 동기는 궁극적으로는 프로세싱의 Jogl 을 하기 위해서는 Java version을 먼저 배우고 Processing 의 Jogl 을 공략하는 것이 순서일 것 같기 때문입니다. Java version은 이미 몇년 되었고 그 커뮤니티도 크고 참고할 문헌이 많이 있기 때문입니다.  

사실은 네이버의 블로그의 리소쓰를 아낀다는 차원에서 야후의 블로그에 이미 강좌를올렸습니다.  Jogl에 대한 한글 문헌이 흔하지 않는 탓인지 상당히 많은 사람이 매일 강좌를 읽어주어 야후는 물론이고 google 이나 daum 검색엔진에도 이 강좌가 검색되는데 유독 네이버의 검색엔진에는 내 강좌가 걸러지지 않는군요.  아마도 야후가 네이버의 경쟁상대이기 때문인지 모르겠습니다. 결코 좋은 검색엔진이라 할 수 없겠습니다.

그래서 이제까지의 강좌는 야후의 블로그를 참조하시고 오늘부터 올리는 강좌는 이곳과 야후에 동시에 올리겠습니다. 

 

야후의내 블로그와각 강좌는

 

Eclipse 와 JoglJava, Eclipse, Jogl 설치하는법 ,  Jogl 테스트,Jogl 그 첫번째 프로그램,

 

Jogl 그 첫번째 프로그램 코드 해설,  Jogl 그 첫번째 프로그램 코드 해설,Jogl 2파일 템프리트,

 

Jogl 로 그리는 2차원 도형Jogl 과 Button,Jogl 의 애니메이션을 사용하는 법,

 

Jogl을 실행하는 주문형 애니메이터

 

에 있습니다.

 

여기 다시 강조하면  자바,  이클립스,  Jogl 이 모든것이 공개소스로 무료 무른모란 점입니다.

여러분 모두 이 무른모들을 내려 받아 Jogl 을 익혀 3D 애니메이션의 고수가 되시기 바랍니다.

 

 

신고

'IT > JOGL(Java OpenGL)' 카테고리의 다른 글

Jogl에서 KeyEvent 쓰는 법  (0) 2005.12.06
Jogl에서 MouseEvent 쓰는 법  (0) 2005.12.05
Jogl을 JApplet 에 담는 법  (0) 2005.12.04
Jogl을 Applet에 담는 법  (0) 2005.12.03
Swing 을 사용하는 Jogl 코드의 해설  (0) 2005.12.02
Jogl 과 Swing  (0) 2005.12.01
JOGL  (0) 2005.12.01
Posted by 샛솔

댓글을 달아 주세요