블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

삐비

Memories / 2011. 2. 12. 05:05

어릴 때 참 많이 뽑아 먹었는데..

생각나서 검색해보다 보고..


삐비-

 

'띠풀' 이라는 원래 이름보다 웬지 '삐비' 라는 이름이 더 친근한 풀.

지방에 따라서' 삘기' 라고도 하고 삐비 라고도 하고 또 다른 이름으로도 불리는 모양이다.

지금 처럼 한창 여름철 말고  봄에는 이 이 흰 솜뭉치들이 몸밖으로 나와있지 않고 어린 싹 속에 숨어 있다.

이때 뽑아 먹으면 약간 단맛이 난다

그맛을 보려고  뽑으면 '삐~ ' 하는 소리가 나서 아마도 삐비라 부르는 모양이다.

 

약간 늦봄에는 이 놈들이 여기 저기 날아다니며 산딸기 열매에 달라붙어

산딸기 입에 넣을때 약간 성가시게 하기도 한다.

 

요즘 우리마을 들녘에 삐비 ,  즉 띠풀 천지다.

띠풀, 도라지,  소리쟁이, 호박꽃  이놈들이 마을을 포위하다 싶이 하고 있다.

 

그리고 코피를 자주 흘리는 아이 한테 띠풀 삶은 물이 좋다고 하는데 ,

정말 그런지는 모르겠고 ...

 

 

 

 

 

띠풀은 재미있게도 우리 마을 할머니들도 좋아하는 모양이다.

어릴적 소풍에 대한 추억때문일까?

 

요즘 보면 어떤 할머니는 띠풀을 꺽어 가로로 입에 물고 다니는 모습을 보여주기도 한다.

또 어떤 할머니는 띠풀을 잔뜩 꺽어 아랫단을 묶고.

 꽃다발처럼 만들어 할머니들 전용 유모차에 장식으로 해 다니기도 한다.

 

그리고 마을 입구쪽 혼자 사는 할매집 대문 우편함에는

이쁜 띠풀 몇송이가

'

아니 ,  이쁜 '삐비' 몇송이가 예쁘게 꽃혀있다.

...

누가 그랬을꼬 ???


출처 : http://blog.daum.net/sjh9535/119

반응형

'Memories' 카테고리의 다른 글

잘피(말잘피)  (1) 2012.01.08
부산역 앞  (0) 2011.06.11
시골갔다가 찍어온 인동  (0) 2011.06.11
으름  (0) 2011.02.12
남해/금남호/창선-삼천포 대교  (0) 2011.02.12
Posted by blueasa
, |

ToolTip 사용하기

Programming/C# / 2011. 2. 11. 18:31

버튼 설명하려고 하다보니 ToolTip을 쓰게됬는데 나중 되면 생각안날 것 같아서 메모!

 

 

 

1. 프로젝트 생성

2, ToolTip넣을 Control 삽입

 

3. ToolTip Control 추가 및 속성 변경

   (Name은 알아서 변경)

 

  풍선모양/Info icon

 

  

4. ToolTip정보 입력

 (생성자에 입력)

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //ToolTip
            toolTip1.SetToolTip(button1, "이것은 버튼입니다.");

        }
    }
}

 

 

 

 

* ToolTip속성 변경

(풍선모양 해제, Icon None)

 

 



출처 : http://www.cyworld.com/gpfhd/5429911

반응형
Posted by blueasa
, |

 

1. Convert

 - Cameras , Lights : 씬의 카메라 및 라이트를 익스포트 할 경우 이 옵션에 체크를 합니다.(보통 체크안함)

 

2. Textures Options Sub-panel

 - Include in main NIF :  메인 NIF포멧에 포함시켜서 익스포트 할 때 체크 합니다.

   이 옵션을 사용 하면 마스터 NIF파일은 완벽한 하나의 자가 공급 패키지가 됩니다. 모든 데이타가 하나의 포멧 파일로 합쳐지기

   때문에 별도의 텍스처가 필요 없으며, 마스터 NIF파일 안의 텍스처는 공유됩니다.

   자세한 사항은 게임브리오 헬프 파일을 참고 하시기 바랍니다.

 

 - Save as separate NIFs : 텍스처 파일을 별개의 NIF로 익스포트 할 시 체크를 합니다.

   이 옵션은 마스터 NIF가 제대로 로드되기 위해서 다른 NIF파일에 의존하게 만듭니다. 즉, 별개의 텍스처 NIF파일이 있어야

   마스터 NIF 파일이 제대로 로드 된다는 것입니다.

   씬의 각 고유한 텍스처는 자체적인 NIF파일에 저장되며, 별개로 익스포트 되어진 텍스처 NIF파일들은 여러 마스터

   NIF 파일들 간에 공유 할 수 있습니다.

   이 옵션은 부수적인 NIF텍스처 파일을 찾는 검색 시간으로 인해 콘솔에서 로딩하기에는 메인 NIF 텍스처보다 느릴 수 있습니다

    

 - Original images : 텍스처를 원래의 이미지로 익스포트 할 시 체크합니다.

   이 옵션은 마스터 NIF가 제대로 로드되는데 원본 이미지 파일에 의존하게 만듭니다.

   각각의 고유한 이미지 파일은 텍스처가 공유되는 위치에 복사해야 하며, 이 작업은 max에서 제공하는 Resource Collector

   유틸리티를 통해 쉽게 처리할 수 있습니다. 그러나 지원되는 게임브리오 이미지 타입만 공유될 수 있으며, 지원되지 않는

   타입은 NIF텍스처로 익스포트 될 것입니다.

   이 방식의 또 다른 이점은 익스포트 후에도 이미지를 수정 할 수 있다는 점입니다.

 

   이 옵션의 부수적인 NIF 텍스처 파일을 찾는 검색 시간으로 인해 콘솔에서 로딩하기에는 메인 NIF 텍스처 옵션보다 느릴 수

   있습니다. 또한 랜더러가 이 이미지를 쓸 수 있으려면 중간 픽셀부터 만들어야 한다는 사실로 인해 메모리를 조각 낼 수도

   있습니다.

 

 - Original images VRAM : 이 옵션은 위에 나온 Original images와 같으나 게임브리오 중간표현 없이 곧바로 렌더러

   데이터에 로드되기 때문에 게임브리오에서 직접 지원하지 않는 이미지 형식을 사용 할 수 있으며 로드시간도 빨라지게 됩니다.

 

 - Allow NPOT Tectures : 이 옵션을 체크하면 2의 제곱이 아닌 텍스처를 크기조정 없이 익스포트 할 수 있습니다.

   2의 제곱이 아닌 텍스처는 갖가지 그래픽 카드에서 서로 다른 성능을 보이며 퍼포먼스에 나쁜 영향을 끼칠 수가 있으므로

   보통 2의 제곱 텍스처를 사용하지 않는게 좋습니다.

 

   이 옵션을 체크하지 않으면 기본적으로 익스포트가 2의 제곱이 아닌 텍스처를 발견 햇을 경우 그 텍스처의 크기는 2의 제곱에

   가장 가까운 면적으로 줄어들고 경고 메세지가 나오게 됩니다.

   이 옵션을 체크하면 익스포트가 발견된 2의 제곱이 아닌 모든 첵스처는 필러링모드가 pyramidal로 설정되어 있을지라도

   Mipmap 지원이 없는 상태로 익스포트 됩니다.

 

 

 

 

 

