엔터티 당 단일 유형의 한 구성 요소를 손상시키지 않고 엔터티 당 여러 메시를 사용하려면 어떻게해야합니까?


11

계층 기반 게임 엔진에서 컴포넌트 기반 게임 엔진으로 전환하고 있습니다. 내 문제는 메쉬 계층 구조가있는 모델을로드 할 때 이해하는 방식은 구성 요소 기반 시스템의 엔티티가 동일한 유형의 여러 구성 요소를 가질 수 없지만 각 구성 요소에 대해 "meshComponent"가 필요하다는 것입니다 모델의 메쉬. 그래서이 문제를 어떻게 해결할 수 있습니까?

이 사이트에서 그들은 컴포넌트 기반 게임 엔진을 구현했습니다 : http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/


나는 이것이 너무 현지화되어 있다고 생각합니다.
jcora

4
나는 일반적인 질문이라고 생각합니다. 게임 오브젝트가 동일한 컴포넌트의 여러 인스턴스를 가질 수 있습니까?
Mathias Hölzl

네, 한 수 가 그렇게 요구 한 경우,이었다. 나에게 그는 매우 특정한 문제에 대한 답을 찾고있는 것처럼 보입니다.
jcora

4
"... 구성 요소 기반 시스템의 엔티티는 동일한 유형의 여러 구성 요소를 가질 수 없습니다 ..."-왜 그렇지 않습니까?
Den

나는 그것이 너무 현지화되지 않았다고 생각합니다. 예를 들어 UE3에서는 SkeletalMeshActor하나만 있습니다 SkeletalMeshComponent. 여러 가지 방법으로 해결할 수있는 일반적인 문제입니다.
sam hocevar

답변:


13

직위 구성 요소에는 "부모 / 자녀"논리가있을 수 있습니다. 직위가있는 모든 엔티티에는 상위가있을 수 있으며 해당 직위는 상위에 상대적입니다. 동일한 엔터티에 여러 개의 메시를 두는 대신 각각 고유 한 메시를 사용하여 둘 이상의 엔터티를 만들어 서로 연결할 수 있습니다. 하위 엔터티가 상위 이벤트 (또는 엔터티 간 통신을위한 모든 시스템)를 수신하고 그에 따라 반응하도록 할 수도 있습니다.


그래서 나는 엔티티의 계층 구조를 가지고 있으며 이러한 엔티티는 componends를 가지고 있으며 사기꾼과 연결되어 있습니다. 그것은 여전히 ​​컴포넌트 기반 게임 엔진인가요? =)
Mathias

@ MathiasHölzl 그 질문입니까? 이러한 종류의 계층 구조는 OOP의 문제 계층 구조와 동일하지 않습니다. 이것은 단지 그래픽 계층 구조이며, 어린이 엔티티는 부모로부터 기능을 상속받지 못하고 문제를 일으 킵니다. 메쉬 목록을 가지고 문제에 대한 Asakeron의 대답을 볼 수 있습니다. 문제가 어떻게되는지 모르겠습니다. 어쩌면 나는 당신의 질문을 이해하지 못합니까?
Luke B.

-1 이것이 실제로 진행되는지 확실하지 않습니다. 메시 계층 구조를 처리하는 구성 요소가 필요한 경우 메시 계층 구조가 포함 된 구성 요소가없는 이유 ModelComponent는 무엇입니까? 이를 위해 엔티티를 분할하면 문제에 대한 잘못된 해결책처럼 들립니다. Asakeron 및 Byte56의 답변을 참조하십시오.
Laurent Couvidou

@LaurentCouvidou 나는 하나 이상의 엔티티를 사용하는 것이 왜 잘못되는지 알지 못합니다. 나에게 좋은 해결책 인 것 같습니다. 메쉬 목록을 사용하는 대신 다른 대안을 제시하고 싶었지만 메쉬 목록도 좋은 솔루션이라는 데 동의합니다.
Luke B.

@LukeB. 이 메쉬 그룹은 AI, 사운드, 물리학에 의존하는 구성 요소를 사용하여 하나의 개체에 전체적으로 대응할 수 있기 때문입니다. 이렇게하면 장면 그래프와 모든 단점이 생깁니다.
Laurent Couvidou

8

meshComponent는 메쉬 목록을 포함 할 수 있습니다. 엔진을 어떻게 구현하고 있는지 잘 모르겠지만 시스템은 모든 메시를 쉽게 반복하고 간단히 그릴 수 있습니다.


