나는 Mesh 클래스를 위해 일반적으로 프로그래밍하려고했다. 뿐만 아니라,여기에 템플릿을 잘못 사용한 적이 있습니까?
이 Mesh<T>
는 3D 모양의 정점을 포함 (나는 경우에 당신은 질문을 생각하고,이 은 GPU에서 수행 할이 아닌 이유입니다, 메쉬를 변형 CPU 변환이 필요합니다) (꼭지점이 합쳐져서 삼각형을 만들 때) 얼굴을 맞춘다.
여기서 T
은 꼭지점의 유형이며, 일부 유형의 모델에는 PNCT 유형 (위치, 표준, 색상, 텍 스코드)이 있고 다른 것은 PC (위치, 색상)입니다.
struct VertexPNCT {
Vector3 pos, normal ;
Vector4 color ;
Vector2 tex ;
} ;
struct VertexPC {
Vector3 pos ;
Vector4 color ;
} ;
, 모든 정점 위치를 가지고!
하지만 여기 내 문제가 있습니다.
Mesh<T>
은 transform
메서드를 구현해야합니다. 그 방법은 잘 작동, (.pos
를) 물론, 모든 정점 포맷이 위치를 가지고 있으며,이 지속적으로 이름 않다면 :
난 항상 Vertex*
구조체에 해당 멤버 .pos
를 호출하는 경우 모든 정점 확실히, 위치를 가질 것이기 때문에,
void transform(Matrix4& mat)
{
each vertex
vertex.pos = mat * vertex.pos ; // transform it
}
지금 여기 나사이야 : 그때로 템플릿 클래스 Mesh<T>
에 방법 .transform
를 추가 할 수 있습니다. 정점 형식에 일반 형식이있는 경우 해당 법선을 "일반 매트릭스"로 변형해야합니다. 이제 템플릿에 "if 문"이 생깁니 까? 각각의 버텍스 유형 (기본적으로 2 개의 카테고리, 법선이있는 클래스 및 법선이없는 클래스)으로 템플릿 전문화 .transform
메소드를 작성해야합니까?
여기 템플릿을 잘못 사용한 적이 있습니까? "프로그래밍 보트"를 놓친 건가요? 여기
정말 논리적으로 수행 할 작업은 다음과 같습니다void transform(Matrix4& mat)
{
each vertex in vertices
{
vertex.pos = mat * vertex.pos ; // transform it
#ifdef vertex.normal
vertex.normal = mat * vertex.normal ; // transform normal as well*
#endif
}
}
* 변환 (당신이 "정상적인 매트릭스"를 사용할 필요가 없습니다)에는 규모 아마
'Matrix4'의 유형은 무엇입니까? 어떤 클래스가'transform' 함수를 보유하고 있습니까 (아니면 자유 함수입니까?) 'vertex'의 타입은 무엇입니까? 모든 질문과 그 이상의 내용이 솔루션에 영향을 미칩니다. 실제 문제에 대해 더 많이 보여줘야합니다. –
나는 그를 올바르게 이해한다면 변형은'메쉬 '클래스에 있다고 생각한다. – CrazyCasta
런타임에 올바른 방법을 선택해야합니다. 또는 정적으로 바인딩 할 수 있습니까? 당신은 아마 정적으로 할 수 있습니다, 당신은 정상적인 매트릭스에 대한 추가 매개 변수를 추가해야합니까? – imreal