1. Use App Time

  - 애니메이션은 APP_TIME 애니메이션 타입을 사용하게 되고, 체크하지 않으면 APP_INIT를 사용하게 됩니다.

 프로그래머가 APP_INIT를 사용해서 익스포트 해달라고 하지 않는 이상 기본적으로 체크를 해 놓습니다.

 

2. Use existing Biped keyframes instead of sampled keyframes

  - Character Studio는 바이패드 애니메이션에 TCB key를 사용하지만 불행이도 TCB파라미터 중 어느적도 익스포트 하지

  못합니다.  이 때문에 Gamebryo 3ds max Plug-in은 키프레임을 Bezier key로 익스포트 합니다.

  이 옵션을 체크하지 않으면 Gamebryo 3ds max Plug-in은 바이페트 애니메이션을 bone 별로 프레임 당 키 한개의 속도로

  샘플링 할 것 입니다.

  남아도는 키프레임은 삭제되지만 이 프로세스는 수많은 키프레임을 생성 할 수 있기에 일반적으로 컨버전 성능이

  떨어지지 않는 이상 이 옵션을 사용 하는 것이 효과적입니다. 단, 애니메이션 컨버전 성능이 떨어질 경우에는 이 옵션을

  체크하지 말아야 하며 보통 이 옵션을 체크하면 걸음걸이 동작은 비정상적으로 나오나 자유 형식 동장은 정상적으로 나옵니다.

 

3. Skin Weight Threshold %"수치"

  - 스킨에 버텍스 당 이 "수치"%보다 적은 영향을 미치는 본의 가중치는 버려집니다.

   이 기술은 스키닝 파티션의 갯수가 최적에 못 미치는 경우 유용하게 쓰이는데 이런 경우 퍼포먼스를 현저히 개선시킬 수

   있습니다.

   물론, 최종 스킨의 정확도가 떨어질 수는 있지만 대부분의 경우 5% 미만의 가중치는 최종 애니메이션에 거의 기여하지

   못하기에 보통은 5%에서 시작됩니다. 

 

 

 

 

 

1. Process Script

  - 옆에 있는 드롭다운 리스트를 열면 알려진 모든 Process Script 가 나옵니다.

  Process Script 는 씬 그래프를 어떤 방식으로 조작할 지를 정하는 플러그을 설정하는 것이므로 프로그래머와 상의 후

 필요한 플러그인만을 적용 시킵니다.

 예를 들어 겜브리오 엔진은 물리엔진으로서는 점수가 높지 않기 때문에 물리충돌은 다른 엔진으로 대체하는 경우가 있습니다.

 해당 플러그인의 설정 수정이나 새로운 설정을 만들기 위해선 오른쪽의 Edit 버튼을 눌러 편집을 합니다.(밑에 설명)

 

2. File Export Script

  - 이 드롭다운 리스트를 열면 알려지 모든 export script를 보여집니다.

  자세한 사항은 겜브리오 헬프 파일을 참조.

 

3. Use original script template if available

  - Max 파일을 로드했을 때 이 파일의 내부 스크립트 사본이 원래의 템플릿과 동기화 되지 않았을 경우 이 옵션을 체크하면

  맥스파일에 저장된 임시 버전 대신에 원래의 템플릿 스크립트가 사용됩니다.

 

 

 

 

 

1. Platform

  - 드롭 다운 리스트를 열면 익스포트 할 타깃 플랫폼을 선택 할 수 있습니다.

  해당 타깃 플랫폼을 선택하면 이미지와 데이터의 특정 최적화와 관련하여 스크립트 동작이 바뀔 수 있습니다.

  'Generic' 'Xbox 360' 'Platstation3' 'DX9' 가 있습니다.

  프로그래머와 상의합니다.

 

2. Image file subdirectory

  - 텍스처를 외부 NIF로 익스포트 할 때 활성화 되는 옵션으로 외부 NIF로 저장되어지는 서브 디렉터리를 선택하거나

  다른 이름으로 저장되어지게 합니다.(쉽게 말해 텍스처NIF가 저장되어지는 폴더의 이름을 적는 곳)

 

3. Default content quality

  - 외부 텍스처 NIF나 내부 텍스처로 익스포트 할 때 텍스처의 디폴트 퀄리티를 설정 할 수 있습니다.

  별개의 설정을 하지 않은 모든 텍스처를 최종적으로 'Defaults~Palettized'로 만드는 것이며,

  다른포멧파일(예:DXT5)로 익스포트 해야 한다면 메터리얼 텍스처탭에서 따로 설정을 해야 합니다.

 

