gpt4 book ai didi

c++ - 我在这里误用了模板吗?

转载 作者:太空狗 更新时间:2023-10-29 20:28:35 25 4
gpt4 key购买 nike

我正在尝试为 Mesh 类进行通用编程。 (我需要 CPU 转换来使网格变形,这就是为什么这不是要在 GPU 中完成的原因,以防你想问)

A Mesh<T>包含 3d 形状的顶点,以及面部连接(哪些顶点连接在一起形成三角形)。

在这里T是顶点的类型,有些类型的模型有PNCT类型(position, normal, color, texcoord),有些只是PC(position, color)。

struct VertexPNCT {
Vector3 pos, normal ;
Vector4 color ;
Vector2 tex ;
} ;

struct VertexPC {
Vector3 pos ;
Vector4 color ;
} ;

当然,所有顶点都有一个位置!

但这是我的问题。

Mesh<T>必须实现 transform方法。当然,每个顶点格式都有一个位置,如果它的命名一致( .pos ),那么该方法就可以正常工作:

因为每个顶点肯定会有一个位置,如果我总是称那个成员为.posVertex*结构,然后我可以添加一个方法 .transform到模板类 Mesh<T>作为:

void transform( Matrix4& mat )
{
each vertex
vertex.pos = mat * vertex.pos ; // transform it
}

现在搞砸了。 如果顶点格式中有法线,则该法线也必须进行转换(通过“法线矩阵”)。现在我的模板中有一个“if 语句”?我必须写一个模板特化.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
}
}

* 假设转换没有尺度(那么你不需要使用“普通矩阵”)

最佳答案

如果您可以编写 Vertex 的层次结构,其中 base 只包含位置(和 .pos 成员),则 VertexWNormal 包含.normal 然后其余部分从那里继承,然后您可以只添加非模板重载并让编译器处理:

void transform( Matrix4& m, VertexBase& v ) {
// transform only pos
}
void transform( Matrix4& m, VertexWNormal& v ) {
transform(m,static_cast<VertexBase&>(v));
// transform normal here
}
void tranform( Matrix4& m ) {
foreach vertex:
transform(m,vertex);
}

当然,这对您的设计是否有意义取决于很多您没有展示的东西,这很难说。

关于c++ - 我在这里误用了模板吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12714132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com