- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试为 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
),那么该方法就可以正常工作:
因为每个顶点肯定会有一个位置,如果我总是称那个成员为.pos
在Vertex*
结构,然后我可以添加一个方法 .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/
在考虑如何将 tkinter Frame 和 LabelFrame 子类化以便它们位于正确的父级上时,我发现很多答案表明 super() .__init__ 在子类化时优于 BaseClass.__i
我正在编写一些实用程序,我想将它们作为函数调用。它们是通过往往不会改变的上下文和一些数据来调用的。需要对上下文进行大量耗时的处理,但是一旦完成,用它来暴露数据就相当轻量了。 这显然可以很好地映射到以下
嗨,我正在尝试找到 - 字符,然后将最左边的字符放入字符串中。在这里,我希望 FUPOPER 存储在 program_id_DB 中,但是当我运行此代码时,我的输出结果为: Character '-'
我正在尝试使用 SQL 和 PHP 创建一个登录系统。我有一个包含三个字段的标准数据库:用户名、密码和授权级别。由于某种原因,当我测试代码时,即使我使用正确的访问级别和正确的凭据,登录也会失败。在我将
我对 if 和 else 语句有疑问。 我写了下面的脚本: def questionscp(): stateanswer = raw_input('Do you want to change
我正在编写一个程序来从文件中读取数据,该文件可能采用多种格式之一(实际上是同一格式的不同版本),并且我正在使用反射为每种格式调用适当的函数。假设文件格式是在文件的第一个字节指定的数字: Class D
我花了一整天时间阅读 Fielding's famous dissertation on REST .它在 Conclusion 上说部分: REST, a novel architectural s
我正在做一些非常简单的事情,只是为了习惯 Swift(来自 objc)——我想通过使用 guard 返回链表中的所需节点。声明和 switch陈述。我显然滥用了 guard声明因为我的else子句很大
我使用的是 Visual Studio 2008 并编译了以下代码。 代码1: int* pI = new int[3]; delete pI; 代码2: int* pJ = new int[3];
我是一名优秀的程序员,十分优秀!