4. Override Per-Texture Settings

  - default content quality 옵션을 사용 할 때는 Gamebryo Shder에서 텍스처 포맷 타입에 대해 설정된 옵션들이

  default로 Override 되지 않습니다.

  따라서 이런 설정을 Override 하고 싶은 경우엔 이 옵션에 체크해야 합니다.

 

  즉, DXT5(DDS포멧)으로 설정되어 있는 별개의 텍스처에 최종 익스포트 시 Default content quality에서 DXT1로 설정을

  하여 익스포트 할 때 체크를 해제하면 개별적으로 설정되어있는 DXT5포멧으로 익스포트 되게 되며,

  체크를 하면 최종설정인 Default content quality에서 DXT1포멧으로 익스포트 됩니다.

 

  특정 조건이 아닌 이상 체크를 하지 않는 것이 좋습니다.

  대부분은 DDS포멧의 DXT1으로 포멧을 하지만(용량이 적다) 알파값이 있으면 DDS포멧의 DXT3 ~ DXT5포멧으로 하는게

  좋습니다. 또한, 특정 노멀맵의 경우는 DDS포멧인 DXT5로 설정해야 하는 경우도 있습니다.

 

 

 

 

 

☞ Process Script Edit 버튼을 클릭하면 나오는 창.

 

 

 

 

 

1. Current Script

  - 현재 설정되어 있는 모든 스크립트가 나옵니다. 이 리스트 중에 선택된 항목은 다이얼로그의 나머지 부분에 있어

  현 스크립트가 무엇인지 결정하게 됩니다. 각 템플릿 스크립트는 괄호 안에 그 스크립트가 로드된 소스 파일을 보여줍니다.

  스크립트에서 괄호 다음에 '*'표시가 나온다면 유저가 세션에서 그 스크립트를 변경했음을 의미합니다.

 

2. New

  - 새로운 스크립트를 생성합니다.

 

3. Save

  - 현재 선택된 스크립트를 저장합니다.

 

4. Clone

  - 기존의 스크립트를 바탕으로 새로운 스크립트를 생성합니다.

  어떤 스크립트를 복제 할지 , 어떤 이름을 사용할지를 묻는 창이 나옵니다.

 

5. Rename

  - 스크립트의 이름을 변경합니다.

 

6. Script Type

  - 스크립트의 타입을 보여줍니다.

 

 

 

 

 

1. Known Plugins

  - 알려진 모든 플러그인을 보여줍니다.

 

2. Plugin List for Current Script

  - 현 스크립트에 적용되어 있는 플러그인을 보여줍니다.

  플러그인에 나열되는 순서는 이들이 실행되는 순서이며, 리스트에 있는 플러그인을 여러개 복사할 수 있고,

  각 복사본마다 서로 다른 파라미터를 지정할 수 있습니다.

 

3. Add Plugin

  - 선택된 플러그인의 새로운 인트턴스를 현 스크립트에 추가힙니다.

 

4. Remove Plugin

  - Plug-in List For Current Script 에 선택되어 있는 플러그인을 삭제합니다.

 

5. See Description

  - Plug-in List For Current Script 에 선택되어 있는 플러그인에 대한 설명서를 불러냅니다.

 

6. Edit Plugin

  - Plug-in List For Current Script 에 선택되어 있는 플러그인에 대한 편집창을 불러냅니다.

 

7. Move Up

  - Plug-in List For Current Script 에 선택되어 있는 플러그인을 한단계 위로 올립니다.

 

8. Move Down

  - Plug-in List For Current Script 에 선택되어 있는 플러그인을 한단계 아래로 내립니다.

 

 

 

 

◈  플러그인 설명

 - 해당 플러그인을 더블 클릭하거나 Edit Plugin 을 클릭하면 플러그인의 옵션창이 불러와집니다. 

 

[ Scene Graph Optimization ]

 - 메모리 오버헤드와 트래버스 시간을 줄이기 위해 Scene Graph를 Optimization(최적화)합니다.

  이 플러그인에서 최적화 할 수 있는 옵션은 매우 많으며, 스킨 파티션과 NiBoneLODController가 올바르게

  생성되려면 이 플러그인을 반드시 실행 시켜야 합니다. 

 

 

1. Remove duplicate properties

  - Scene(씬)에서 중복되는 모든 속성을 공유하게 됩니다. 기본적으로 체크되어야 하는 옵션입니다.

 

2. Remove bad NiTexturing properties

  - 씬에서 이미지 데이터가 없는 NiTecturingProperty 속성과 존재하지 않는 텍스처 좌표를 사용하는 NiTecturingProperty속성을

   제거합니다.

   3ds max와 gamebryo 3ds max Plug-in간에 발생 할 수 있는 몇몇의 필요없는 상황을 정리 하므로 기본적으로 체크되어야

   하는 옵션입니다.

 

3. Remove multi-material nodes

  - 씬에서 multi-material 노드를 모두 지웁니다. 이들은 대개 필요 없으므로 지워도 됩니다.

 

4. Remove childless nodes

  - 씬에서 자식이 없는 노드를 모두 삭제합니다.

  gamebryo는 씬그래프의 말단(leaf)노드만 렌더링 합니다. NiNode에는 가시적 지오메트리가 없으며 그에 따라 렌더링과도

  관련이 없습니다 따라서 어플리케이션이 특별히 나중에 사용할 목적으로 보관해두지 않는 한 자식이 없는 노드는 전혀

  쓸모가 없습니다. 이 함수는 오브젝트의 오버헤드를 줄이기 위해 씬에서 자식도 없고 쓰이지도 않는 모든 NiNode를 지웁니다.

  단, 노드를 그대로 두고 싶다면 반드시 3ds max 유저 지성속성(User Difined)에 "NiOptimizeKeep"라는 태그를 달아놓아야

  합니다.(대소문자 틀리면 적용 안됨)

 

