본문 바로가기
공부

[C++/DX11] 3D 가위바위보

by MY블로그 2023. 5. 21.

Shader & Mesh 로 만든 xml 파일을 이용하여 가위바위보 하는 애니매이션을 만들었습니다.

만들어야하는 부분

  1. 간단한 3D형태의 손 (관절은 마음대로 만들어보기) 2개(Player & Com)
  2. 조건에따라 애니매이션 변경하기(가위,바위,보)
  3. 4개의뷰 (정면,위쪽,좌측,오른쪽) CAM

 

 

우선 손모양의 xml 파일이 필요하므로 기본적인 xml파일에 shader & mesh 파일을 넣었습니다.

작성한 xml파일은 아래의 접은글에 참조합니다. (관절의 이름을 짧고간단하게 대충지어버렸습니다.)

더보기

 

<Root Name="Hand" Visible="true" ObType="1">
    <Mesh File="1.Sphere.mesh"/>
    <Shader File="1.Cube.hlsl"/>
    <Transform>
        <Position X="0" Y="0" Z="0"/>
        <Scale X="2" Y="2" Z="1"/>
        <Rotation X="0" Y="0" Z="0"/>
    </Transform>
    <Children Size="5"/>
    <Child0 Name="FB1" Visible="true" ObType="0">
        <Mesh File="1.Point.mesh"/>
        <Shader File="0.Cube.hlsl"/>
        <Transform>
            <Position X="0.625" Y="0" Z="0"/>
            <Scale X="1" Y="0.69999999" Z="1"/>
            <Rotation X="0" Y="0" Z="0"/>
        </Transform>
        <Children Size="2"/>
        <Child0 Name="F1" Visible="true" ObType="0">
            <Mesh File="1.Sphere.mesh"/>
            <Shader File="1.Cube.hlsl"/>
            <Transform>
                <Position X="0.25" Y="0" Z="0"/>
                <Scale X="0.75" Y="0.5" Z="0.5"/>
                <Rotation X="0" Y="0" Z="0"/>
            </Transform>
            <Children Size="0"/>
        </Child0>
        <Child1 Name="FB11" Visible="true" ObType="0">
            <Mesh File="1.Point.mesh"/>
            <Shader File="0.Cube.hlsl"/>
            <Transform>
                <Position X="1" Y="0" Z="0"/>
                <Scale X="1" Y="1" Z="1"/>
                <Rotation X="0" Y="0" Z="0"/>
            </Transform>
            <Children Size="1"/>
            <Child0 Name="F11" Visible="true" ObType="0">
                <Mesh File="1.Sphere.mesh"/>
                <Shader File="1.Cube.hlsl"/>
                <Transform>
                    <Position X="0.125" Y="0" Z="0"/>
                    <Scale X="0.60000002" Y="0.40000001" Z="0.5"/>
                    <Rotation X="0" Y="0" Z="0"/>
                </Transform>
                <Children Size="0"/>
            </Child0>
        </Child1>
    </Child0>
    <Child1 Name="FB2" Visible="true" ObType="0">
        <Mesh File="1.Point.mesh"/>
        <Shader File="0.Cube.hlsl"/>
        <Transform>
            <Position X="0.75" Y="0.60000002" Z="0"/>
            <Scale X="0.30000001" Y="0.5" Z="0.5"/>
            <Rotation X="0" Y="0" Z="0"/>
        </Transform>
        <Children Size="1"/>
        <Child0 Name="F2" Visible="true" ObType="0">
            <Mesh File="1.Sphere.mesh"/>
            <Shader File="1.Cube.hlsl"/>
            <Transform>
                <Position X="0" Y="1" Z="0"/>
                <Scale X="1" Y="1.5" Z="1"/>
                <Rotation X="0" Y="0" Z="0"/>
            </Transform>
            <Children Size="1"/>
            <Child0 Name="FB22" Visible="true" ObType="0">
                <Mesh File="1.Point.mesh"/>
                <Shader File="0.Cube.hlsl"/>
                <Transform>
                    <Position X="0" Y="0.66666663" Z="0"/>
                    <Scale X="1" Y="1" Z="1"/>
                    <Rotation X="0" Y="0" Z="0"/>
                </Transform>
                <Children Size="1"/>
                <Child0 Name="F22" Visible="true" ObType="0">
                    <Mesh File="1.Sphere.mesh"/>
                    <Shader File="1.Cube.hlsl"/>
                    <Transform>
                        <Position X="0" Y="0.66666663" Z="0"/>
                        <Scale X="1" Y="1.5" Z="1"/>
                        <Rotation X="0" Y="0" Z="0"/>
                    </Transform>
                    <Children Size="0"/>
                </Child0>
            </Child0>
        </Child0>
    </Child1>
    <Child2 Name="FB3" Visible="true" ObType="0">
        <Mesh File="1.Point.mesh"/>
        <Shader File="0.Cube.hlsl"/>
        <Transform>
            <Position X="0.2" Y="0.60000002" Z="0"/>
            <Scale X="0.30000001" Y="0.5" Z="0.5"/>
            <Rotation X="0" Y="0" Z="0"/>
        </Transform>
        <Children Size="1"/>
        <Child0 Name="F3" Visible="true" ObType="0">
            <Mesh File="1.Sphere.mesh"/>
            <Shader File="1.Cube.hlsl"/>
            <Transform>
                <Position X="0" Y="1" Z="0"/>
                <Scale X="1" Y="1.5" Z="1"/>
                <Rotation X="0" Y="0" Z="0"/>
            </Transform>
            <Children Size="1"/>
            <Child0 Name="FB33" Visible="true" ObType="0">
                <Mesh File="1.Point.mesh"/>
                <Shader File="0.Cube.hlsl"/>
                <Transform>
                    <Position X="0" Y="0.66666663" Z="0"/>
                    <Scale X="1" Y="1" Z="1"/>
                    <Rotation X="0" Y="0" Z="0"/>
                </Transform>
                <Children Size="1"/>
                <Child0 Name="F33" Visible="true" ObType="0">
                    <Mesh File="1.Sphere.mesh"/>
                    <Shader File="1.Cube.hlsl"/>
                    <Transform>
                        <Position X="0" Y="0.66666663" Z="0"/>
                        <Scale X="1" Y="1.5" Z="1"/>
                        <Rotation X="0" Y="0" Z="0"/>
                    </Transform>
                    <Children Size="0"/>
                </Child0>
            </Child0>
        </Child0>
    </Child2>
    <Child3 Name="FB4" Visible="true" ObType="0">
        <Mesh File="1.Point.mesh"/>
        <Shader File="0.Cube.hlsl"/>
        <Transform>
            <Position X="-0.34999999" Y="0.60000002" Z="0"/>
            <Scale X="0.30000001" Y="0.5" Z="0.5"/>
            <Rotation X="0" Y="0" Z="0"/>
        </Transform>
        <Children Size="1"/>
        <Child0 Name="F4" Visible="true" ObType="0">
            <Mesh File="1.Sphere.mesh"/>
            <Shader File="1.Cube.hlsl"/>
            <Transform>
                <Position X="0" Y="1" Z="0"/>
                <Scale X="1" Y="1.5" Z="1"/>
                <Rotation X="0" Y="0" Z="0"/>
            </Transform>
            <Children Size="1"/>
            <Child0 Name="FB44" Visible="true" ObType="0">
                <Mesh File="1.Point.mesh"/>
                <Shader File="0.Cube.hlsl"/>
                <Transform>
                    <Position X="0" Y="0.66666663" Z="0"/>
                    <Scale X="1" Y="1" Z="1"/>
                    <Rotation X="0" Y="0" Z="0"/>
                </Transform>
                <Children Size="1"/>
                <Child0 Name="F44" Visible="true" ObType="0">
                    <Mesh File="1.Sphere.mesh"/>
                    <Shader File="1.Cube.hlsl"/>
                    <Transform>
                        <Position X="0" Y="0.66666663" Z="0"/>
                        <Scale X="1" Y="1.5" Z="1"/>
                        <Rotation X="0" Y="0" Z="0"/>
                    </Transform>
                    <Children Size="0"/>
                </Child0>
            </Child0>
        </Child0>
    </Child3>
    <Child4 Name="FB5" Visible="true" ObType="0">
        <Mesh File="1.Point.mesh"/>
        <Shader File="0.Cube.hlsl"/>
        <Transform>
            <Position X="-0.875" Y="0.375" Z="0"/>
            <Scale X="0.30000001" Y="0.5" Z="0.5"/>
            <Rotation X="0" Y="0" Z="0"/>
        </Transform>
        <Children Size="1"/>
        <Child0 Name="F5" Visible="true" ObType="0">
            <Mesh File="1.Sphere.mesh"/>
            <Shader File="1.Cube.hlsl"/>
            <Transform>
                <Position X="0" Y="1" Z="0"/>
                <Scale X="1" Y="1.5" Z="1"/>
                <Rotation X="0" Y="0" Z="0"/>
            </Transform>
            <Children Size="1"/>
            <Child0 Name="FB55" Visible="true" ObType="0">
                <Mesh File="1.Point.mesh"/>
                <Shader File="1.Cube.hlsl"/>
                <Transform>
                    <Position X="0" Y="0.66666663" Z="0"/>
                    <Scale X="1" Y="1" Z="1"/>
                    <Rotation X="0" Y="0" Z="0"/>
                </Transform>
                <Children Size="1"/>
                <Child0 Name="F55" Visible="true" ObType="0">
                    <Mesh File="1.Sphere.mesh"/>
                    <Shader File="1.Cube.hlsl"/>
                    <Transform>
                        <Position X="0" Y="0.66666663" Z="0"/>
                        <Scale X="1" Y="1.5" Z="1"/>
                        <Rotation X="0" Y="0" Z="0"/>
                    </Transform>
                    <Children Size="0"/>
                </Child0>
            </Child0>
        </Child0>
    </Child4>
