본문 바로가기

Cocos2d-x v3.17/고급 기능

[Cocos2d-x 고급기능]지형 Terrain

반응형


    지형

    지형인 Terrain 3D게임에서 중요합니다.

    지형은 높이맵과 여러가지 세부 텍스처를 읽어와서 씬에서 렌더링할때 높이가 다른 기하도형을 그려주고 게임 장면중에 사막이나 초원같은 경치를 표현할때 사용되어집니다.

    지형의 리소스구성 측면에서 보면 아래의 몇가지 원소가 포함되어있습니다.

     

    높이맵

    높이맵은 하나의 그림입니다.

    하지만 그림에서 하나의 픽셀의 색상값이 색상으로 사용되지 않고 높이값으로 사용됩니다.

    Terrain개체는 높이맵을 통하여 높이정보를 알수있고 전체 그리드의 구조를 생성하기 위해서 크기를 조절할수 있습니다.

     

    디테일맵

    높이맵은 지형의 기하구조를 결정하고 디테일맵은 지형의 외관을 결정합니다.

    디테일맵 텍스처 이미지를 지형위에 붙이면 좋은 효과를 얻을수 있습니다.

    최대 4개의 텍스처  사용하여 지형에 덮어씌울수 있습니다.

     

    알파 텍스처

    알파 텍스처는 외관 텍스처 이미지가 지형 어디에 어떻게 렌더링되는지 결정합니다.

    알파 텍스처도 하나의 그림입니다.

    하지만 그림에서 R,G,B,A값은 네장의 외관 텍스처 이미지를 지형의 어떤 위치에 놓을건지,디테일맵 이미지의 생성비율은 몇인지 결정합니다.

    이런 방식으로 우린 지형위에 모래사구,돌길,풀숲  텍스처를 여러곳에 보여주고 지형이 단조롭지 않게 할수 있습니다.

     

    Level of Detail(LOD)

     

    Terrain LOD기법을 사용하여 카메라의 거리에 따라서 다르게 그려줍니다.

    가까이 있는곳의 지형은 메쉬를 촘촘하게 하여 퀄리티를 높이고 멀리있는건 간단하게 그려도 되기떄문에 메쉬를 단조롭게 합니다.

    이것은 렌더링할 삼각형의 갯수를 감소시켜서 성능을 높여줍니다.

    Terrain::setLODDistance(float lod1,float lod2,float lod3)매서드를 사용하여 카메라와의 거리에 따라 설정할수 있습니다.

    LOD 경계지역에 있는 지형은 균열이 있어서 Terrain개체는 두종류(SKIRT,INCREASE_LOWER) 방식을 사용하여 이런상황을 해결하였습니다.


    C++

    Terrain::CrackFixedType::SKIRT

    Terrain::CrackFixedType::INCREASE_LOWER

    Terrain::CrackFixedType::SKIRT :블록의  모서리에 4개의 스커트 메쉬 생성.

    Terrain::CrackFixedType::INCREASE_LOWER :색인을 동적으로 조정하여 원활하게 연결되도록 합니다.

     

    지형 생성

    아래 코드에선 어떻게 지형을 생성하는지 보여주고 그위에 캐릭터도 놓았습니다.

    C++

    auto player = Sprite3D::create("chapter9/orc.c3b");

    player->setScale(0.08);

    player->setPositionY(terrain->getHeight(player->getPositionX(),player->getPositionZ()));

    •  Terrain::DetailMap 개체로 디테일맵을 생성합니다.

    C++

    Terrain::DetailMap r("dirt.dds");

    Terrain::DetailMap g("grass.dds");

    Terrain::DetailMap b("road.dds");

    Terrain::DetailMap a("greenSkin.jpg");

    •  Terrain::TerrainData 개체를 생성하기 위해선 첫번째 매개변수로 높이맵의 경로,두번째는 알파맵의 경로,그다음 네개는 위에서 구성한 디테일맵 구조체를 사용합니다.

    C++

    Terrain::TerrainData data("chapter9/heightmap16.jpg","TerrainTest/alphamap.png", r, g, b, a);

    •  Terrain::create  사용하여 지형을 생성합니다.첫번째 매개변수는 위에서 만든 TerrainData객체이빈다.두번째 매개변수는 LOD방법입니다.
    • C++

    _terrain = Terrain::create(data, Terrain::CrackFixedType::SKIRT);

     

    • 주의해야 할점은,지형개체가 addChild()메서드를 사용하여 추가된 이후에는 지형개체에 대한 변경은 할수 없습니다.예를들면 스케일연산같은것 말이에요.아니면 지형은 예측하기 어려운 결과를 낳게 됩니다.


    지형의 높이를 얻어오기

    Terrain::getHeight(float x, float z, Vec3 * normal= nullptr) 메서드를 사용하면 지형의 높이를 얻어올수 있습니다.

    당신이 하나의 객체를 지형위에 높고싶을때 이방법은 굉장히 유용하게 사용할수 있습니다.

     

    출처: <http://cocos2d-x.org/docs/cocos2d-x/zh/3d/terrain.html>

     



반응형