5. Remove single-child nodes

  - 씬에서 자식을 하나만 두고 있는 노드의 속성과 변환과 이름을 그 자식에게 전달하고 이 노드는 삭제해버립니다.

  자식에 "NiOptimizeKeep" 태그가 달려있는 경우엔 이름이 전달되지 않습니다.

 

6. Merge sibling nodes

  - 씬의 형제 노드를 통합합니다. '두 노드가 정확히 NiNode 타입의 형제 노드이며, 이 두 노드에 NiNode 타입의 부모가 있으며

  똑같은 속성과 똑같은 visibility flag가 어태치 되어 있다' 라는 조건이 맞으면 이 두 노드는 통합 됩니다.

  두 노드가 합쳐질 수 있고 서로 다른 변환을 지니면, 두 노드의 변환은 이들이 합쳐지기 전에 자식들에게 물려집니다.

 

7. Merge sibling NiTrishape objects

  - 씬의 모든 형제 NiTriShape 객체를 통합합니다.

  ' 두 NiTriShape 객체에게 정확히 NiNode 타입인 공통의 부모가 있고 보유한 속성의 수가 같으며, 속성 포인터가 같고

  텍스처 세트 수도 같다. 또한 타임 컨트롤러가 어태치 되어 있지 않고, NiTGeometryData 포인터가 서로 다르며 AppCulled

  플래그 값이 같다. 두 NiTriShape 모두 버텍스, 노멀, 텍스처, 컬러를 갖거나 갖지 않는다 '

  라는 조건이 맞으면 이 두 NiTriShape을 합칠 수 있습니다.

  두 NiTriShape 중 어느 하나에라도 별도의 데이터가 어태치 되어 있으면 이 둘은 통합되지 않을 것입니다.

 

8. Do not merge alpha-blended NiTriShape objects

  - 이 옵션을 체크하면 알파 블렌딩이나 sorter가 작동될 경우 NiAlphaProperty가 어태치된 노드들 사이에선 통합이 일어나지

  않습니다.

 

9. Optimize NiTriShape objects

  - degenerate triangle을 삭제하고 씬에 있는 모든 NitriShape의 버텍스를 축약시키는데, 이 객체들의 삼각형이 모두

  degenerate되어 있는 경우라면 그 객체들을 지워버립니다.

 

10. Remove extra texture coordinate sets

  - 씬의 지오메트리에서 현재의 노드나 상위 노드에 어태치된 NiTexturingProperty가 사용하지 않는 모든 텍스처 좌표 세트를

  삭제합니다.

 

11. Remove unnecessary normals

  - 필요없는 노멀을 재귀적으로 삭제합니다. 라이트가 없는 씬에서는 노멀을 삭제하지 않습니다.

 

12. Remove unnecessary NiVisControllers

  - 씬에서 NiVisController의 키들이 모두 같은 visibility data를 가지고 있으면 그런 NiVisController를 모두 삭제하고

  타깃의 visibility flag를 업데이트 합니다.

 

13. Remove unnecessary NiLookAtControllers

  - NiLookAtController의 타깃이나 "Look At"에, 또는 씬 그래프에서 이들 위에 NiKeyframeController가 없으면 씬에서

  NiLookAtController를 삭제합니다.

 

14. Remove hidden bone geometry

  - 한 본의 자식이면서 AppCulled 플래그인 true인 NiGeometry를 씬에서 삭제합니다.

 

○ 게임을 실행 시키기 위해 노드가 필요한 경우에는 'Remove childless nodes' 'Remove single-child nodes'

  'Merge sibling nodes' 'Merge sibling NiTrishape objects' 의 체크를 해제합니다.

 

 

 

 

 

1. Reduce animation keys

  - 씬에서 NiKeyframeController의 중복된 애니메이션 키를 줄입니다.]

 

  "Tolerance"설정은 키가 여전히 중복되는 것으로 여겨지려면 이 키가 키의 양쪽에서 이루어지는 두 키 사이의 보간에서부터

  얼마나 멀리까지 있어도 되는지의 비율을 지정하는 곳입니다.

 

2. Remove unnecessary extra data

  - ectra data string이 비어있거나, 이 문자열에 임시적인 컨버전 목적으로 쓰이는 문자열만 들어 있는 경우 이를 삭제합니다.

 

  Remove "NiOptimizeKeep"tags 옵션을 체크하면 문자열 "NiOptimizeKeep"와 "sgokeep"이 들어있는 extra data객체도

  삭제됩니다.

 

 

 

 

 

1. Sory children of each node by NiTexturingProperty

  - 각 노드의 자식을 속성 상태에 나와 있는 NiTexturingProperty의 어드레스에 따라 Sorting(소팅)합니다.

  속성 상태에 NiTexturingProperty 객체가 없는 자식들이 먼저 Sorting 됩니다.

  - 이 함수는 렌더링의 능률을 높이는 데에 다소 도움이 됩니다. 그러나 씬 그래프 구조를 유지해야 하는 제약으로 인해

  최적화 될 수 있는 방식도 제한됩니다.

 

2. Remove all Object Names

  - 씬의 모든 오브젝트와 메터리얼 속성에서 이름 문자열을 삭제합니다.

  - 이 함수는 어플리케이션이 이름을 필요로 하지 않는 경우를 위해 제공됩니다. 이름을 삭제하면 메모리 오버헤드를 조금

  줄일 수 있으나 같은 오브젝트의 이름이 있어야만 하는 클래스에선 문제를 일으킬 수 있으므로 이름이 필요없다고 확신되는

  경우에만 이름을 삭제 하기 바랍니다.

 

3. Name all unnamed objects

  - 씬에서 이름이 없는 오브젝트에 고유한 이름을 달아줍니다.

  - 오브젝트들이 이름 없이 익스토프 되지 않게 해줍니다. 즉, 모든 오브텍트에 이름이 있어야 하는 경우에 사용합니다.

 