</Root>

디버깅 & imGui 창을 이용하여 세세한 위치들을 조절하였습니다.

대략적인 손모양을 만들고 해당 xml 파일을 불러오고 관리하도록 Actor 필터에 Hand 클래스를 생성합니다.

해당클래스는 기존에 제작했던 클래스와 크게 다르지않은 구조로 생성합니다.

단, 가위 바위 보 의 3가지의 상태를 구분하기위해서 enum class 를 이용하였습니다.

예전 2D에서 사용하던 방식과 동일합니다.

위처럼 상태를 나누고

해당 상태에 불러올 함수를 만들었습니다.

각각의 함수는 cpp에서 정의하고 Update()  함수에서 상태를 switch 문으로 변경시켜주도록 하였습니다.

각각의 함수의 내부에는 xml 파일의 각관절에대한 움직임을 코드로 구현하여둡니다.

주의 할점은 각 관절에대한 조건은 각도의 조건을 만든다면 TORADIAN 메크로를 사용하여야 원활히 작동합니다.

다만 상태의 변경운 클래스 내부가아닌 main 에서 변경합니다.

 

클래스를 생성하고 조건을 만들고나면 main에서 플레이어의 입력조건에따라 해당 클래스의 상태가 변경되도록 하였습니다. 간결하게 키패드를 사용하여 변경이 가능하며 별다른 예외처리는 하지 않았습니다.

여기서 상대(COM)은 직접 변경할 것이 아니기 때문에 RANDOM 엔진을 사용하여 변경하도록 하였습니다.

 

마지막으로 카메라는 주의할 것이 많았습니다.

main 에서 생성할떄 for문을이용하여 한번에 생성 할당 하려했으나 오류로 인하여 계속 터졌습니다.

반복문을 사용하지않고 4개의 카메라를 각각생성하여

카메라의 위치를 저장한 4개의 xml 파일을 로드 시켜주었습니다.

 

또한 프로그램 종료시 각각의 카메라의 위치는 종료시점에 저장되도록 마무리 하였습니다.

댓글