1
메쉬는 또한 변환, 물리, 그래픽과 같은 구성 요소를 가지고 있습니다.
Mathias

1
메시는 엔티티입니까? 아니면 모든 것이 구성 요소입니까? 내가 보는 방식, 변형, 물리 및 그래픽은 메시가 아닌 엔티티의 구성 요소 여야합니다. 메시는 정점에 대한 설명 일뿐입니다.
Luke B.

1
예, 컴포넌트 여야하지만 컴포넌트는 컴포넌트를 가질 수 없으므로 모델의 계층 구조를 구현하기가 어렵습니다.
Mathias Hölzl

1
더 나은 답변을 얻으려면 엔진 제작 방법에 대한 자세한 정보를 제공해야한다고 생각합니다. 엔터티 구성 요소 시스템은 여러 가지 방법으로 구현할 수 있습니다 . 자세한 내용은 Kylotan의 답변 을 확인하십시오 .
Asakeron

4

메쉬 객체 목록으로 메쉬 구성 요소를 만듭니다. 각 메시 오브젝트에는 오프셋과 함께 메시 데이터가 있습니다. 드로잉 할 때 드로잉 시스템은 위치 컴포넌트에서 위치를 가져온 다음 메시 컴포넌트의 각 메시를 위치 + 오프셋에서 그립니다.

엔티티마다 단일 메시 컴포넌트로 말하면서 메시 컴포넌트 내에 여러 메시를 가질 수 있습니다.


1

TLDR : 컴포넌트 를 여러 메시로 구성하여 시작합니다.

메쉬 / 재료 쌍과 엔티티 자체 사이에 다른 수준의 간접 지향이 필요하다는 점에서 Asakeron / Byte56 / Laurent에 동의합니다. GraphicsComponent를 정점 및 재질로 보는 대신 최종 래스터에서 픽셀의 한 방울로 생각하십시오. 구현 세부 정보가 있고 더 이상 아무것도 없습니다.

나는 이것을 프로젝트에 대해 많이 생각했고 최적의 솔루션은 GraphicsComponent를 훨씬 더 높은 수준의 구성 요소로 만드는 것입니다.이 기능은 선택 사항이 아니기 때문에 전통적인 'Model'객체의 많은 기능을 포함합니다! 이러한 폴리곤을 버퍼 데이터와 그 이상으로 렌더링하려면 다음과 같은 셰이더가 필요합니다.

  • 언급 한 위치
  • 스키닝 / 애니메이션 데이터
  • 현재 패스 (예 : 두 패스 알파를 사용하는 경우)
  • 섀도우 캐스팅 정보 (작업중인 경우)
  • 자료 업데이트 방법 및시기 에 대한 정보
  • 컬링 기능

파티클 시스템, 빌보드 등을 고려하지 않고 3D 자산에만 적용됩니다. 그러나 모든 것은 그래픽 / 렌더링 코드에만 해당됩니다. 물리, 사운드 또는 스크립팅에는 영향을 미치지 않으므로 그래픽스 / 렌더링 컴포넌트

나는 결국 :

Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore     //This is the 'game object' - it is passed to the GraphicsController
    ModelComponent : GraphicsComponent                      //This is the actual graphics component, used by the GraphicsController in the context of the game object.
        ModelComponentPart : GraphicsComponent              //This is also a graphics component
            Mesh                                        //These are implementation details
            Material
        ModelComponentPart : GraphicsComponent
            Mesh
            Material
    Skeleton
    Animations

이것에서 :

  • 모델은 그래픽 구성 요소가있는 모든 게임 자산입니다.

  • ModelComponent는 기존 모델과 유사하며 실제로 3D 자산과 동일합니다. GraphicsComponent 컨트롤러 (Model-View-Controller 패턴을 사용하는 경우)는 어떤 유형의 그래픽 자산인지 파악하고 올바르게 그립니다 (ModelComponent는 GraphicsComponent의 서브 클래스 임).

각 GraphicsComponent도 엔터티이며 Entity는 위치 데이터를 직접 저장하므로 한 곳에서만 계산되지만 아이디어는 동일 합니다 .GraphicsComponent는 모델러가 제공하는 것만이 아니라 필요한 모든 것을 항목을 그릴 필요가있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.