4. Skin and Bones Support

  - 이 옵션은 각 플랫폼에 대해 어떤 타입의 스키닝 정보를 익스포트 할지를 지정합니다.

  하드웨어(Hardware) 스키닝 정보를 익스포트할지 , 소프트웨어(Software) 스키닝 정보를 익스포트 할지 , 또는 둘다(Both)

  익스포트할지를 고를 수 있습니다.

  - 하드웨어 스키닝 정보만으로 익스포트 된 데이터세트는 하드웨어 스키닝을 지원하지 않는 그래픽 하드웨어에선 실행되지

  않을 것입니다.

  하드웨어와 소프트웨어 스키닝 정보 모두를 가지고 익스포트 된 데이터 세트는 실행될 때 하드웨어 가속 상태

  (hardware accelerated)가 되나 하드웨어 스키닝을 지원하지 않는 그래픽 하드웨어에서도 여전히 구동될 수 있습니다.

  - 스킨 파티션 당 bone의 갯수도 지정 할 수 있습니다.

 

5. Weld hardware skin partitions

  - 스키닝된 모델에서 crack(균열)을 없앱니다.

  - 하드웨어 가속 스키닝을 사용할 때 활성적일 수 있는 본의 개수가 제한되어 있기 때문에 하드웨어 가속 스키닝에 쓰이는

  데이터 구조를 만들 땐 본과 버텍스 간의 상호작용을 무시해야 할 수 밖에 없게 됩니다.

  이렇게 되면 만일 한 본의 영향이 어떤 삼각형에서는 무시되나 다른 오브젝트의 인접한 삼각형에서는 무시되지 않을 경우

  서로 다른 게임브리오 오브젝트의 삼각형들이 공유하는 가장자리에 크랙(균열)이 생길 수 있는데  welding code는 이런 균열이

  생긴 가장자리를 찾아내서 제거합니다.

  이 welding이 일어나려면 두 오브젝트의 월드 변환이 동일해야 합니다.

 

 

◈ 이외에 여러가지 플러그인이 존재하며, 필요한 부분만 체크해서 적용시키는게 좋습니다.

반응형
Posted by blueasa
, |
옵션 재정리 작업중. 

convert : 카메라와 라이트를 익스포트 시킬 것인가 결정. 
체크를 꺼 놔도 3개의 라이트는 기본적으로 넘어가는데, 나머지는 프로그래머 몫.
디폴트 라이트 2 개는 없앨 수 없고, Ambient 라이트만 없앨 수 있다. 이것은 렌더링/ 인바이론먼트 에서 색상만 없애주면 된다. 

차이는 이렇다는 것이다. 눌러서 보셈. 

Texture
- 메인 NIF에 맵이 포함된다. 
- 맵으로 따로 NIF 를 생성한다.  
- 맵이 따로 링크로만 유지된다. 단 관리는 겜브리오에서 관리된다. 중간 관리가 실행되므로 약간 느려진다.
- 맵이 따로 링크로만 유지된다. 관리도 겜브리오에서 하지 않는다. 직접 연결해서. 지원되지 않는 포맷도 쓸 수 있게 해준다.

NPOT Texture
- 2의 배수가 아닌 텍스쳐도 넘길 수 있다. 옵션이 꺼지면 엔진에서 알아서 가까운 2의 배수로 텍스쳐 크기를 조정해 준다. 
그렇게 되면 밉맵이 생기지 않는다고 한다. (이것은 확인 불가)

Animation
APP 타임 - 어플리케이션의 타임을 이용할 것이냐의 문제 타이밍을 엔진에서 컨트롤 할 것이냐 맥스에서 컨트롤 할 것이냐를 결정하는 것으로, 인터페이스 등에서 사용될때 다르게 쓰일 수 있다. 프로그래머에게 의존할 것. 

Use existing Biped keyframes instead of sampled keyframes
바이패드 키의 익스포트 옵션. 키가 있을때만 넘길꺼냐 전부 셈플링 할거냐의 옵션 . 꺼놓으면 전부 셈플링 한다. 이것은 TCB 컨트롤러를 엔진에서 이용하지 않기 때문이다. 그러므로 옵션을 켜면 성능은 증가하는데 동작은 허접해질 수 있음.

Skin Weight Threshold %
기본으로 놔둬도 좋음. 5% 미만의 웨이트 값을 가진 버텍스는 웨이트가 삭제됨 


Export Selected
기본 인스포트에서 문제가 될 수 있는게, 카메라 옵션을 제거해도 카메라 타겟은 넘어간다는것.
그러므로 셀렉티드를 이용하면, 카메라 타겟도 넘어가지 않게 할 수 있다.

Use Original Script Templates If Available
맥스 파일에 있는 스크립트와 컴퓨터에 있는 익스포트 스크립트가 다를 때 , 맥스 파일에 저장된 것을 무시하고 원래 것으로 스크립트를 돌립니다.

익스포트 스크립트
3ds Max Art Pipeline 

Process Scripts:

  • Default Process Script – 이 스크립트는 Create ABV, Optimization, Stripification plug-in들을 디폴트 파라미터로 실행시킵니다.
  • Scene Graph Optimizations Only – 이 스크립트는 SceneGraph Optimization plug-in을 디폴트 설정으로 실행시킵니다.

Viewer Scripts:

  • Default DX Viewer Script – 이 스크립트는 Gamebryo UtilityViewer Selection 롤아웃의 DX Viewer 버튼에 의해 사용됩니다.
  • Default KFM Viewer Script - 이 스크립트는 Gamebryo UtilityViewer Selection 롤아웃의 KFM Viewer 버튼에 의해 사용됩니다.
  • Default SceneImmerse Viewer Script - 이 스크립트는 Gamebryo UtilityViewer Selection 롤아웃의 Scene Viewer 버튼에 의해 사용됩니다. 


Export Scripts

  • Default Export Script – 이 스크립트는 한 개의 NIF 파일을 익스포트 합니다.
  • Multiple KF Export With NIF Script – 이 스크립트는 한 개의 NIF 파일과, Controller Extractor plug-in이 찾은 애니메이션에 따라 여러 개의 KF 파일을 익스포트 합니다.
  • Multiple KF Export Without NIF Script – 이 스크립트는 Controller Extractor plug-in이 찾은 애니메이션에 따라 여러 개의 KF 파일을 익스포트 하고, NIF 파일은 익스포트 하지 않습니다.
  • Single KF Export With NIF Script – 이 스크립트는 NIF 파일 한 개와, Controller Extractor plug-in이 찾은 애니메이션의 합성 KF 파일 한 개를 익스포트 합니다.
  • Single KF Export Without NIF Script – 이 스크립트는 Controller Extractor plug-in이 찾은 애니메이션의 합성 KF 파일 한 개를 익스포트 하고, NIF 파일은 익스포트 하지 않습니다.


일단 이건 몰라도 큰일 없음. 
게임에 따라 변할 것이기 땜에. 

Platform:

게임의 플렛폼을 정할 수 있음. Generic은 모든 게임에 공용될 수 있으나 느리다. 
되도록이면 타겟에 맞추도록 하자. 

Image File Subdirectory
텍스쳐가 따로 NIF 로 저장될 때, 폴더를 정할 수 있음. 

Default Content Quality
텍스쳐 퀄리티를 바꿀 수 있음. 

Override Per-Texture Settings: default content quality 옵션을 사용할 때, Gamebryo Shader에서 텍스처 포맷 타입에 대해 설정된 옵션은 디폴트로 오버라이드 되지 않을 것입니다따라서 이런 설정을 오버라이드 하고 싶은 경우엔 이 박스를 체크해야 합니다.: 아마도 맥스내에서 셋팅한 무엇이 제대로 넘어가지 않을때 사용하면 되지 않을까나. 


반응형
Posted by blueasa
, |

짜증나는 워닝과 에러 중에헤더파일 순서에 따라 발생하는 워닝/에러가 있습니다특히 링크타임에 나는 에러는 네이밍 모양새가 재밌게 생겨먹지 않은 스타일로 생기는 데다가 링커가 별로 힌트를 주지 않아서 짜증이 나기도 합니다예를 들면 아래와 같은 겁니다.

 

1>Generating Code...

1>Compiling resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Compiling manifest to resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Linking...

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)

 

위 예는 MFC프로젝트에서 모든 파일에서 MFC 헤더를 다른 헤더 보다 먼저 선언해야 하는데(대부분 stdafx.h를 가장 상위에 선언합니다.),  MFC 프로젝트에서 사용하던 파일을 Import 하고 컴파일 하는 순간 발생했습니다.

 

이런 에러의 경우 대처법은 의외로 간단 합니다일단 똑똑고 기억력 좋으신 분들은 자기가 했던 행위들의 콜스택을 하나하나 거슬러 올라가시면서 대처 하는법이 있고이게 가장 비용대비 시간단축 효가가 가장 좋습니다.

 

순간 욱해서 콜스택 거슬러 올라가기 힘드신 (저 같은;;)분들은 아래처럼 대처 하시면 됩니다먼저 링커 옵션에 아래 옵션을 추가 합니다.

 

/verbose:lib

 

 

 

그리고 다시 빌드 하면 링킹타임에 library를 스캔하는 리스트가 아래와 같이 output창에 나오게 됩니다.

 

1>Generating Code...

1>Compiling resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Compiling manifest to resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Linking...

1>Searching libraries

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\DelayImp.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\uuid.lib:

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\LIBCMTD.lib:

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\OLDNAMES.lib:

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\uafxcwd.lib:

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\kernel32.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\user32.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\gdi32.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\uuid.lib:

 

윗 예에서 uafxcwd.lib를 링크 할 때링크에러가 났고에러를 유발한 유력한 용의자는 uuid.lib입니다왜냐면계속 다른 애들은 디폴트 경로에서 링크되는데 uuid.lib만 sdk 에서 링크 되었고, MFC에서 new를 재정의 하기 때문에이전에 new가 정의되어 있는 파일이 링크되면 안됩니다여기서 “stdafx.h”파일을 추가 하는 것을 잊었구나 하는 생각이 듭니다.

 

/verbose 옵션을 써보지 않으신 분들은 한번 넣고 컴파일을 해보시면 쓰잘떼기 없는 정보까지 주르륵 나와서 놀라실 껍니다. 여러가지 링킹 타임에 하는 작업 정보를 자세히 알려주는 것을 알 수 있습니다. 윗예의 :lib처럼 뒷부분에 세부 옵션을 붙여 보기 좋게 정보를 추출하는 작업이 익숙해 지면 일반적인 컴파일시 정보를 잘 제공해주지 않는 링킹 타임시 발생하는 에러에 정보를 얻어 디버깅 작업 시간을 단축 시킬 수 있습니다.


출처 : http://blog.naver.com/drvoss/20064150564

반응형
Posted by blueasa
, |

/VERBOSE:LIB

 

이 옵션을 걸어주면 어떤 lib에서 라이브러리 충돌이 생기는지 알 수 있다

 

라이브러리 충돌은 라이브러리를 만들때 crt lib를 포함해서 (mtd,mt) 컴파일 하였다면

라이브러리를 사용하는 응용프로그램 또한 crt lib를 포함해서 컴파일 해야한다.

 

반대로 lib를 만들때 (mdd,md) 공유 라이브러리를 이용해 컴파일 했다면 응용프로그램에서도

그렇게 해야한다.



출처 : http://blog.naver.com/herok3/100047421303

반응형
Posted by blueasa
, |

1. API에서 참조하는 library의 순서를 확일 할수 있는 명령

 

.net -> 속성 -> linker -> 명령줄 -> 추가 옵션

/verbose:lib


반응형
Posted by blueasa
, |

예외 처리 ~~ tip

Tip & Tech / 2011. 2. 8. 17:11

예외 처리라 하면.. try{} catch(...){} 등을 사용하여 코딩을 하는게

보통이다.

 

하지만.. release 컴파일시 error로 프로그램이 죽어버리게 되면 catch등을 통하지 않고

종료되어. 버그 리포팅을 하기가 힘든데

 

이럴때를 지원해주기 위한 window API 함수를 알아본다.

 

step1 : 프로그램이 죽어버를 경우 무조건 호출될 callback함수를 하나 만든다.

LONG WINAPI  ExceptionCallStack (struct _EXCEPTION_POINTERS *exceptionInfo);

 

step 2 : 예외 처리 핸들러 생성

LPTOP_LEVEL_EXCEPTION_FILTER PrevExceptionFilter = NULL;

 

 

int APIENTRY _tWinMain(..... )

{

 

 // 콜스택 기록용 예외 콜백 함수 등록
 PrevExceptionFilter = SetUnhandledExceptionFilter(ExceptionCallStack);

Run();

 

// 콜스택 기록용 예외 콜백 함수 등록 해제
 SetUnhandledExceptionFilter(PrevExceptionFilter);

 

}

 

=> Thingking

........... ExceptionCallStack 함수에 miniDump나 콜스택 과련 debug코드를 내포하여 release를 배포하면

차후 생각지 못한 버그가 발생했을경우 리포팅이 가능해진다.

[출처] 예외 처리 ~~ tip|작성자 모냐

반응형
Posted by blueasa
, |

무기잔상효과

Gamebryo/Lecture / 2011. 2. 8. 17:05

무기의 잔상효과를 구현하기위해서는 실시간으로 무기가 움직이는 월드상에

폴리곤을 만들어주고 텍스쳐 uv또한 실시간으로 할당해 주어야한다.

또한, 낮은 프레임에서도 부드러운 형태로 폴리곤을 만드려면 셈플링하는 무기의

위치에 대하여 보간처리를 해야한다.


여기서는 동적으로 폴리곤을 생성하고 사용될 텍스쳐의 uv를 결정해주는 방법을 살펴보도록 한다.
스플라인 보간처리부분은 직접 해보세요.
 

무기에 필요한 정보

무기의 잔상효과가 적용될 시작지점과 끝점에 더미를 추가하도록한다.

더미이름은 *point1,*point2라고 칭한다.

 

※ 구현 순서

1. 더미이름으로 각 더미노드 포인터를 찾아 저장해놓는다.

2. 매 프레임마다 더미노드의 변경된 좌표에 대하여 폴리곤을 생성한다.

3. 정해진 출력시간을 초과하면 해당 정보를 리스트에서 제거한다.
4. 일정 비율로 시간이 지남에따라 폴리곤 크기를 줄여준다.
5. 생성된 폴리곤에 대하여 텍스쳐 uv를 할당한다.
 

struct AIPoint

    {

        float       m_fStartTime; // 폴리곤을 생성할 때 현재 시간을 저장한다.

        NiPoint3    m_kPoint[2];  // 생성될때 더미노드 월드좌표를 저장한다.

};

 

    typedef std::vector<AIPoint>    VAIPOINT;

    typedef VAIPOINT::iterator      VAIPOINT_ITER;

VAIPOINT        m_vAIPointList;        // 더미노드 리스트                                  

NiTriShapePtr   m_spAIGeometry;        // 동적으로 만들어진 지오메트리

    NiAVObject*     m_pkPointNode[2];      // 잔상이 적용될 노드포인터

    float           m_fLifeTime;           // 폴리곤이 출력되는 시간

 

매 프레임마다 더미의 월드좌표와 시간정보를 리스트에 추가한다.
   실제 제작시에는 변화가있을때만 추가해야할 것이다. 또는 특정 애니메이션에서만 추가되도록 작성해야한다.
    AIPoint r_kAIPoint;

    r_kAIPoint.m_fStartTime = p_fTime;

    r_kAIPoint.m_kPoint[0]  = m_pkPointNode[0]->GetWorldTranslate();

    r_kAIPoint.m_kPoint[1]  = m_pkPointNode[1]->GetWorldTranslate();

    m_vAIPointList.push_back( r_kAIPoint );

 

※ 매프레임마다 *point2더미 위치를 *point1 더미위치방향으로 줄어들게 한다.

또한 출력시간이 지났다면 해당 AIPoint 객체를 리스트에서 제거하도록 한다.

if( m_vAIPointList.empty() )
        return;
    VAIPOINT_ITER r_iter;

    for( r_iter = m_vAIPointList.begin(); r_iter != m_vAIPointList.end(); )

    {

        float r_fElapsedTime = p_fTime - r_iter->m_fStartTime;

        if( r_fElapsedTime > m_fLifeTime )

        {

            r_iter = m_vAIPointList.erase( r_iter );

        }

        else

        {

            NiPoint3 r_kDirVec =
                     ( r_iter->m_kPoint[0] - r_iter->m_kPoint[1] );

            float r_fLength = r_kDirVec.Length();

            if ( r_fLength > 0.0f )

            {

                NiPoint3::UnitizeVector( r_kDirVec );

                float fAmount = r_fLength / ( m_fLifeTime * 10.0f );

r_kDirVec *= fAmount;

                r_iter->m_kPoint[1] += r_kDirVec;

            }

            ++r_iter;

        }

    }

 

주어진 리스트를 이용하여 동적으로 폴리곤과 uv좌표정보를 갱신한다.

unsigned short  r_usAIPointCount = m_vAIPointList.size();
    // 최소한 3개이상이어야 정상적인 메쉬를 만들 수 있다

    if ( r_usAIPointCount <= 2 )
        return;
   
unsigned short  r_usVertices     = r_usAIPointCount * 2;

    unsigned short  r_usTriangles    = ( r_usAIPointCount - 1 ) * 2;

    unsigned short* r_pusTriList     = NULL;

    NiPoint3*       r_pkVerts        = NiNew NiPoint3[ r_usVertices ];

    NiPoint2*       r_pkTexture      = NiNew NiPoint2[ r_usVertices ];

 

    if ( r_usTriangles )

    {

        r_pusTriList = (unsigned short*)NiMalloc(

            sizeof(unsigned short) * ( 3 * r_usTriangles ) );

    }

 

    for( int r_i = 0; r_i < r_usAIPointCount; ++r_i )

    {

        int r_nNum = r_i * 2;

 

        r_pkVerts[r_nNum]     = m_vAIPointList[r_i].m_kPoint[0];

        r_pkVerts[r_nNum + 1] = m_vAIPointList[r_i].m_kPoint[1];

 

        if( 0 == r_i )

        {

            r_pkTexture[0] = NiPoint2( 0.0f, 0.0f );

            r_pkTexture[1] = NiPoint2( 1.0f, 0.0f );

        }

        else

        {

            float r_uv = (float)( r_i ) / (float)( r_usAIPointCount - 1 );

            r_pkTexture[r_nNum]     = NiPoint2( 0.0f, r_uv );

            r_pkTexture[r_nNum + 1] = NiPoint2( 1.0f, r_uv );

 

            int r_nIndex  = ( r_i - 1 ) * 6;

            int r_nFactor = ( r_i - 1 ) * 2;

 

            r_pusTriList[r_nIndex + 0] = 0 + r_nFactor;

            r_pusTriList[r_nIndex + 1] = 1 + r_nFactor;

            r_pusTriList[r_nIndex + 2] = 2 + r_nFactor;

            r_pusTriList[r_nIndex + 3] = 2 + r_nFactor;

            r_pusTriList[r_nIndex + 4] = 1 + r_nFactor;

            r_pusTriList[r_nIndex + 5] = 3 + r_nFactor;

        }

    }

 

    NiGeometryData* r_pkGeomData = m_spAIGeometry->GetModelData();

    NiTriShapeData* r_pkTriShape = (NiTriShapeData*)r_pkGeomData;

   

    r_pkGeomData->Replace(

        r_usVertices,

        r_pkVerts,

        0,                                  // Normal

        0,                                  // Color

        r_pkTexture,

        1,                                  // TextureSets

        NiGeometryData::NBT_METHOD_NONE );  // Normal Binormal Tangent Method

 

    r_pkTriShape->Replace( r_usTriangles, r_pusTriList );

 

    r_pkGeomData->MarkAsChanged (

            NiGeometryData::VERTEX_MASK |

            NiGeometryData::TEXTURE_MASK |

            NiTriBasedGeomData::TRIANGLE_INDEX_MASK |

            NiTriBasedGeomData::TRIANGLE_COUNT_MASK );

 

    // Perform initial update.

    m_spAIGeometry->Update(0.0f);

    m_spAIGeometry->UpdateProperties();

    m_spAIGeometry->UpdateEffects();

    m_spAIGeometry->UpdateNodeBound();

 

 

-> URL : http://clodymade.tistory.com/entry/무기잔상효과

반응형

'Gamebryo > Lecture' 카테고리의 다른 글

게임브리오 2D Line관련  (0) 2011.10.30
FrameRenderSystem에서.. 커스텀알파소터프로세스..  (0) 2011.09.18
캐릭터 기울기 연산  (0) 2011.02.08
Gamebryo 셋팅  (1) 2011.01.06
게임브리오 강좌(?) 링크  (3) 2010.04.14
Posted by blueasa
, |
필요한 경우는 아래와 같다.
1. 2족 캐릭터가 지형의 경사면에서 죽는 애니메이션.
2. 4족 이상 동물의 지형 경사면 이동.


일단 캐릭터가 서있는 지형에대한 노멀벡터를 알아야한다.
자신의 위치에서 바닥으로 피킹을 해서 얻으면 된다.
캐릭터의 크기가 바닥 그리드에 비해 크다면 캐릭터의 크기에 맞게 삼각형 형태의
3정점에서 피킹을하여 얻어지는 평면의 노멀값을 계산하여 사용하도록 하자.

1. 현재 캐릭터 위치에서 지형으로 피킹을 한다.
2. 피킹으로 얻어진 노멀 벡터와 Z축 벡터를 이용하여 회전행렬을 구한다.
3. 캐릭터의 회전값에 적용한다.


ex)
// 원래 벡터 srcVec, 변환후 벡터 destVec, 회전축 벡터 axisVec
// axisVec = srcVec x destVec                                               // 회전축 벡터
// angle = acos( srcVec * destVec / |srcVec| |destVec| )       // 회전각


// m_spCharRootNode 캐릭터 루트 노드
// m_kPickNormal 현재 위치에대한 노멀 벡터
NiMatrix3 r_kRot;
NiPoint3 r_kAxis = m_kPickNormal.Cross( NiPoint3(0.0f, 0.0f, 1.0f) );
float r_fDot = m_kPickNormal.Dot( NiPoint3(0.0f, 0.0f, 1.0f) );
float r_fRadian = NiACos( r_fDot );
r_kRot.MakeRotation( r_fRadian, r_kAxis );
m_spCharRootNode->SetRotate( r_kRot );


주의사항 : 루트노드를 카메라 회전및 기타 다른용도에
사용되고 있다면 위 코드는 정상적으로 구현되지 않을 수 있습니다.
이럴 경우 노멀벡터값을 루트노드회전행렬과 곱한값을 사용하면 해결 될 수 있습니다.
 
반응형

'Gamebryo > Lecture' 카테고리의 다른 글

FrameRenderSystem에서.. 커스텀알파소터프로세스..  (0) 2011.09.18
무기잔상효과  (0) 2011.02.08
Gamebryo 셋팅  (1) 2011.01.06
게임브리오 강좌(?) 링크  (3) 2010.04.14
Gamebryo 2.5  (0) 2010.04.12
Posted by blueasa
, |